1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 'use strict';
- const {methodCallSelector} = require('./selectors/index.js');
- const {appendArgument} = require('./fix/index.js');
- const ERROR = 'error';
- const SUGGESTION = 'suggestion';
- const messages = {
- [ERROR]: 'Missing the `targetOrigin` argument.',
- [SUGGESTION]: 'Use `{{code}}`.',
- };
- /** @param {import('eslint').Rule.RuleContext} context */
- function create(context) {
- const sourceCode = context.getSourceCode();
- return {
- [methodCallSelector({method: 'postMessage', argumentsLength: 1})](node) {
- const [penultimateToken, lastToken] = sourceCode.getLastTokens(node, 2);
- const replacements = [];
- const target = node.callee.object;
- if (target.type === 'Identifier') {
- const {name} = target;
- replacements.push(`${name}.location.origin`);
- if (name !== 'self' && name !== 'window' && name !== 'globalThis') {
- replacements.push('self.location.origin');
- }
- } else {
- replacements.push('self.location.origin');
- }
- replacements.push('\'*\'');
- return {
- loc: {
- start: penultimateToken.loc.end,
- end: lastToken.loc.end,
- },
- messageId: ERROR,
- suggest: replacements.map(code => ({
- messageId: SUGGESTION,
- data: {code},
- /** @param {import('eslint').Rule.RuleFixer} fixer */
- fix: fixer => appendArgument(fixer, node, code, sourceCode),
- })),
- };
- },
- };
- }
- /** @type {import('eslint').Rule.RuleModule} */
- module.exports = {
- create,
- meta: {
- type: 'problem',
- docs: {
- description: 'Enforce using the `targetOrigin` argument with `window.postMessage()`.',
- },
- hasSuggestions: true,
- messages,
- },
- };
|