mirror of
https://github.com/groldsf/obsidian_check_plugin.git
synced 2026-07-22 12:00:31 +00:00
78 lines
3.8 KiB
JavaScript
78 lines
3.8 KiB
JavaScript
import { promises } from "fs";
|
||
|
||
/**
|
||
* Плагин esbuild для обертывания вызовов console.* в условие.
|
||
* @param {object} options
|
||
* @param {string} [options.debugFlagName='DEBUG_WRAP_CONSOLE_PLUGIN_FLAG'] - Имя глобальной переменной для проверки.
|
||
* @param {string[]} [options.methods=['log', 'warn', 'info', 'debug', 'error']] - Методы console, которые нужно обернуть.
|
||
* @returns {import('esbuild').Plugin}
|
||
*/
|
||
export const debugWrapConsolePlugin = ({
|
||
debugFlagName = "DEBUG_WRAP_CONSOLE_PLUGIN_FLAG", // Имя глобального флага (лучше сделать уникальным для вашего плагина)
|
||
methods = ["log", "warn", "info", "debug", "error"], // Какие методы console оборачивать
|
||
} = {}) => ({
|
||
name: "debug-wrap-console",
|
||
setup(build) {
|
||
// Создаем фильтр для методов console
|
||
const methodsPattern = methods.join("|");
|
||
// Регулярное выражение для поиска вызовов console.method(...)
|
||
// Оно пытается обработать простые случаи, но может быть неидеальным для сложных вложенных выражений или многострочных вызовов.
|
||
// $& в замене представляет всю совпавшую строку.
|
||
const consoleRegex = new RegExp(
|
||
// Match 'console.' followed by one of the specified methods
|
||
`(^|\\s+|\\{|\\;)(console\\.(${methodsPattern}))\\s*\\(` +
|
||
// Match arguments (non-greedy) - this is the tricky part and might not capture perfectly balanced parentheses in all complex cases
|
||
`([\\s\\S]*?)` +
|
||
// Match the closing parenthesis and optional semicolon
|
||
`\\)(;?)`,
|
||
"g" // Global search
|
||
);
|
||
|
||
const wrapperStart = `if (window.${debugFlagName}) { `;
|
||
const wrapperEnd = ` }`;
|
||
|
||
// Перехватываем загрузку JS/TS файлов
|
||
build.onLoad({ filter: /\.[jt]sx?$/ }, async (args) => {
|
||
try {
|
||
// Читаем содержимое файла
|
||
const source = await promises.readFile(args.path, "utf8");
|
||
|
||
// Заменяем вызовы console.*
|
||
const contents = source.replace(
|
||
consoleRegex,
|
||
(match, prefix, fullCall, methodName, argsContent, semicolon) => {
|
||
// prefix: Пробел, начало строки, {, ; перед вызовом console
|
||
// fullCall: Сам вызов, например, console.log
|
||
// methodName: Имя метода, например, log
|
||
// argsContent: Содержимое скобок
|
||
// semicolon: Завершающая точка с запятой (если была)
|
||
|
||
// Собираем обернутый вызов
|
||
// Мы используем 'match' целиком, чтобы сохранить оригинальное форматирование и содержимое,
|
||
// но убираем исходный префикс (пробел/начало строки/итд) и добавляем его перед if.
|
||
const originalCall = match.substring(prefix.length);
|
||
return `${prefix}${wrapperStart}${originalCall}${wrapperEnd}`;
|
||
}
|
||
);
|
||
|
||
// Возвращаем измененное содержимое и указываем esbuild,
|
||
// что это все еще JS/TS код (в зависимости от исходного файла)
|
||
const loader =
|
||
args.path.endsWith(".ts") || args.path.endsWith(".tsx") ? "ts" : "js";
|
||
|
||
return {
|
||
contents,
|
||
loader,
|
||
};
|
||
} catch (error) {
|
||
console.error(
|
||
`Error processing file ${args.path} in debug-wrap-console plugin:`,
|
||
error
|
||
);
|
||
// В случае ошибки возвращаем null или выбрасываем ошибку, чтобы сборка прервалась
|
||
return null;
|
||
}
|
||
});
|
||
},
|
||
});
|
||
|