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