Source code

Revision control

Copy as Markdown

Other Tools

/**
* @license
* Copyright 2025 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
import {ESLintUtils} from '@typescript-eslint/utils';
const createRule = ESLintUtils.RuleCreator<{
requiresTypeChecking: boolean;
}>(name => {
});
const noInvalidSetContentRule = createRule({
name: 'no-quirks-mode-set-content',
meta: {
type: 'problem',
docs: {
requiresTypeChecking: false,
description:
'Enforce that page.setContent() is called with the html tagged template literal.',
},
messages: {
missingHtml:
'page.setContent() should not use Quirks mode, if needed use htmlRaw``',
},
fixable: 'code',
schema: [],
},
defaultOptions: [],
create(context) {
return {
CallExpression(node) {
const callee = node.callee;
if (callee.type !== 'MemberExpression') {
return;
}
const object = callee.object;
const property = callee.property;
if (
object.type !== 'Identifier' ||
object.name !== 'page' ||
property.type !== 'Identifier' ||
property.name !== 'setContent'
) {
return;
}
const firstArg = node.arguments[0];
let isArgumentValid = false;
if (firstArg) {
if (firstArg.type === 'TaggedTemplateExpression') {
const tag = firstArg.tag;
if (
tag.type === 'Identifier' &&
(tag.name === 'html' || tag.name === 'htmlRaw')
) {
isArgumentValid = true;
}
}
}
if (!isArgumentValid) {
context.report({
node: node,
messageId: 'missingHtml',
fix(fixer) {
const argToFix = node.arguments[0];
if (!argToFix) {
return null;
}
if (argToFix.type === 'TemplateLiteral') {
return fixer.insertTextBefore(argToFix, 'html');
}
if (
argToFix.type === 'Literal' &&
typeof argToFix.value === 'string'
) {
return fixer.replaceText(argToFix, `html\`${argToFix.value}\``);
}
const argText = context.sourceCode.getText(argToFix);
return fixer.replaceText(argToFix, `html\`\${${argText}}\``);
},
});
}
},
};
},
});
export default noInvalidSetContentRule;