You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
72 lines
2.1 KiB
/** |
|
* @fileoverview Utility functions for React pragma configuration |
|
* @author Yannick Croissant |
|
*/ |
|
|
|
'use strict'; |
|
|
|
const JSX_ANNOTATION_REGEX = /@jsx\s+([^\s]+)/; |
|
// Does not check for reserved keywords or unicode characters |
|
const JS_IDENTIFIER_REGEX = /^[_$a-zA-Z][_$a-zA-Z0-9]*$/; |
|
|
|
/** |
|
* @param {Context} context |
|
* @returns {string} |
|
*/ |
|
function getCreateClassFromContext(context) { |
|
let pragma = 'createReactClass'; |
|
// .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings) |
|
if (context.settings.react && context.settings.react.createClass) { |
|
pragma = context.settings.react.createClass; |
|
} |
|
if (!JS_IDENTIFIER_REGEX.test(pragma)) { |
|
throw new Error(`createClass pragma ${pragma} is not a valid function name`); |
|
} |
|
return pragma; |
|
} |
|
|
|
/** |
|
* @param {Context} context |
|
* @returns {string} |
|
*/ |
|
function getFragmentFromContext(context) { |
|
let pragma = 'Fragment'; |
|
// .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings) |
|
if (context.settings.react && context.settings.react.fragment) { |
|
pragma = context.settings.react.fragment; |
|
} |
|
if (!JS_IDENTIFIER_REGEX.test(pragma)) { |
|
throw new Error(`Fragment pragma ${pragma} is not a valid identifier`); |
|
} |
|
return pragma; |
|
} |
|
|
|
/** |
|
* @param {Context} context |
|
* @returns {string} |
|
*/ |
|
function getFromContext(context) { |
|
let pragma = 'React'; |
|
|
|
const sourceCode = context.getSourceCode(); |
|
const pragmaNode = sourceCode.getAllComments().find((node) => JSX_ANNOTATION_REGEX.test(node.value)); |
|
|
|
if (pragmaNode) { |
|
const matches = JSX_ANNOTATION_REGEX.exec(pragmaNode.value); |
|
pragma = matches[1].split('.')[0]; |
|
// .eslintrc shared settings (https://eslint.org/docs/user-guide/configuring#adding-shared-settings) |
|
} else if (context.settings.react && context.settings.react.pragma) { |
|
pragma = context.settings.react.pragma; |
|
} |
|
|
|
if (!JS_IDENTIFIER_REGEX.test(pragma)) { |
|
throw new Error(`React pragma ${pragma} is not a valid identifier`); |
|
} |
|
return pragma; |
|
} |
|
|
|
module.exports = { |
|
getCreateClassFromContext, |
|
getFragmentFromContext, |
|
getFromContext, |
|
};
|
|
|