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.
85 lines
2.5 KiB
85 lines
2.5 KiB
/** |
|
* @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, |
|
}) |
|
}, |
|
} |
|
}, |
|
}
|
|
|