12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /**
- * @author Toru Nagashima <https://github.com/mysticatea>
- * See LICENSE file in root directory for full license.
- */
- "use strict"
- /**
- * Checks whether it is string literal
- * @param {string} s string source code
- * @returns {boolean} true: is string literal source code
- */
- function isStringLiteralCode(s) {
- return (
- (s.startsWith("'") && s.endsWith("'")) ||
- (s.startsWith('"') && s.endsWith('"'))
- )
- }
- /**
- * Transform template literal to string concatenation.
- * @param {ASTNode} node TemplateLiteral node.(not within TaggedTemplateExpression)
- * @param {SourceCode} sourceCode SourceCode
- * @returns {string} After transformation
- */
- function templateLiteralToStringConcat(node, sourceCode) {
- const ss = []
- node.quasis.forEach((q, i) => {
- const value = q.value.cooked
- if (value) {
- ss.push(JSON.stringify(value))
- }
- if (i < node.expressions.length) {
- const e = node.expressions[i]
- const text = sourceCode.getText(e)
- ss.push(text)
- }
- })
- if (!ss.length || !isStringLiteralCode(ss[0])) {
- ss.unshift('""')
- }
- return ss.join("+")
- }
- module.exports = {
- meta: {
- docs: {
- description: "disallow template literals.",
- category: "ES2015",
- recommended: false,
- url:
- "http://mysticatea.github.io/eslint-plugin-es/rules/no-template-literals.html",
- },
- fixable: "code",
- messages: {
- forbidden: "ES2015 template literals are forbidden.",
- },
- schema: [],
- type: "problem",
- },
- create(context) {
- const sourceCode = context.getSourceCode()
- return {
- "TaggedTemplateExpression, :not(TaggedTemplateExpression) > TemplateLiteral"(
- node
- ) {
- context.report({
- node,
- messageId: "forbidden",
- fix:
- node.type === "TemplateLiteral"
- ? fixer =>
- fixer.replaceText(
- node,
- templateLiteralToStringConcat(
- node,
- sourceCode
- )
- )
- : undefined,
- })
- },
- }
- },
- }
|