* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const path = require('path');
const fs = require('fs');
const result = require('../check_result.json');
const { apiCheckArr, getApiInfo, ErrorLevel, ApiCheckResult, apiCheckInfoArr, requireTypescriptModule } = require('../src/utils');
const ts = requireTypescriptModule();
*
* @param {ts.Node} node current node
* @param {ts.Sourcefile} sourcefile root node
* @param {String} fileName full file name
* @param {String} errorType enum object:ErrorType
* @param {String} errorInfo error infomation
* @param {String} type jsdoc | api
* @param {Enum} level enum object:ErrorLevel
*/
function addAPICheckErrorLogs(node, sourcefile, fileName, errorType, errorInfo, type, level) {
const checkFailFileNameSet = new Set(result.apiFiles);
if (!checkFailFileNameSet.has(fileName)) {
result.apiFiles.push(fileName);
}
const posOfNode = sourcefile.getLineAndCharacterOfPosition(node.getStart());
const baseFileName = fileName.substring(fileName.indexOf('api'), fileName.length);
const errorMessage = `API check error of [${errorType.description}]: ${errorInfo}`;
const needMask = checkMarkError(node, errorMessage, baseFileName);
if (needMask) {
return;
}
if (level === ErrorLevel.HIGH || level === ErrorLevel.MIDDLE) {
ApiCheckResult.formatCheckResult = false;
}
apiCheckArr.push({
errorType: errorType.description,
fileName: `${baseFileName}(line: ${posOfNode.line + 1}, col: ${posOfNode.character + 1})`,
type,
errorInfo,
version: getApiInfo(node).version,
basename: path.basename(fileName).replace(/\.d\.ts/g, ''),
level,
apiName: node.symbol ? node.symbol.escapedName : '',
apiFullText: node.getFullText(),
});
apiCheckInfoArr.push({
id: errorType.id,
level,
location: `${baseFileName}(line: ${posOfNode.line + 1}, col: ${posOfNode.character + 1})`,
filePath: baseFileName,
message: errorMessage,
});
}
exports.addAPICheckErrorLogs = addAPICheckErrorLogs;
function checkMarkError(node, errorMessage, baseFileName) {
let needMasking = false;
let apiName = '';
if (node.name?.text) {
apiName = node.name.text;
} else if (node.escapedText) {
apiName = node.escapedText;
}
const apiText = node.getText().replace(/\r|\n|(\r\n)|\s/g, '');
const apiKindName = Object.keys(ts.SyntaxKind).find(k => ts.SyntaxKind[k] === node?.kind);
const apiParentKind = [apiKindName];
getParentkind(node, apiParentKind);
const maskInfos = parseUnicodeConfig();
if (maskInfos === '') {
return needMasking;
}
maskInfos.maskInformations.forEach(maskInfo => {
if (maskInfo.kind === apiKindName &&
maskInfo.name === apiName &&
maskInfo.hierarchicalRelationship === JSON.stringify(apiParentKind) &&
maskInfo.text.replace(/\s/g, '') === apiText &&
maskInfo.errorMassage === errorMessage &&
JSON.stringify(maskInfo.fileName) === JSON.stringify(baseFileName.split(path.sep).join('\\'))) {
needMasking = true;
}
});
return needMasking;
}
function getParentkind(node, parentkindArr) {
if (ts.isSourceFile(node)) {
return;
}
if (ts.isSourceFile(node.parent)) {
parentkindArr.push(Object.keys(ts.SyntaxKind).find(k => ts.SyntaxKind[k] === node.parent.kind));
return;
}
if (!ts.isModuleBlock(node.parent)) {
parentkindArr.push(Object.keys(ts.SyntaxKind).find(k => ts.SyntaxKind[k] === node.parent.kind));
getParentkind(node.parent, parentkindArr);
} else if (ts.isModuleBlock(node.parent)) {
getParentkind(node.parent, parentkindArr);
}
}
exports.getParentkind = getParentkind;
function parseUnicodeConfig() {
let maskInfos = '';
if (!fs.existsSync(path.resolve(__dirname, '../config/errorMaskWhiteList.txt'))) {
return maskInfos;
}
const maskInformations = fs.readFileSync(path.resolve(__dirname, '../config/errorMaskWhiteList.txt'), 'utf-8');
let maskInfoString = '';
if (maskInformations && maskInformations.indexOf('\\u') === -1) {
return JSON.parse(maskInfoString);
}
let valArr = maskInformations.split('\\u');
for (let j = 0; j < valArr.length; j++) {
if (valArr[j] === '') {
continue;
}
maskInfoString += String.fromCharCode(parseInt(valArr[j], 16));
}
maskInfos = JSON.parse(maskInfoString);
return maskInfos;
}
function string2unicode() {
const str = fs.readFileSync('../test/errorlist.json', 'utf-8');
let ret = '';
let ustr = '';
for (let i = 0; i < str.length; i++) {
let code = str.charCodeAt(i);
let code16 = code.toString(16);
if (code < 0xf) {
ustr = '\\u' + '000' + code16;
} else if (code < 0xff) {
ustr = '\\u' + '00' + code16;
} else if (code < 0xfff) {
ustr = '\\u' + '0' + code16;
} else {
ustr = '\\u' + code16;
}
ret += ustr;
}
fs.writeFileSync('errorlist.txt', ret);
return ret;
}