basant307/AI_Governance_Project
048
1import { getFormatterList as textlintGetFormatterList, loadFormatter as textlintCreateFormatter, } from "@textlint/linter-formatter";2import terminalLink from "terminal-link";3import fs from "node:fs";4import path from "node:path";5import debug0 from "debug";6import { dynamicImport, tryResolve } from "@secretlint/resolver";7import jsonFormatter from "./formatters/json.js";8import maskResultFormatter from "./formatters/mask-result.js";9import tableFormatter from "./formatters/table.js";10const BuiltInFormatters = ["json", "mask-result", "table"];11const debug = debug0("@secretlint/formatter");12const tryResolveModule = (moduleName) => {13 return tryResolve(moduleName, {14 parentImportMeta: import.meta,15 parentModule: "formatter",16 });17};18/**19 * Convert secretlint result to textlint result for formatter20 */21const convertSecretLintResultToTextlintResult = (secretLintCoreResult, { enableTerminalLink }) => {22 return {23 filePath: secretLintCoreResult.filePath,24 messages: secretLintCoreResult.messages.map((message) => {25 const severityLevel = message.severity === "info"26 ? 027 : message.severity === "warning"28 ? 129 : message.severity === "error"30 ? 231 : 0;32 // If the message has docsUrl, try to link to docsUrl33 const messageId = enableTerminalLink && message.docsUrl34 ? terminalLink(message.messageId, message.docsUrl, {35 fallback: (text, _url) => {36 return text;37 },38 })39 : message.messageId;40 return {41 // Preset rule format42 // {preset-id} > {rule-id}43 // Single rule format44 // {rule-id}45 ruleId: message.ruleParentId ? `${message.ruleParentId} > ${message.ruleId}` : message.ruleId,46 /**47 * @deprecated backward compatibility - use range or loc48 */49 index: message.range[0],50 /**51 * @deprecated backward compatibility - use range or loc52 */53 line: message.loc.start.line,54 /**55 * @deprecated backward compatibility - use range or loc56 */57 column: message.loc.start.column,58 range: message.range,59 loc: message.loc,60 severity: severityLevel,61 message: `[${messageId}] ${message.message}`,62 data: message.data,63 // NO NEED - DUMMY DATA64 fix: undefined,65 type: "lint",66 };67 }),68 };69};70export async function loadFormatter(formatterConfig) {71 const formatterName = formatterConfig.formatterName;72 const isHumanReadableFormat = ["stylish", "pretty-error"].includes(formatterName);73 /**74 * Terminal Link is enabled when use human-readable format and option is enabled75 */76 const enableTerminalLink = isHumanReadableFormat ?? formatterConfig.terminalLink ?? false;77 debug(`formatterName: ${formatterName}`);78 try {79 const formatter = await secretlintCreateFormatter(formatterConfig);80 return {81 format: (results) => {82 return formatter.format(results);83 },84 };85 }86 catch {87 const formatter = await textlintCreateFormatter(formatterConfig);88 return {89 format: (results) => {90 return formatter.format(results.map((result) => convertSecretLintResultToTextlintResult(result, {91 enableTerminalLink,92 })));93 },94 };95 }96}97export async function secretlintCreateFormatter(formatterConfig) {98 const formatterName = formatterConfig.formatterName;99 debug(`formatterName: ${formatterName}`);100 if (BuiltInFormatters.includes(formatterName)) {101 switch (formatterName) {102 case "json":103 return {104 format: function secretlintFormatterFormat(results) {105 return jsonFormatter(results, formatterConfig);106 },107 };108 case "mask-result":109 return {110 format: function secretlintFormatterFormat(results) {111 return maskResultFormatter(results, formatterConfig);112 },113 };114 case "table":115 return {116 format: function secretlintFormatterFormat(results) {117 return tableFormatter(results, formatterConfig);118 },119 };120 }121 }122 let formatter;123 let formatterPath;124 if (fs.existsSync(formatterName)) {125 formatterPath = formatterName;126 }127 else if (fs.existsSync(path.resolve(process.cwd(), formatterName))) {128 formatterPath = path.resolve(process.cwd(), formatterName);129 }130 else {131 const pkgPath = tryResolveModule(formatterName) || tryResolveModule(`secretlint-formatter-${formatterName}`);132 if (pkgPath) {133 formatterPath = pkgPath;134 }135 }136 if (!formatterPath) {137 throw new Error(`Could not find formatter ${formatterName}`);138 }139 try {140 // dynamic import require file url141 formatter = (await dynamicImport(formatterPath, {142 parentImportMeta: import.meta,143 parentModule: "formatter",144 })).exports.default;145 }146 catch (ex) {147 throw new Error(`Could not find formatter ${formatterName}148${ex}`);149 }150 return {151 format: function secretlintFormatterFormat(results) {152 return formatter(results, formatterConfig);153 },154 };155}156export function getFormatterList() {157 const textlintFormatters = textlintGetFormatterList();158 const secretlintFormatters = secretlintGetFormatterList();159 const secretlintFormatterNames = secretlintFormatters.map((formatter) => formatter.name);160 const externalFormatters = textlintFormatters.filter((formatter) => !secretlintFormatterNames.includes(formatter.name));161 return [...externalFormatters, ...secretlintFormatters];162}163export function secretlintGetFormatterList() {164 return [165 {166 name: "json",167 },168 {169 name: "mask-result",170 },171 {172 name: "table",173 },174 ];175}176//# sourceMappingURL=index.js.map