161847f8eSopenharmony_ci/* 261847f8eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 361847f8eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 461847f8eSopenharmony_ci * you may not use this file except in compliance with the License. 561847f8eSopenharmony_ci * You may obtain a copy of the License at 661847f8eSopenharmony_ci * 761847f8eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 861847f8eSopenharmony_ci * 961847f8eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1061847f8eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1161847f8eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1261847f8eSopenharmony_ci * See the License for the specific language governing permissions and 1361847f8eSopenharmony_ci * limitations under the License. 1461847f8eSopenharmony_ci */ 1561847f8eSopenharmony_ci 1661847f8eSopenharmony_ciconst path = require('path'); 1761847f8eSopenharmony_ciconst fs = require('fs'); 1861847f8eSopenharmony_ciconst ts = require('typescript'); 1961847f8eSopenharmony_ciconst ExcelJS = require('exceljs'); 2061847f8eSopenharmony_ciconst compressing = require('compressing'); 2161847f8eSopenharmony_ciconst { readFile, getSubsystemBySyscap, getApiInfoWithFlag, getApiInfoDeleteDtsPath } = require('./util'); 2261847f8eSopenharmony_ciconst { parse } = require('./collect_base_api'); 2361847f8eSopenharmony_ciconst { allMergeData } = require('./format_data'); 2461847f8eSopenharmony_cilet methodType = ''; 2561847f8eSopenharmony_ci 2661847f8eSopenharmony_cifunction getSubsystemJson(jsonDir) { 2761847f8eSopenharmony_ci let fileContent = fs.readFileSync(jsonDir, 'utf-8'); 2861847f8eSopenharmony_ci let subsystems = JSON.parse(fileContent); 2961847f8eSopenharmony_ci const subsystemMap = new Map(); 3061847f8eSopenharmony_ci const fileNameMap = new Map(); 3161847f8eSopenharmony_ci subsystems.forEach(element => { 3261847f8eSopenharmony_ci subsystemMap.set(element.syscap, element.subsystem); 3361847f8eSopenharmony_ci fileNameMap.set(element.syscap, element.fileName); 3461847f8eSopenharmony_ci }); 3561847f8eSopenharmony_ci return { subsystemMap, fileNameMap }; 3661847f8eSopenharmony_ci} 3761847f8eSopenharmony_ci 3861847f8eSopenharmony_ci// 对比新旧版本文件列表 3961847f8eSopenharmony_cifunction compileFiles(newFiles, oldFiles) { 4061847f8eSopenharmony_ci const newFileNames = []; 4161847f8eSopenharmony_ci const oldFileNames = []; 4261847f8eSopenharmony_ci newFiles.forEach(file => { 4361847f8eSopenharmony_ci const fileName = path.basename(file).replace(/.d.ts$/g, '.ts'); 4461847f8eSopenharmony_ci newFileNames.push(fileName); 4561847f8eSopenharmony_ci }); 4661847f8eSopenharmony_ci oldFiles.forEach(file => { 4761847f8eSopenharmony_ci const fileName = path.basename(file).replace(/.d.ts$/g, '.ts'); 4861847f8eSopenharmony_ci oldFileNames.push(fileName); 4961847f8eSopenharmony_ci }); 5061847f8eSopenharmony_ci 5161847f8eSopenharmony_ci //保存有差异的信息 5261847f8eSopenharmony_ci const compileApiInfos = []; 5361847f8eSopenharmony_ci // 旧版本不存在新版本中的文件,表示新增 5461847f8eSopenharmony_ci newFileNames.forEach(fileName => { 5561847f8eSopenharmony_ci let index = oldFileNames.indexOf(fileName); 5661847f8eSopenharmony_ci if (index < 0) { 5761847f8eSopenharmony_ci compileApiInfos.push({ 5861847f8eSopenharmony_ci flag: '新版本新增', 5961847f8eSopenharmony_ci fileName: fileName, 6061847f8eSopenharmony_ci filePath: newFiles[newFileNames.indexOf(fileName)], 6161847f8eSopenharmony_ci }); 6261847f8eSopenharmony_ci } 6361847f8eSopenharmony_ci }); 6461847f8eSopenharmony_ci // 新版本不在在旧版本中的文件,表示删除 6561847f8eSopenharmony_ci oldFileNames.forEach(fileName => { 6661847f8eSopenharmony_ci let index = newFileNames.indexOf(fileName); 6761847f8eSopenharmony_ci if (index < 0) { 6861847f8eSopenharmony_ci compileApiInfos.push({ 6961847f8eSopenharmony_ci flag: '新版本删除', 7061847f8eSopenharmony_ci fileName: fileName, 7161847f8eSopenharmony_ci filePath: oldFiles[oldFileNames.indexOf(fileName)], 7261847f8eSopenharmony_ci }); 7361847f8eSopenharmony_ci } 7461847f8eSopenharmony_ci }); 7561847f8eSopenharmony_ci 7661847f8eSopenharmony_ci return compileApiInfos; 7761847f8eSopenharmony_ci} 7861847f8eSopenharmony_ci 7961847f8eSopenharmony_ci// 根据文件列表获取api信息数组 8061847f8eSopenharmony_cifunction getFilesApi(files) { 8161847f8eSopenharmony_ci const fileContentList = []; 8261847f8eSopenharmony_ci files.forEach(file => { 8361847f8eSopenharmony_ci let fileContent = fs.readFileSync(file, 'utf-8'); 8461847f8eSopenharmony_ci fileContentList.push({ 8561847f8eSopenharmony_ci fileName: path.basename(file).replace(/.d.ts$/g, '.ts'), 8661847f8eSopenharmony_ci fileContent: fileContent, 8761847f8eSopenharmony_ci fileRoot: file, 8861847f8eSopenharmony_ci }); 8961847f8eSopenharmony_ci 9061847f8eSopenharmony_ci }); 9161847f8eSopenharmony_ci const api = parse(fileContentList); 9261847f8eSopenharmony_ci return api; 9361847f8eSopenharmony_ci} 9461847f8eSopenharmony_ci 9561847f8eSopenharmony_cifunction getDIffApisWithCompile(newFiles, oldFiles) { 9661847f8eSopenharmony_ci const newFilesApi = getFilesApi(newFiles); 9761847f8eSopenharmony_ci const oldFilesApi = getFilesApi(oldFiles); 9861847f8eSopenharmony_ci // 去掉dtspath后的 9961847f8eSopenharmony_ci const tmpNewApis = []; 10061847f8eSopenharmony_ci newFilesApi.forEach(newApi => { 10161847f8eSopenharmony_ci tmpNewApis.push(JSON.stringify(getApiInfoDeleteDtsPath(newApi))); 10261847f8eSopenharmony_ci }); 10361847f8eSopenharmony_ci const tmpOldApis = []; 10461847f8eSopenharmony_ci oldFilesApi.forEach(oldApi => { 10561847f8eSopenharmony_ci tmpOldApis.push(JSON.stringify(getApiInfoDeleteDtsPath(oldApi))); 10661847f8eSopenharmony_ci }); 10761847f8eSopenharmony_ci 10861847f8eSopenharmony_ci let hasFunTypeNewApis = []; 10961847f8eSopenharmony_ci let hasFunTypeOldApis = []; 11061847f8eSopenharmony_ci hasFunTypeNewApis = deleteRepeatApi(tmpOldApis, tmpNewApis, newFilesApi, oldFilesApi).newDiffApiArr; 11161847f8eSopenharmony_ci hasFunTypeOldApis = deleteRepeatApi(tmpOldApis, tmpNewApis, newFilesApi, oldFilesApi).oldDiffApiArr; 11261847f8eSopenharmony_ci 11361847f8eSopenharmony_ci let newDiffApis = []; 11461847f8eSopenharmony_ci let oldDiffApis = []; 11561847f8eSopenharmony_ci newDiffApis = collectSameTypeFun(hasFunTypeNewApis); 11661847f8eSopenharmony_ci oldDiffApis = collectSameTypeFun(hasFunTypeOldApis); 11761847f8eSopenharmony_ci const subsystemMap = getSubsystemJson(subsystemDir).subsystemMap; 11861847f8eSopenharmony_ci const fileNameMap = getSubsystemJson(subsystemDir).fileNameMap; 11961847f8eSopenharmony_ci const diffApis = []; 12061847f8eSopenharmony_ci getDiffApisBaseNew(newDiffApis, oldDiffApis, diffApis, subsystemMap, fileNameMap); 12161847f8eSopenharmony_ci getDiffApisBaseOld(newDiffApis, oldDiffApis, diffApis, subsystemMap, fileNameMap); 12261847f8eSopenharmony_ci return diffApis; 12361847f8eSopenharmony_ci} 12461847f8eSopenharmony_ci 12561847f8eSopenharmony_cifunction deleteRepeatApi(oldApis, newApis, newFilesApi, oldFilesApi) { 12661847f8eSopenharmony_ci let newDiffApiArr = []; 12761847f8eSopenharmony_ci let oldDiffApiArr = []; 12861847f8eSopenharmony_ci for (let i = 0; i < newApis.length; i++) { 12961847f8eSopenharmony_ci const newApi = newApis[i]; 13061847f8eSopenharmony_ci let index = oldApis.indexOf(newApi); 13161847f8eSopenharmony_ci if (index < 0) { 13261847f8eSopenharmony_ci let includeTypeApi = addMethodType(newFilesApi[i]); 13361847f8eSopenharmony_ci newDiffApiArr.push(includeTypeApi); 13461847f8eSopenharmony_ci } 13561847f8eSopenharmony_ci } 13661847f8eSopenharmony_ci 13761847f8eSopenharmony_ci for (let i = 0; i < oldApis.length; i++) { 13861847f8eSopenharmony_ci const oldApi = oldApis[i]; 13961847f8eSopenharmony_ci let index = newApis.indexOf(oldApi); 14061847f8eSopenharmony_ci if (index < 0) { 14161847f8eSopenharmony_ci let includeTypeApi = addMethodType(oldFilesApi[i]); 14261847f8eSopenharmony_ci oldDiffApiArr.push(includeTypeApi); 14361847f8eSopenharmony_ci } 14461847f8eSopenharmony_ci } 14561847f8eSopenharmony_ci return { newDiffApiArr, oldDiffApiArr }; 14661847f8eSopenharmony_ci} 14761847f8eSopenharmony_ci 14861847f8eSopenharmony_cifunction collectSameTypeFun(apiArr) { 14961847f8eSopenharmony_ci apiArr.forEach(api => { 15061847f8eSopenharmony_ci let sameNameFun = ''; 15161847f8eSopenharmony_ci // 标记既不是Promise也不是callback的同名函数 15261847f8eSopenharmony_ci let number = 0; 15361847f8eSopenharmony_ci let sameNamePromiseText = ''; 15461847f8eSopenharmony_ci apiArr.forEach(newApi => { 15561847f8eSopenharmony_ci if (api.dtsPath.replace(newDir, '') === newApi.dtsPath.replace(newDir, '') && api.className === newApi.className && 15661847f8eSopenharmony_ci api.methodName === newApi.methodName && api.apiType === 'Method' && api.funType === newApi.funType) { 15761847f8eSopenharmony_ci if (sameNameFun.indexOf(newApi.methodText) < 0 && api.funType === 'callback') { 15861847f8eSopenharmony_ci sameNameFun += `\n${newApi.methodText}`; 15961847f8eSopenharmony_ci api.callbackMethodText = sameNameFun; 16061847f8eSopenharmony_ci } else if (sameNamePromiseText.indexOf(newApi.methodText) < 0 && api.funType === 'Promise') { 16161847f8eSopenharmony_ci sameNamePromiseText += `\n${newApi.methodText}`; 16261847f8eSopenharmony_ci api.promiseMethodText = sameNamePromiseText; 16361847f8eSopenharmony_ci } else if (!api.funType) { 16461847f8eSopenharmony_ci number++; 16561847f8eSopenharmony_ci api.note = number; 16661847f8eSopenharmony_ci } 16761847f8eSopenharmony_ci } 16861847f8eSopenharmony_ci }); 16961847f8eSopenharmony_ci }); 17061847f8eSopenharmony_ci return apiArr; 17161847f8eSopenharmony_ci} 17261847f8eSopenharmony_ci 17361847f8eSopenharmony_cifunction addMethodType(baseApi) { 17461847f8eSopenharmony_ci let methodContent = `interface test{ 17561847f8eSopenharmony_ci ${baseApi.methodText} 17661847f8eSopenharmony_ci }`; 17761847f8eSopenharmony_ci getMethodType(methodContent, filterType); 17861847f8eSopenharmony_ci if (methodType === 'callback' || methodType === 'Promise') { 17961847f8eSopenharmony_ci baseApi.funType = methodType; 18061847f8eSopenharmony_ci } 18161847f8eSopenharmony_ci return baseApi; 18261847f8eSopenharmony_ci} 18361847f8eSopenharmony_ci 18461847f8eSopenharmony_cifunction getMethodType(content, callback) { 18561847f8eSopenharmony_ci ts.transpileModule(content, { 18661847f8eSopenharmony_ci compilerOptions: { 18761847f8eSopenharmony_ci 'target': ts.ScriptTarget.ES2017, 18861847f8eSopenharmony_ci }, 18961847f8eSopenharmony_ci fileName: 'index.ets', 19061847f8eSopenharmony_ci transformers: { before: [callback()] }, 19161847f8eSopenharmony_ci }); 19261847f8eSopenharmony_ci} 19361847f8eSopenharmony_ci 19461847f8eSopenharmony_cifunction filterType() { 19561847f8eSopenharmony_ci return (context) => { 19661847f8eSopenharmony_ci methodType = ''; 19761847f8eSopenharmony_ci return (node) => { 19861847f8eSopenharmony_ci getType(node); 19961847f8eSopenharmony_ci return node; 20061847f8eSopenharmony_ci }; 20161847f8eSopenharmony_ci function getType(node) { 20261847f8eSopenharmony_ci // add function type(callback or Promise) 20361847f8eSopenharmony_ci if (ts.isFunctionDeclaration(node) || ts.isMethodSignature(node)) { 20461847f8eSopenharmony_ci getFunType(node); 20561847f8eSopenharmony_ci } 20661847f8eSopenharmony_ci return ts.visitEachChild(node, getType, context); 20761847f8eSopenharmony_ci } 20861847f8eSopenharmony_ci }; 20961847f8eSopenharmony_ci} 21061847f8eSopenharmony_ci 21161847f8eSopenharmony_cifunction getFunType(node) { 21261847f8eSopenharmony_ci if (node.type && ts.isTypeReferenceNode(node.type)) { 21361847f8eSopenharmony_ci methodType = node.type.typeName.escapedText; 21461847f8eSopenharmony_ci } else if (node.parameters.length > 0) { 21561847f8eSopenharmony_ci const parameter = node.parameters[node.parameters.length - 1]; 21661847f8eSopenharmony_ci if (parameter.name.escapedText === 'callback') { 21761847f8eSopenharmony_ci methodType = parameter.name.escapedText; 21861847f8eSopenharmony_ci } 21961847f8eSopenharmony_ci } else { 22061847f8eSopenharmony_ci methodType = ''; 22161847f8eSopenharmony_ci } 22261847f8eSopenharmony_ci} 22361847f8eSopenharmony_ci 22461847f8eSopenharmony_cifunction collectDeprecatedDiff(newDeprecated, oldDeprecated, startDiffNew, startDiffOld, diffApis, subsystemMap, 22561847f8eSopenharmony_ci notes, fileNameMap, newApi) { 22661847f8eSopenharmony_ci flag = '废弃版本有变化'; 22761847f8eSopenharmony_ci diffOld = startDiffOld + '废弃版本:' + oldDeprecated; 22861847f8eSopenharmony_ci const useinsteadInfo = newApi.useinsteadInfo instanceof Object ? newApi.useinsteadInfo.new : newApi.useinsteadInfo; 22961847f8eSopenharmony_ci if (newApi.useinsteadInfo) { 23061847f8eSopenharmony_ci diffNew = `${startDiffNew}废弃版本:${newDeprecated}\n代替接口:${useinsteadInfo}`; 23161847f8eSopenharmony_ci } else { 23261847f8eSopenharmony_ci diffNew = startDiffNew + '废弃版本:' + newDeprecated; 23361847f8eSopenharmony_ci } 23461847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 23561847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 23661847f8eSopenharmony_ci} 23761847f8eSopenharmony_ci 23861847f8eSopenharmony_cifunction getDiffApisBaseNew(newDiffApis, oldDiffApis, diffApis, subsystemMap, fileNameMap) { 23961847f8eSopenharmony_ci const notes = ''; 24061847f8eSopenharmony_ci const diffMethodTextSet = new Set(); 24161847f8eSopenharmony_ci newDiffApis.forEach(newApi => { 24261847f8eSopenharmony_ci let diffOld = 'NA'; 24361847f8eSopenharmony_ci let diffNew = 'NA'; 24461847f8eSopenharmony_ci const tmpApis = []; 24561847f8eSopenharmony_ci 24661847f8eSopenharmony_ci oldDiffApis.forEach(oldApi => { 24761847f8eSopenharmony_ci if (newApi.dtsPath.replace(newDir, '') === oldApi.dtsPath.replace(oldDir, '')) { 24861847f8eSopenharmony_ci tmpApis.push(oldApi); 24961847f8eSopenharmony_ci } 25061847f8eSopenharmony_ci }); 25161847f8eSopenharmony_ci if (tmpApis.length === 0) { 25261847f8eSopenharmony_ci collectNewFileApi(newApi, subsystemMap, notes, fileNameMap, diffApis, diffOld); 25361847f8eSopenharmony_ci } else { 25461847f8eSopenharmony_ci if (newApi.apiType === 'import') { 25561847f8eSopenharmony_ci collectImportDiff(tmpApis, newApi, diffApis, subsystemMap, notes, fileNameMap); 25661847f8eSopenharmony_ci } else if (newApi.apiType === 'export') { 25761847f8eSopenharmony_ci collectExportDiff(tmpApis, newApi, diffApis, subsystemMap, notes, fileNameMap); 25861847f8eSopenharmony_ci } else { 25961847f8eSopenharmony_ci let oldSameClassApis = handleApiByClassName(tmpApis, newApi, newDiffApis).oldSameClassApi; 26061847f8eSopenharmony_ci let oldMethodTexts = handleApiByClassName(tmpApis, newApi, newDiffApis).oldMethodTexts; 26161847f8eSopenharmony_ci collectSameClassDiff(oldSameClassApis, newApi, diffNew, diffOld, diffApis, subsystemMap, fileNameMap, diffMethodTextSet); 26261847f8eSopenharmony_ci getNewAddApi(oldMethodTexts, diffApis, subsystemMap, fileNameMap, diffMethodTextSet, newApi); 26361847f8eSopenharmony_ci } 26461847f8eSopenharmony_ci } 26561847f8eSopenharmony_ci }); 26661847f8eSopenharmony_ci} 26761847f8eSopenharmony_cifunction collectSameClassDiff(oldSameClassApis, newApi, diffNew, diffOld, diffApis, subsystemMap, fileNameMap, diffMethodTextSet) { 26861847f8eSopenharmony_ci const notes = ''; 26961847f8eSopenharmony_ci if (oldSameClassApis.length === 0) { 27061847f8eSopenharmony_ci flag = '新增'; 27161847f8eSopenharmony_ci if (newApi.methodName === '') { 27261847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\n类名: ' + newApi.className; 27361847f8eSopenharmony_ci } else { 27461847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\n类名: ' + newApi.className + 27561847f8eSopenharmony_ci '\n方法 or 属性:' + newApi.methodText; 27661847f8eSopenharmony_ci } 27761847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 27861847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 27961847f8eSopenharmony_ci } else { 28061847f8eSopenharmony_ci oldSameClassApis.forEach(oldApi => { 28161847f8eSopenharmony_ci if (newApi.methodName === oldApi.methodName && newApi.apiType.toString() === oldApi.apiType.toString()) { 28261847f8eSopenharmony_ci collectChangePart(newApi, oldApi, diffApis, subsystemMap, fileNameMap, diffMethodTextSet); 28361847f8eSopenharmony_ci } 28461847f8eSopenharmony_ci }); 28561847f8eSopenharmony_ci 28661847f8eSopenharmony_ci } 28761847f8eSopenharmony_ci} 28861847f8eSopenharmony_cifunction getNewAddApi(oldMethodTexts, diffApis, subsystemMap, fileNameMap, diffMethodTextSet, newApi) { 28961847f8eSopenharmony_ci if (!oldMethodTexts.has(newApi.methodText.replace(/\r|\n|\s+|\,|\;/g, '')) && 29061847f8eSopenharmony_ci !diffMethodTextSet.has(newApi.methodText)) { 29161847f8eSopenharmony_ci const notes = ''; 29261847f8eSopenharmony_ci const flag = '新增'; 29361847f8eSopenharmony_ci const diffNew = '类名:' + newApi.className + '\n方法or属性:' + newApi.methodText; 29461847f8eSopenharmony_ci const diffOld = 'NA'; 29561847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 29661847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 29761847f8eSopenharmony_ci } 29861847f8eSopenharmony_ci} 29961847f8eSopenharmony_cifunction collectChangePart(newApi, oldApi, diffApis, subsystemMap, fileNameMap, diffMethodTextSet) { 30061847f8eSopenharmony_ci let startDiffOld = ''; 30161847f8eSopenharmony_ci let startDiffNew = ''; 30261847f8eSopenharmony_ci const NOTE_NUMBER = 2; 30361847f8eSopenharmony_ci if (newApi.methodName === '') { 30461847f8eSopenharmony_ci startDiffOld = '类名:' + oldApi.className + '\n'; 30561847f8eSopenharmony_ci startDiffNew = '类名:' + newApi.className + '\n'; 30661847f8eSopenharmony_ci } else { 30761847f8eSopenharmony_ci startDiffOld = '类名:' + oldApi.className + '\n方法 or 属性:' + oldApi.methodText + '\n'; 30861847f8eSopenharmony_ci startDiffNew = '类名:' + newApi.className + '\n方法 or 属性:' + newApi.methodText + '\n'; 30961847f8eSopenharmony_ci } 31061847f8eSopenharmony_ci if (isCallbackTypeFun(newApi, oldApi, 'callback')) { 31161847f8eSopenharmony_ci diffMethodTextSet.add(newApi.methodText); 31261847f8eSopenharmony_ci collectMethodTextDiff(oldApi, newApi, startDiffNew, startDiffOld, diffApis, newApi.callbackMethodText, 31361847f8eSopenharmony_ci oldApi.callbackMethodText, subsystemMap, fileNameMap); 31461847f8eSopenharmony_ci } 31561847f8eSopenharmony_ci if (isPromiseTypeFun(newApi, oldApi, 'Promise')) { 31661847f8eSopenharmony_ci diffMethodTextSet.add(newApi.methodText); 31761847f8eSopenharmony_ci collectMethodTextDiff(oldApi, newApi, startDiffNew, startDiffOld, diffApis, newApi.promiseMethodText, 31861847f8eSopenharmony_ci oldApi.promiseMethodText, subsystemMap, fileNameMap); 31961847f8eSopenharmony_ci } 32061847f8eSopenharmony_ci if (!newApi.funType && !oldApi.funType && newApi.methodText !== oldApi.methodText && newApi.note < NOTE_NUMBER) { 32161847f8eSopenharmony_ci diffMethodTextSet.add(newApi.methodText); 32261847f8eSopenharmony_ci collectMethodTextDiff(oldApi, newApi, startDiffNew, startDiffOld, diffApis, newApi.methodText, 32361847f8eSopenharmony_ci oldApi.methodText, subsystemMap, fileNameMap); 32461847f8eSopenharmony_ci } 32561847f8eSopenharmony_ci if (newApi.methodText === oldApi.methodText) { 32661847f8eSopenharmony_ci collectNoteDiff(newApi.version, oldApi.version, newApi.deprecated, oldApi.deprecated, newApi.errorCode, 32761847f8eSopenharmony_ci oldApi.errorCode, newApi.sysCap, oldApi.sysCap, newApi.isSystemApi, oldApi.isSystemApi, newApi.permission, 32861847f8eSopenharmony_ci oldApi.permission, newApi.model, oldApi.model, newApi.typeInfo, oldApi.typeInfo, startDiffNew, startDiffOld, 32961847f8eSopenharmony_ci diffApis, subsystemMap, fileNameMap, newApi); 33061847f8eSopenharmony_ci } 33161847f8eSopenharmony_ci 33261847f8eSopenharmony_ci} 33361847f8eSopenharmony_cifunction isCallbackTypeFun(newApi, oldApi, funType) { 33461847f8eSopenharmony_ci if (newApi.funType === funType && oldApi.funType === funType && 33561847f8eSopenharmony_ci newApi.callbackMethodText !== oldApi.callbackMethodText) { 33661847f8eSopenharmony_ci return true; 33761847f8eSopenharmony_ci } else { 33861847f8eSopenharmony_ci return false; 33961847f8eSopenharmony_ci } 34061847f8eSopenharmony_ci} 34161847f8eSopenharmony_cifunction isPromiseTypeFun(newApi, oldApi, funType) { 34261847f8eSopenharmony_ci if (newApi.funType === funType && oldApi.funType === funType && 34361847f8eSopenharmony_ci newApi.promiseMethodText !== oldApi.promiseMethodText) { 34461847f8eSopenharmony_ci return true; 34561847f8eSopenharmony_ci } else { 34661847f8eSopenharmony_ci return false; 34761847f8eSopenharmony_ci } 34861847f8eSopenharmony_ci} 34961847f8eSopenharmony_ci 35061847f8eSopenharmony_cifunction collectNoteDiff(newVersion, oldVersion, newDeprecated, oldDeprecated, newErrorCode, oldErrorCode, newSyscap, 35161847f8eSopenharmony_ci oldSyscap, newIsSystemApi, oldIsSystemApi, newPermission, oldPermission, newModel, oldModel, newTypeInfo, 35261847f8eSopenharmony_ci oldTypeInfo, startDiffNew, startDiffOld, diffApis, subsystemMap, fileNameMap, newApi) { 35361847f8eSopenharmony_ci const notes = ''; 35461847f8eSopenharmony_ci if (newVersion !== oldVersion) { 35561847f8eSopenharmony_ci collectVersionDiff(newVersion, oldVersion, startDiffNew, startDiffOld, 35661847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 35761847f8eSopenharmony_ci } 35861847f8eSopenharmony_ci if (newDeprecated !== oldDeprecated) { 35961847f8eSopenharmony_ci collectDeprecatedDiff(newDeprecated, oldDeprecated, startDiffNew, startDiffOld, 36061847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 36161847f8eSopenharmony_ci } 36261847f8eSopenharmony_ci if (newErrorCode !== oldErrorCode) { 36361847f8eSopenharmony_ci collectErrorCodeDiff(newErrorCode, oldErrorCode, startDiffNew, startDiffOld, 36461847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 36561847f8eSopenharmony_ci } 36661847f8eSopenharmony_ci if (newSyscap !== oldSyscap) { 36761847f8eSopenharmony_ci collectSyscapDiff(newSyscap, oldSyscap, startDiffNew, startDiffOld, 36861847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 36961847f8eSopenharmony_ci } 37061847f8eSopenharmony_ci if (newIsSystemApi !== oldIsSystemApi) { 37161847f8eSopenharmony_ci collectSystemApiDiff(newIsSystemApi, oldIsSystemApi, startDiffNew, startDiffOld, 37261847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 37361847f8eSopenharmony_ci } 37461847f8eSopenharmony_ci if (newPermission !== oldPermission) { 37561847f8eSopenharmony_ci collectPermissionDiff(newPermission, oldPermission, startDiffNew, startDiffOld, 37661847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 37761847f8eSopenharmony_ci } 37861847f8eSopenharmony_ci if (newModel !== oldModel) { 37961847f8eSopenharmony_ci collectModelDiff(newModel, oldModel, startDiffNew, startDiffOld, 38061847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 38161847f8eSopenharmony_ci } 38261847f8eSopenharmony_ci if (newTypeInfo !== oldTypeInfo) { 38361847f8eSopenharmony_ci collectTypeDiff(newTypeInfo, oldTypeInfo, startDiffNew, startDiffOld, 38461847f8eSopenharmony_ci diffApis, subsystemMap, notes, fileNameMap, newApi); 38561847f8eSopenharmony_ci } 38661847f8eSopenharmony_ci} 38761847f8eSopenharmony_ci 38861847f8eSopenharmony_cifunction collectTypeDiff(newType, oldType, startDiffNew, startDiffOld, diffApis, subsystemMap, notes, fileNameMap, newApi) { 38961847f8eSopenharmony_ci let flag = ''; 39061847f8eSopenharmony_ci if (oldType !== newType) { 39161847f8eSopenharmony_ci flag = 'type有变化'; 39261847f8eSopenharmony_ci } 39361847f8eSopenharmony_ci if (flag) { 39461847f8eSopenharmony_ci diffOld = startDiffOld + 'type:' + oldType; 39561847f8eSopenharmony_ci diffNew = startDiffNew + 'type:' + newType; 39661847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 39761847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 39861847f8eSopenharmony_ci } 39961847f8eSopenharmony_ci} 40061847f8eSopenharmony_ci 40161847f8eSopenharmony_cifunction collectNewFileApi(newApi, subsystemMap, notes, fileNameMap, diffApis, diffOld) { 40261847f8eSopenharmony_ci const flag = '新增'; 40361847f8eSopenharmony_ci let diffNew = ''; 40461847f8eSopenharmony_ci if (newApi.apiType === 'import') { 40561847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\nimport 信息: ' + newApi.headimport; 40661847f8eSopenharmony_ci } else if (newApi.apiType === 'export') { 40761847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\nexport 信息: ' + newApi.endexport; 40861847f8eSopenharmony_ci } else if (newApi.methodName === '') { 40961847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\n类名: ' + newApi.className; 41061847f8eSopenharmony_ci } else { 41161847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\n类名: ' + newApi.className + '\n方法 or 属性: ' + newApi.methodText; 41261847f8eSopenharmony_ci } 41361847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 41461847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 41561847f8eSopenharmony_ci} 41661847f8eSopenharmony_ci 41761847f8eSopenharmony_cifunction collectImportDiff(tmpApis, newApi, diffApis, subsystemMap, notes, fileNameMap) { 41861847f8eSopenharmony_ci const tmpApis2 = []; 41961847f8eSopenharmony_ci tmpApis.forEach(oldApi => { 42061847f8eSopenharmony_ci if (oldApi.apiType === 'import' && newApi.headimport === oldApi.headimport) { 42161847f8eSopenharmony_ci tmpApis2.push(oldApi); 42261847f8eSopenharmony_ci } 42361847f8eSopenharmony_ci }); 42461847f8eSopenharmony_ci 42561847f8eSopenharmony_ci if (tmpApis2.length === 0) { 42661847f8eSopenharmony_ci flag = '新增'; 42761847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\nimport 信息: ' + newApi.headimport; 42861847f8eSopenharmony_ci } 42961847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 43061847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 43161847f8eSopenharmony_ci} 43261847f8eSopenharmony_ci 43361847f8eSopenharmony_cifunction collectExportDiff(tmpApis, newApi, diffApis, subsystemMap, notes, fileNameMap) { 43461847f8eSopenharmony_ci const tmpApis3 = []; 43561847f8eSopenharmony_ci tmpApis.forEach(oldApi => { 43661847f8eSopenharmony_ci if (oldApi.apiType === 'export' && newApi.endexport === oldApi.endexport) { 43761847f8eSopenharmony_ci tmpApis3.push(oldApi); 43861847f8eSopenharmony_ci } 43961847f8eSopenharmony_ci }); 44061847f8eSopenharmony_ci if (tmpApis3.length === 0) { 44161847f8eSopenharmony_ci flag = '新增'; 44261847f8eSopenharmony_ci diffNew = '模块名: ' + newApi.packageName + '\nexport 信息: ' + newApi.endexport; 44361847f8eSopenharmony_ci } 44461847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 44561847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 44661847f8eSopenharmony_ci} 44761847f8eSopenharmony_ci 44861847f8eSopenharmony_cifunction handleApiByClassName(tmpApis, newApi, newDiffApis) { 44961847f8eSopenharmony_ci const oldSameClassApi = []; 45061847f8eSopenharmony_ci const newSameClassApi = []; 45161847f8eSopenharmony_ci const oldMethodTexts = new Set([]); 45261847f8eSopenharmony_ci const newMethodTexts = new Set([]); 45361847f8eSopenharmony_ci let equalClassName = 'N/A'; 45461847f8eSopenharmony_ci tmpApis.forEach(oldApi => { 45561847f8eSopenharmony_ci if (newApi.className === oldApi.className) { 45661847f8eSopenharmony_ci oldSameClassApi.push(oldApi); 45761847f8eSopenharmony_ci equalClassName = oldApi.className; 45861847f8eSopenharmony_ci oldMethodTexts.add(oldApi.methodText.replace(/\r|\n|\s+|\,|\;/g, '')); 45961847f8eSopenharmony_ci } 46061847f8eSopenharmony_ci }); 46161847f8eSopenharmony_ci newDiffApis.forEach(apiText => { 46261847f8eSopenharmony_ci if (apiText.className === equalClassName) { 46361847f8eSopenharmony_ci newMethodTexts.add(apiText.methodText.replace(/\r|\n|\s+|\,|\;/g, '')); 46461847f8eSopenharmony_ci newSameClassApi.push(apiText); 46561847f8eSopenharmony_ci } 46661847f8eSopenharmony_ci }); 46761847f8eSopenharmony_ci return { oldSameClassApi, oldMethodTexts, newMethodTexts }; 46861847f8eSopenharmony_ci} 46961847f8eSopenharmony_ci 47061847f8eSopenharmony_cifunction collectVersionDiff(newVersion, oldVersion, startDiffNew, startDiffOld, diffApis, 47161847f8eSopenharmony_ci subsystemMap, notes, fileNameMap, newApi) { 47261847f8eSopenharmony_ci flag = '起始版本有变化'; 47361847f8eSopenharmony_ci diffOld = startDiffOld + '起始版本:' + oldVersion; 47461847f8eSopenharmony_ci diffNew = startDiffNew + '起始版本:' + newVersion; 47561847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 47661847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 47761847f8eSopenharmony_ci} 47861847f8eSopenharmony_ci 47961847f8eSopenharmony_cifunction collectModelDiff(newModel, oldModel, startDiffNew, startDiffOld, diffApis, 48061847f8eSopenharmony_ci subsystemMap, notes, fileNameMap, newApi) { 48161847f8eSopenharmony_ci flag = 'model有变化'; 48261847f8eSopenharmony_ci diffOld = startDiffOld + 'model:' + oldModel; 48361847f8eSopenharmony_ci diffNew = startDiffNew + 'model:' + newModel; 48461847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 48561847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 48661847f8eSopenharmony_ci} 48761847f8eSopenharmony_ci 48861847f8eSopenharmony_cifunction collectPermissionDiff(newPermission, oldPermission, startDiffNew, startDiffOld, diffApis, 48961847f8eSopenharmony_ci subsystemMap, notes, fileNameMap, newApi) { 49061847f8eSopenharmony_ci flag = getPermissionFlag(oldPermission, newPermission); 49161847f8eSopenharmony_ci if (flag !== '格式变化') { 49261847f8eSopenharmony_ci diffOld = startDiffOld + '权限:' + oldPermission; 49361847f8eSopenharmony_ci diffNew = startDiffNew + '权限:' + newPermission; 49461847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 49561847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 49661847f8eSopenharmony_ci } 49761847f8eSopenharmony_ci} 49861847f8eSopenharmony_ci 49961847f8eSopenharmony_cifunction collectMethodTextDiff(oldApi, newApi, startDiffNew, startDiffOld, diffApis, newMethodText, oldMethodText, 50061847f8eSopenharmony_ci subsystemMap, fileNameMap) { 50161847f8eSopenharmony_ci flag = getMethodFlag(oldMethodText, newMethodText); 50261847f8eSopenharmony_ci const note = '去重'; 50361847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 50461847f8eSopenharmony_ci if (flag === '函数有变化') { 50561847f8eSopenharmony_ci diffOld = startDiffOld; 50661847f8eSopenharmony_ci diffNew = startDiffNew; 50761847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, note, fileNameMap)); 50861847f8eSopenharmony_ci } 50961847f8eSopenharmony_ci} 51061847f8eSopenharmony_ci 51161847f8eSopenharmony_cifunction collectErrorCodeDiff(newErrorCode, oldErrorCode, startDiffNew, startDiffOld, diffApis, subsystemMap, notes, 51261847f8eSopenharmony_ci fileNameMap, newApi) { 51361847f8eSopenharmony_ci flag = oldErrorCode === 'N/A' ? '新增(错误码)' : 'API修改(错误码)'; 51461847f8eSopenharmony_ci if (flag === '新增(错误码)') { 51561847f8eSopenharmony_ci diffOld = 'NA'; 51661847f8eSopenharmony_ci } else if (flag === 'API修改(错误码)') { 51761847f8eSopenharmony_ci diffOld = startDiffOld + '错误码内容:' + oldErrorCode; 51861847f8eSopenharmony_ci } 51961847f8eSopenharmony_ci diffNew = startDiffNew + '错误码内容:' + newErrorCode; 52061847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 52161847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 52261847f8eSopenharmony_ci} 52361847f8eSopenharmony_ci 52461847f8eSopenharmony_cifunction collectSyscapDiff(newSyscap, oldSyscap, startDiffNew, startDiffOld, diffApis, subsystemMap, notes, 52561847f8eSopenharmony_ci fileNameMap, newApi) { 52661847f8eSopenharmony_ci flag = 'SysCap有变化'; 52761847f8eSopenharmony_ci diffOld = startDiffOld + 'SysCap:' + oldSyscap; 52861847f8eSopenharmony_ci diffNew = startDiffNew + 'SysCap:' + newSyscap; 52961847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 53061847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 53161847f8eSopenharmony_ci} 53261847f8eSopenharmony_ci 53361847f8eSopenharmony_cifunction collectSystemApiDiff(newIsSystemApi, oldIsSystemApi, startDiffNew, startDiffOld, diffApis, subsystemMap, 53461847f8eSopenharmony_ci notes, fileNameMap, newApi) { 53561847f8eSopenharmony_ci flag = '访问级别有变化'; 53661847f8eSopenharmony_ci diffOld = startDiffOld + '访问级别:' + oldIsSystemApi; 53761847f8eSopenharmony_ci diffNew = startDiffNew + '访问级别:' + newIsSystemApi; 53861847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(newApi, newApi.sysCap); 53961847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(newApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 54061847f8eSopenharmony_ci} 54161847f8eSopenharmony_ci 54261847f8eSopenharmony_cifunction getMethodFlag(methodTextOld, methodTextNew) { 54361847f8eSopenharmony_ci let methodTextOlds = methodTextOld.replace(/\r|\n|\s+|\,|\;/g, ''); 54461847f8eSopenharmony_ci let methodTextNews = methodTextNew.replace(/\r|\n|\s+|\,|\;/g, ''); 54561847f8eSopenharmony_ci if (methodTextOlds === methodTextNews) { 54661847f8eSopenharmony_ci return '函数格式变化'; 54761847f8eSopenharmony_ci } else { 54861847f8eSopenharmony_ci return '函数有变化'; 54961847f8eSopenharmony_ci } 55061847f8eSopenharmony_ci} 55161847f8eSopenharmony_ci 55261847f8eSopenharmony_cifunction getPermissionFlag(permissionOld, permissionNew) { 55361847f8eSopenharmony_ci let permissionOlds = permissionOld.replace(/\r|\n|\s+|\.|\//g, ''); 55461847f8eSopenharmony_ci let permissionNews = permissionNew.replace(/\r|\n|\s+|\.|\//g, ''); 55561847f8eSopenharmony_ci if (permissionOlds === permissionNews) { 55661847f8eSopenharmony_ci return '格式变化'; 55761847f8eSopenharmony_ci } else if (permissionOld === 'N/A') { 55861847f8eSopenharmony_ci return '新增(权限)'; 55961847f8eSopenharmony_ci } else if (permissionNew === 'N/A') { 56061847f8eSopenharmony_ci return '删除(权限)'; 56161847f8eSopenharmony_ci } else { 56261847f8eSopenharmony_ci return '权限有变化'; 56361847f8eSopenharmony_ci } 56461847f8eSopenharmony_ci} 56561847f8eSopenharmony_ci 56661847f8eSopenharmony_cifunction getDiffApisBaseOld(newDiffApis, oldDiffApis, diffApis, subsystemMap, fileNameMap) { 56761847f8eSopenharmony_ci const notes = ''; 56861847f8eSopenharmony_ci oldDiffApis.forEach(oldApi => { 56961847f8eSopenharmony_ci let flag = ''; 57061847f8eSopenharmony_ci let diffOld = ''; 57161847f8eSopenharmony_ci let diffNew = 'NA'; 57261847f8eSopenharmony_ci const tmpApis = []; 57361847f8eSopenharmony_ci newDiffApis.forEach(newApi => { 57461847f8eSopenharmony_ci if (oldApi.dtsPath.replace(oldDir, '') === newApi.dtsPath.replace(newDir, '')) { 57561847f8eSopenharmony_ci tmpApis.push(newApi); 57661847f8eSopenharmony_ci } 57761847f8eSopenharmony_ci }); 57861847f8eSopenharmony_ci if (tmpApis.length === 0) { 57961847f8eSopenharmony_ci flag = deleteFileApi(oldApi, flag, diffOld).flag; 58061847f8eSopenharmony_ci diffOld = deleteFileApi(oldApi, flag, diffOld).diffOld; 58161847f8eSopenharmony_ci } else { 58261847f8eSopenharmony_ci if (oldApi.apiType === 'import') { 58361847f8eSopenharmony_ci flag = deleteImportApi(flag, diffOld, tmpApis, oldApi).flag; 58461847f8eSopenharmony_ci diffOld = deleteImportApi(flag, diffOld, tmpApis, oldApi).diffOld; 58561847f8eSopenharmony_ci } else if (oldApi.apiType === 'export') { 58661847f8eSopenharmony_ci flag = deleteExportApi(flag, diffOld, tmpApis, oldApi).flag; 58761847f8eSopenharmony_ci diffOld = deleteExportApi(flag, diffOld, tmpApis, oldApi).diffOld; 58861847f8eSopenharmony_ci } else { 58961847f8eSopenharmony_ci flag = collectDeleteApis(tmpApis, oldApi, flag, diffOld).flag; 59061847f8eSopenharmony_ci diffOld = collectDeleteApis(tmpApis, oldApi, flag, diffOld).diffOld; 59161847f8eSopenharmony_ci } 59261847f8eSopenharmony_ci } 59361847f8eSopenharmony_ci if (flag !== '') { 59461847f8eSopenharmony_ci let sysCapInfo = getSubsystemBySyscap(oldApi, oldApi.sysCap); 59561847f8eSopenharmony_ci diffApis.push(getApiInfoWithFlag(oldApi, flag, diffOld, diffNew, subsystemMap, sysCapInfo, notes, fileNameMap)); 59661847f8eSopenharmony_ci } 59761847f8eSopenharmony_ci }); 59861847f8eSopenharmony_ci} 59961847f8eSopenharmony_ci 60061847f8eSopenharmony_cifunction collectDeleteApis(tmpApis, oldApi, flag, diffOld) { 60161847f8eSopenharmony_ci const newSameClassApis = []; 60261847f8eSopenharmony_ci tmpApis.forEach(newApi => { 60361847f8eSopenharmony_ci if (oldApi.className === newApi.className) { 60461847f8eSopenharmony_ci newSameClassApis.push(newApi); 60561847f8eSopenharmony_ci } 60661847f8eSopenharmony_ci }); 60761847f8eSopenharmony_ci if (newSameClassApis.length === 0) { 60861847f8eSopenharmony_ci flag = '删除'; 60961847f8eSopenharmony_ci if (oldApi.methodName === '') { 61061847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\n类名: ' + oldApi.className; 61161847f8eSopenharmony_ci } else { 61261847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\n类名: ' + oldApi.className + '\n方法 or 属性:' + oldApi.methodText; 61361847f8eSopenharmony_ci } 61461847f8eSopenharmony_ci } else { 61561847f8eSopenharmony_ci let count = 0; 61661847f8eSopenharmony_ci newSameClassApis.forEach(newApi => { 61761847f8eSopenharmony_ci if (oldApi.methodName === newApi.methodName && oldApi.apiType.toString() === newApi.apiType.toString()) { 61861847f8eSopenharmony_ci count++; 61961847f8eSopenharmony_ci } 62061847f8eSopenharmony_ci }); 62161847f8eSopenharmony_ci 62261847f8eSopenharmony_ci if (count === 0) { 62361847f8eSopenharmony_ci flag = '删除'; 62461847f8eSopenharmony_ci if (oldApi.methodName === '') { 62561847f8eSopenharmony_ci diffOld = '模块名:' + oldApi.packageName + '\n类名:' + oldApi.className; 62661847f8eSopenharmony_ci } else { 62761847f8eSopenharmony_ci diffOld = '模块名:' + oldApi.packageName + '\n类名:' + oldApi.className + '\n方法 or 属性:' + oldApi.methodText; 62861847f8eSopenharmony_ci } 62961847f8eSopenharmony_ci } 63061847f8eSopenharmony_ci } 63161847f8eSopenharmony_ci return { flag, diffOld }; 63261847f8eSopenharmony_ci} 63361847f8eSopenharmony_ci 63461847f8eSopenharmony_cifunction deleteImportApi(flag, diffOld, tmpApis, oldApi) { 63561847f8eSopenharmony_ci const tmpApis2 = []; 63661847f8eSopenharmony_ci tmpApis.forEach(newApi => { 63761847f8eSopenharmony_ci if (newApi.apiType === 'import' && newApi.headimport === oldApi.headimport) { 63861847f8eSopenharmony_ci tmpApis2.push(newApi); 63961847f8eSopenharmony_ci } 64061847f8eSopenharmony_ci }); 64161847f8eSopenharmony_ci 64261847f8eSopenharmony_ci if (tmpApis2.length === 0) { 64361847f8eSopenharmony_ci flag = '删除'; 64461847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\nimport 信息: ' + oldApi.headimport; 64561847f8eSopenharmony_ci } 64661847f8eSopenharmony_ci return { flag, diffOld }; 64761847f8eSopenharmony_ci} 64861847f8eSopenharmony_ci 64961847f8eSopenharmony_cifunction deleteExportApi(flag, diffOld, tmpApis, oldApi) { 65061847f8eSopenharmony_ci const tmpApis3 = []; 65161847f8eSopenharmony_ci tmpApis.forEach(newApi => { 65261847f8eSopenharmony_ci if (newApi.apiType === 'export' && newApi.endexport === oldApi.endexport) { 65361847f8eSopenharmony_ci tmpApis3.push(newApi); 65461847f8eSopenharmony_ci } 65561847f8eSopenharmony_ci }); 65661847f8eSopenharmony_ci if (tmpApis3.length === 0) { 65761847f8eSopenharmony_ci flag = '删除'; 65861847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\nexport 信息: ' + oldApi.endexport; 65961847f8eSopenharmony_ci } 66061847f8eSopenharmony_ci return { flag, diffOld }; 66161847f8eSopenharmony_ci} 66261847f8eSopenharmony_ci 66361847f8eSopenharmony_cifunction deleteFileApi(oldApi, flag, diffOld) { 66461847f8eSopenharmony_ci flag = '删除'; 66561847f8eSopenharmony_ci if (oldApi.apiType === 'import') { 66661847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\nimport 信息: ' + oldApi.headimport; 66761847f8eSopenharmony_ci } else if (oldApi.apiType === 'export') { 66861847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\nexport 信息: ' + oldApi.endexport; 66961847f8eSopenharmony_ci } else if (oldApi.methodName === '') { 67061847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\n类名: ' + oldApi.className; 67161847f8eSopenharmony_ci } else { 67261847f8eSopenharmony_ci diffOld = '模块名: ' + oldApi.packageName + '\n类名: ' + oldApi.className + '\n方法 or 属性:' + oldApi.methodText; 67361847f8eSopenharmony_ci } 67461847f8eSopenharmony_ci return { flag, diffOld }; 67561847f8eSopenharmony_ci} 67661847f8eSopenharmony_ci 67761847f8eSopenharmony_ci// 输出新旧版本所有api对比结果 67861847f8eSopenharmony_ciasync function exportDiffApiInfo(exportType, compileApiInfos, exportFileName) { 67961847f8eSopenharmony_ci if (exportType === 'excel') { 68061847f8eSopenharmony_ci const workbook = new ExcelJS.Workbook(); 68161847f8eSopenharmony_ci const sheet = workbook.addWorksheet('api差异', { viers: [{ xSplit: 1 }] }); 68261847f8eSopenharmony_ci sheet.getRow(1).values = ['操作标记*', '差异项-旧版本', '差异项-新版本', 'd.ts文件', '归属子系统']; 68361847f8eSopenharmony_ci for (let i = 0; i < compileApiInfos.length; i++) { 68461847f8eSopenharmony_ci let apiData = compileApiInfos[i]; 68561847f8eSopenharmony_ci let fileName = apiData.dtsPath ? path.basename(apiData.dtsPath) : apiData.packageName; 68661847f8eSopenharmony_ci const ADD_NUMBER = 2; 68761847f8eSopenharmony_ci sheet.getRow(i + ADD_NUMBER).values = [apiData.flag, apiData.diffOld, apiData.diffNew, fileName, 68861847f8eSopenharmony_ci apiData.subsystem]; 68961847f8eSopenharmony_ci } 69061847f8eSopenharmony_ci const buffer = await workbook.xlsx.writeBuffer(); 69161847f8eSopenharmony_ci fs.writeFile(exportFileName, buffer, function (err) { 69261847f8eSopenharmony_ci if (err) { 69361847f8eSopenharmony_ci return; 69461847f8eSopenharmony_ci } 69561847f8eSopenharmony_ci }); 69661847f8eSopenharmony_ci } else if (exportType === 'json') { 69761847f8eSopenharmony_ci fs.writeFile(exportFileName, JSON.stringify(compileApiInfos), function (err) { 69861847f8eSopenharmony_ci if (err) { 69961847f8eSopenharmony_ci console.log('Write failed:' + err); 70061847f8eSopenharmony_ci return; 70161847f8eSopenharmony_ci } 70261847f8eSopenharmony_ci console.log(exportFileName + 'Write completed.'); 70361847f8eSopenharmony_ci }); 70461847f8eSopenharmony_ci } 70561847f8eSopenharmony_ci} 70661847f8eSopenharmony_ci 70761847f8eSopenharmony_cifunction exportDiffMd(subsystem, diffInfos) { 70861847f8eSopenharmony_ci let finalContent = '| 操作 | 旧版本 | 新版本 | d.ts文件 |\n' + '| ---- | ------ | ------ | -------- |\n'; 70961847f8eSopenharmony_ci for (let i = 0; i < diffInfos.length; i++) { 71061847f8eSopenharmony_ci let apiData = diffInfos[i]; 71161847f8eSopenharmony_ci let fileName = apiData.dtsPath ? path.basename(apiData.dtsPath) : apiData.packageName; 71261847f8eSopenharmony_ci const oldData = apiData.diffOld.replace(/\r|\n/g, '<br>').replace(/\|/g, '\\|').replace(/\<(?!br>)/g, '\\<'); 71361847f8eSopenharmony_ci const newData = apiData.diffNew.replace(/\r|\n/g, '<br>').replace(/\|/g, '\\|').replace(/\<(?!br>)/g, '\\<'); 71461847f8eSopenharmony_ci finalContent += `|${apiData.flag}|${oldData}|${newData}|${fileName}|\n`; 71561847f8eSopenharmony_ci } 71661847f8eSopenharmony_ci const mdFilesDir = `${__dirname.replace('src', '')}diff合集`; 71761847f8eSopenharmony_ci if (!fs.existsSync(mdFilesDir)) { 71861847f8eSopenharmony_ci fs.mkdirSync('../diff合集'); 71961847f8eSopenharmony_ci } 72061847f8eSopenharmony_ci 72161847f8eSopenharmony_ci fs.writeFile(`../diff合集/js-apidiff-${subsystem}.md`, finalContent, function (err) { 72261847f8eSopenharmony_ci if (err) { 72361847f8eSopenharmony_ci console.log('WRITE FAILED:::', err); 72461847f8eSopenharmony_ci return; 72561847f8eSopenharmony_ci } 72661847f8eSopenharmony_ci console.log('WRITE SUCCESSED'); 72761847f8eSopenharmony_ci }); 72861847f8eSopenharmony_ci 72961847f8eSopenharmony_ci} 73061847f8eSopenharmony_ci 73161847f8eSopenharmony_cifunction diffBySbusystem(compileApiInfos) { 73261847f8eSopenharmony_ci let filePath = __dirname.replace('\\src', '') + '\\subsystem.json'; 73361847f8eSopenharmony_ci let subsystemArr = JSON.parse(fs.readFileSync(filePath, 'utf-8')); 73461847f8eSopenharmony_ci let flagArr = ['新增', '删除', 'model有变化', '访问级别有变化', '废弃版本有变化', '起始版本有变化', '权限有变化', 73561847f8eSopenharmony_ci '删除(权限)', '新增(错误码)', '新增(权限)', '错误码有变化', 'SysCap有变化', '函数有变化']; 73661847f8eSopenharmony_ci subsystemArr.forEach(subsystem => { 73761847f8eSopenharmony_ci let diffInfos = []; 73861847f8eSopenharmony_ci compileApiInfos.forEach(api => { 73961847f8eSopenharmony_ci if (subsystem.subsystem === api.subsystem) { 74061847f8eSopenharmony_ci diffInfos.push(api); 74161847f8eSopenharmony_ci } 74261847f8eSopenharmony_ci }); 74361847f8eSopenharmony_ci if (diffInfos.length !== 0) { 74461847f8eSopenharmony_ci const sortDiffInfos = []; 74561847f8eSopenharmony_ci flagArr.forEach(flag => { 74661847f8eSopenharmony_ci diffInfos.forEach(diffInfo => { 74761847f8eSopenharmony_ci if (diffInfo.flag === flag) { 74861847f8eSopenharmony_ci sortDiffInfos.push(diffInfo); 74961847f8eSopenharmony_ci } 75061847f8eSopenharmony_ci }); 75161847f8eSopenharmony_ci }); 75261847f8eSopenharmony_ci exportDiffMd(subsystem.fileName, sortDiffInfos); 75361847f8eSopenharmony_ci } 75461847f8eSopenharmony_ci 75561847f8eSopenharmony_ci }); 75661847f8eSopenharmony_ci} 75761847f8eSopenharmony_ci// 读取路径下所有的zip文件路径 75861847f8eSopenharmony_cifunction readZipFile(dir, zipFiles) { 75961847f8eSopenharmony_ci try { 76061847f8eSopenharmony_ci const files = fs.readdirSync(dir); 76161847f8eSopenharmony_ci files.forEach(element => { 76261847f8eSopenharmony_ci const filePath = path.join(dir, element); 76361847f8eSopenharmony_ci const status = fs.statSync(filePath); 76461847f8eSopenharmony_ci if (status.isDirectory()) { 76561847f8eSopenharmony_ci readZipFile(filePath, zipFiles); 76661847f8eSopenharmony_ci } else { 76761847f8eSopenharmony_ci if (filePath.endsWith('.zip')) { 76861847f8eSopenharmony_ci zipFiles.push(filePath); 76961847f8eSopenharmony_ci } 77061847f8eSopenharmony_ci } 77161847f8eSopenharmony_ci }); 77261847f8eSopenharmony_ci } catch (error) { 77361847f8eSopenharmony_ci console.error('ETS ERROR:' + error); 77461847f8eSopenharmony_ci } 77561847f8eSopenharmony_ci} 77661847f8eSopenharmony_ci 77761847f8eSopenharmony_cifunction unCompressAllZipFilesAndCompile(newDir, oldDir) { 77861847f8eSopenharmony_ci const zipFiles = []; 77961847f8eSopenharmony_ci readZipFile(newDir, zipFiles); 78061847f8eSopenharmony_ci readZipFile(oldDir, zipFiles); 78161847f8eSopenharmony_ci let count = 0; 78261847f8eSopenharmony_ci let countfile = 0; 78361847f8eSopenharmony_ci zipFiles.forEach(async element => { 78461847f8eSopenharmony_ci let filePath = element.replace(path.basename(element), ''); 78561847f8eSopenharmony_ci compressing.zip.uncompress(element, filePath).then((data) => { 78661847f8eSopenharmony_ci console.log('uncompress success:', data, '--' + element); 78761847f8eSopenharmony_ci count++; 78861847f8eSopenharmony_ci if ((count + countfile) === zipFiles.length) { 78961847f8eSopenharmony_ci compileAndExportToFile(); 79061847f8eSopenharmony_ci } 79161847f8eSopenharmony_ci }).catch(error => { 79261847f8eSopenharmony_ci console.log(('uncompress error:', error)); 79361847f8eSopenharmony_ci }); 79461847f8eSopenharmony_ci }); 79561847f8eSopenharmony_ci} 79661847f8eSopenharmony_ci 79761847f8eSopenharmony_cifunction compileAndExportToFile() { 79861847f8eSopenharmony_ci const newFiles = []; 79961847f8eSopenharmony_ci const oldFiles = []; 80061847f8eSopenharmony_ci readFile(oldDir, oldFiles); 80161847f8eSopenharmony_ci readFile(newDir, newFiles); 80261847f8eSopenharmony_ci let diffApis = getDIffApisWithCompile(newFiles, oldFiles); 80361847f8eSopenharmony_ci let noRepeatDiffApi = []; 80461847f8eSopenharmony_ci let diffApisSet = new Set(); 80561847f8eSopenharmony_ci diffApis.map(api => diffApisSet.add(JSON.stringify(api))); 80661847f8eSopenharmony_ci diffApisSet.forEach(item => { 80761847f8eSopenharmony_ci noRepeatDiffApi.push(JSON.parse(item)); 80861847f8eSopenharmony_ci }); 80961847f8eSopenharmony_ci for (let i = 0; i < allMergeData.length; i++) { 81061847f8eSopenharmony_ci for (let j = 0; j < noRepeatDiffApi.length; j++) { 81161847f8eSopenharmony_ci if (allMergeData[i].packageName === noRepeatDiffApi[j].packageName && noRepeatDiffApi[j].flag === '删除' && 81261847f8eSopenharmony_ci allMergeData[i].diffOld === noRepeatDiffApi[j].methodText) { 81361847f8eSopenharmony_ci noRepeatDiffApi.splice(j, 1); 81461847f8eSopenharmony_ci j--; 81561847f8eSopenharmony_ci } else if (allMergeData[i].packageName === noRepeatDiffApi[j].packageName && 81661847f8eSopenharmony_ci noRepeatDiffApi[j].flag === '新增' && allMergeData[i].diffNew === noRepeatDiffApi[j].methodText) { 81761847f8eSopenharmony_ci noRepeatDiffApi.splice(j, 1); 81861847f8eSopenharmony_ci j--; 81961847f8eSopenharmony_ci } 82061847f8eSopenharmony_ci 82161847f8eSopenharmony_ci } 82261847f8eSopenharmony_ci 82361847f8eSopenharmony_ci } 82461847f8eSopenharmony_ci let afterMergeData = noRepeatDiffApi.concat(allMergeData); 82561847f8eSopenharmony_ci exportDiffApiInfo('excel', afterMergeData, 'Js_Api_Diff.xlsx'); 82661847f8eSopenharmony_ci diffBySbusystem(afterMergeData); 82761847f8eSopenharmony_ci} 82861847f8eSopenharmony_ci 82961847f8eSopenharmony_ciconst subsystemDir = __dirname.replace('\\src', '') + '\\subsystem.json'; 83061847f8eSopenharmony_ciconst urlObject = fs.readFileSync(__dirname.replace('\\src', '') + '\\url.json', 'utf-8'); 83161847f8eSopenharmony_ciconst oldDir = JSON.parse(urlObject).oldDir; 83261847f8eSopenharmony_ciconst newDir = JSON.parse(urlObject).newDir; 83361847f8eSopenharmony_ciunCompressAllZipFilesAndCompile(newDir, oldDir); 834