UNPKG

eslint-plugin-jsonc

Version:

ESLint plugin for JSON, JSONC and JSON5 files.

72 lines (71 loc) 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("../utils"); const get_auto_jsonc_rules_config_1 = require("../utils/get-auto-jsonc-rules-config"); exports.default = (0, utils_1.createRule)("auto", { meta: { docs: { description: "apply jsonc rules similar to your configured ESLint core rules", recommended: null, extensionRule: false, layout: false, }, fixable: "code", schema: [], messages: {}, type: "suggestion", }, create(context, params) { if (!context.sourceCode.parserServices.isJSON) { return {}; } const autoConfig = (0, get_auto_jsonc_rules_config_1.getAutoConfig)(context.cwd, context.filename); const visitor = {}; for (const ruleId of Object.keys(autoConfig)) { const rule = require(`./${ruleId.replace(/^jsonc\//u, "")}`).default; const subContext = { __proto__: context, options: getRuleOptions(autoConfig[ruleId], rule.jsoncDefineRule), report(options) { if (options.messageId) { options.message = `[${ruleId}] ${rule.meta.messages[options.messageId]}`; delete options.messageId; } else { options.message = `[${ruleId}] ${options.message}`; } context.report(options); }, }; const ruleVisitor = rule.jsoncDefineRule.create(subContext, params); for (const key of Object.keys(ruleVisitor)) { const newVisit = ruleVisitor[key]; const oldVisit = visitor[key]; if (!newVisit) { continue; } if (!oldVisit) { visitor[key] = ruleVisitor[key]; } else { visitor[key] = ((...args) => { oldVisit(...args); newVisit(...args); }); } } } return visitor; }, }); function getRuleOptions(options, rule) { const jsonOptions = Array.isArray(options) ? options.slice(1) : []; if (rule.meta.defaultOptions) { rule.meta.defaultOptions.forEach((option, index) => { if (jsonOptions[index] === undefined) { jsonOptions[index] = option; } }); } return jsonOptions; }