UNPKG

@vrcd-community/zhlint

Version:

A linting tool for Chinese language.

129 lines (128 loc) 4.82 kB
import { resolve } from 'path'; import fs from 'fs'; import { env } from '../report.js'; // to walk around https://github.com/davidmyersdev/vite-plugin-node-polyfills/issues/82 const { existsSync, readFileSync } = fs || {}; const DEFAULT_CONFIG_PATH = '.zhlintrc'; const DEFAULT_FILE_IGNORE_PATH = '.zhlintignore'; const DEFAULT_CASE_IGNORE_PATH = '.zhlintcaseignore'; const resolvePath = (dir, config, fileIgnore, caseIgnore, logger = env.defaultLogger) => { const result = { config: undefined, fileIgnore: undefined, caseIgnore: undefined }; dir = resolve(dir !== null && dir !== void 0 ? dir : '.'); if (!existsSync(dir)) { logger.log(`"${dir}" does not exist.`); return result; } config = resolve(dir, config !== null && config !== void 0 ? config : DEFAULT_CONFIG_PATH); if (existsSync(config)) { result.config = config; } else { logger.log(`Config file "${config}" does not exist. Will proceed as default.`); } fileIgnore = resolve(dir, fileIgnore !== null && fileIgnore !== void 0 ? fileIgnore : DEFAULT_FILE_IGNORE_PATH); if (existsSync(fileIgnore)) { result.fileIgnore = fileIgnore; } else { logger.log(`Global ignored cases file "${fileIgnore}" does not exist. Will proceed as none.`); } caseIgnore = resolve(dir, caseIgnore !== null && caseIgnore !== void 0 ? caseIgnore : DEFAULT_CASE_IGNORE_PATH); if (existsSync(caseIgnore)) { result.caseIgnore = caseIgnore; } else { logger.log(`Global ignored cases file "${caseIgnore}" does not exist. Will proceed as none.`); } return result; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const readJSONSync = (filepath) => { const output = readFileSync(filepath, { encoding: 'utf8' }); return JSON.parse(output); }; const resolveConfig = (normalizedConfigPath, normalizedFileIgnorePath, normalizedCaseIgnorePath, logger = env.defaultLogger) => { const result = { preset: 'default' }; if (normalizedConfigPath) { try { const config = readJSONSync(normalizedConfigPath); if (typeof config.preset === 'string') { result.preset = config.preset; } if (typeof config.rules === 'object') { result.rules = config.rules; } if (Array.isArray(config.hyperParsers)) { result.hyperParsers = config.hyperParsers; } if (Array.isArray(config.fileIgnores)) { result.fileIgnores = config.fileIgnores; } if (Array.isArray(config.caseIgnores)) { result.caseIgnores = config.caseIgnores; } } catch (error) { logger.log(`Failed to read "${normalizedConfigPath}": ${error.message}`); } } if (normalizedFileIgnorePath) { try { const fileIgnores = readFileSync(normalizedFileIgnorePath, { encoding: 'utf8' }); fileIgnores .split(/\n/) .map((x) => x.trim()) .forEach((x) => { if (!x) { return; } if (!result.fileIgnores) { result.fileIgnores = []; } if (result.fileIgnores.indexOf(x) === -1) { result.fileIgnores.push(x); } }); } catch (error) { logger.log(`Failed to read "${normalizedFileIgnorePath}": ${error.message}`); } } if (normalizedCaseIgnorePath) { try { const caseIgnores = readFileSync(normalizedCaseIgnorePath, { encoding: 'utf8' }); caseIgnores .split(/\n/) .map((x) => x.trim()) .forEach((x) => { if (!x) { return; } if (!result.caseIgnores) { result.caseIgnores = []; } if (result.caseIgnores.indexOf(x) === -1) { result.caseIgnores.push(x); } }); } catch (error) { logger.log(`Failed to read "${normalizedCaseIgnorePath}": ${error.message}`); } } return result; }; export const readRc = (dir, config, fileIgnore, caseIgnore, logger = env.defaultLogger) => { const { config: normalizedConfigPath, fileIgnore: normalizedFileIgnorePath, caseIgnore: normalizedCaseIgnorePath } = resolvePath(dir, config, fileIgnore, caseIgnore, logger); return resolveConfig(normalizedConfigPath, normalizedFileIgnorePath, normalizedCaseIgnorePath, logger); };