123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- "use strict";
- const ruleSeverities = new Map([
- [0, 0], ["off", 0],
- [1, 1], ["warn", 1],
- [2, 2], ["error", 2]
- ]);
- const globalVariablesValues = new Set([
- true, "true", "writable", "writeable",
- false, "false", "readonly", "readable", null,
- "off"
- ]);
- function isNonNullObject(value) {
- return typeof value === "object" && value !== null;
- }
- function isUndefined(value) {
- return typeof value === "undefined";
- }
- function deepMerge(first = {}, second = {}) {
-
- if (Array.isArray(second)) {
- return second;
- }
-
- const result = {
- ...first,
- ...second
- };
- for (const key of Object.keys(second)) {
-
- if (key === "__proto__") {
- continue;
- }
- const firstValue = first[key];
- const secondValue = second[key];
- if (isNonNullObject(firstValue)) {
- result[key] = deepMerge(firstValue, secondValue);
- } else if (isUndefined(firstValue)) {
- if (isNonNullObject(secondValue)) {
- result[key] = deepMerge(
- Array.isArray(secondValue) ? [] : {},
- secondValue
- );
- } else if (!isUndefined(secondValue)) {
- result[key] = secondValue;
- }
- }
- }
- return result;
- }
- function normalizeRuleOptions(ruleOptions) {
- const finalOptions = Array.isArray(ruleOptions)
- ? ruleOptions.slice(0)
- : [ruleOptions];
- finalOptions[0] = ruleSeverities.get(finalOptions[0]);
- return finalOptions;
- }
- function assertIsRuleOptions(value) {
- if (typeof value !== "string" && typeof value !== "number" && !Array.isArray(value)) {
- throw new TypeError("Expected a string, number, or array.");
- }
- }
- function assertIsRuleSeverity(value) {
- const severity = typeof value === "string"
- ? ruleSeverities.get(value.toLowerCase())
- : ruleSeverities.get(value);
- if (typeof severity === "undefined") {
- throw new TypeError("Expected severity of \"off\", 0, \"warn\", 1, \"error\", or 2.");
- }
- }
- function assertIsPluginMemberName(value) {
- if (!/[@a-z0-9-_$]+(?:\/(?:[a-z0-9-_$]+))+$/iu.test(value)) {
- throw new TypeError(`Expected string in the form "pluginName/objectName" but found "${value}".`);
- }
- }
- function assertIsObject(value) {
- if (!isNonNullObject(value)) {
- throw new TypeError("Expected an object.");
- }
- }
- function assertIsObjectOrString(value) {
- if ((!value || typeof value !== "object") && typeof value !== "string") {
- throw new TypeError("Expected an object or string.");
- }
- }
- const numberSchema = {
- merge: "replace",
- validate: "number"
- };
- const booleanSchema = {
- merge: "replace",
- validate: "boolean"
- };
- const deepObjectAssignSchema = {
- merge(first = {}, second = {}) {
- return deepMerge(first, second);
- },
- validate: "object"
- };
- const globalsSchema = {
- merge: "assign",
- validate(value) {
- assertIsObject(value);
- for (const key of Object.keys(value)) {
-
- if (key === "__proto__") {
- continue;
- }
- if (key !== key.trim()) {
- throw new TypeError(`Global "${key}" has leading or trailing whitespace.`);
- }
- if (!globalVariablesValues.has(value[key])) {
- throw new TypeError(`Key "${key}": Expected "readonly", "writable", or "off".`);
- }
- }
- }
- };
- const parserSchema = {
- merge: "replace",
- validate(value) {
- assertIsObjectOrString(value);
- if (typeof value === "object" && typeof value.parse !== "function" && typeof value.parseForESLint !== "function") {
- throw new TypeError("Expected object to have a parse() or parseForESLint() method.");
- }
- if (typeof value === "string") {
- assertIsPluginMemberName(value);
- }
- }
- };
- const pluginsSchema = {
- merge(first = {}, second = {}) {
- const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
- const result = {};
-
- for (const key of keys) {
-
- if (key === "__proto__") {
- continue;
- }
- if (key in first && key in second && first[key] !== second[key]) {
- throw new TypeError(`Cannot redefine plugin "${key}".`);
- }
- result[key] = second[key] || first[key];
- }
- return result;
- },
- validate(value) {
-
- if (value === null || typeof value !== "object") {
- throw new TypeError("Expected an object.");
- }
-
- for (const key of Object.keys(value)) {
-
- if (key === "__proto__") {
- continue;
- }
- if (value[key] === null || typeof value[key] !== "object") {
- throw new TypeError(`Key "${key}": Expected an object.`);
- }
- }
- }
- };
- const processorSchema = {
- merge: "replace",
- validate(value) {
- if (typeof value === "string") {
- assertIsPluginMemberName(value);
- } else if (value && typeof value === "object") {
- if (typeof value.preprocess !== "function" || typeof value.postprocess !== "function") {
- throw new TypeError("Object must have a preprocess() and a postprocess() method.");
- }
- } else {
- throw new TypeError("Expected an object or a string.");
- }
- }
- };
- const rulesSchema = {
- merge(first = {}, second = {}) {
- const result = {
- ...first,
- ...second
- };
- for (const ruleId of Object.keys(result)) {
-
- if (ruleId === "__proto__") {
-
- delete result.__proto__;
- continue;
- }
- result[ruleId] = normalizeRuleOptions(result[ruleId]);
-
- if (!(ruleId in first) || !(ruleId in second)) {
- continue;
- }
- const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
- const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
-
- if (secondRuleOptions.length === 1) {
- result[ruleId] = [secondRuleOptions[0], ...firstRuleOptions.slice(1)];
- continue;
- }
-
- }
- return result;
- },
- validate(value) {
- assertIsObject(value);
- let lastRuleId;
-
- try {
-
- for (const ruleId of Object.keys(value)) {
-
- if (ruleId === "__proto__") {
- continue;
- }
- lastRuleId = ruleId;
- const ruleOptions = value[ruleId];
- assertIsRuleOptions(ruleOptions);
- if (Array.isArray(ruleOptions)) {
- assertIsRuleSeverity(ruleOptions[0]);
- } else {
- assertIsRuleSeverity(ruleOptions);
- }
- }
- } catch (error) {
- error.message = `Key "${lastRuleId}": ${error.message}`;
- throw error;
- }
- }
- };
- const sourceTypeSchema = {
- merge: "replace",
- validate(value) {
- if (typeof value !== "string" || !/^(?:script|module|commonjs)$/u.test(value)) {
- throw new TypeError("Expected \"script\", \"module\", or \"commonjs\".");
- }
- }
- };
- exports.flatConfigSchema = {
- settings: deepObjectAssignSchema,
- linterOptions: {
- schema: {
- noInlineConfig: booleanSchema,
- reportUnusedDisableDirectives: booleanSchema
- }
- },
- languageOptions: {
- schema: {
- ecmaVersion: numberSchema,
- sourceType: sourceTypeSchema,
- globals: globalsSchema,
- parser: parserSchema,
- parserOptions: deepObjectAssignSchema
- }
- },
- processor: processorSchema,
- plugins: pluginsSchema,
- rules: rulesSchema
- };
|