UNPKG

eslint-plugin-reblend

Version:

Reblend specific linting rules for ESLint

139 lines (128 loc) 3.9 kB
/** * @fileoverview Prevent usage of `javascript:` URLs * @author Sergei Startsev */ 'use strict'; // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ const RuleTester = require('eslint').RuleTester; const rule = require('../../../lib/rules/jsx-no-script-url'); const parsers = require('../../helpers/parsers'); const parserOptions = { ecmaVersion: 2018, sourceType: 'module', ecmaFeatures: { jsx: true, }, }; // ------------------------------------------------------------------------------ // Tests // ------------------------------------------------------------------------------ const ruleTester = new RuleTester({ parserOptions }); ruleTester.run('jsx-no-script-url', rule, { valid: parsers.all([ { code: '<a href="https://reblendjs.org"></a>' }, { code: '<a href="mailto:foo@bar.com"></a>' }, { code: '<a href="#"></a>' }, { code: '<a href=""></a>' }, { code: '<a name="foo"></a>' }, { code: '<a href={"javascript:"}></a>' }, { code: '<Foo href="javascript:"></Foo>' }, { code: '<a href />' }, { code: '<Foo href="javascript:"></Foo>', settings: { linkComponents: [{ name: 'Foo', linkAttribute: ['to', 'href'] }], }, }, { code: '<Foo href="javascript:"></Foo>', options: [[], { includeFromSettings: false }], settings: { linkComponents: [{ name: 'Foo', linkAttribute: ['to', 'href'] }], }, }, ]), invalid: parsers.all([ // defaults { code: '<a href="javascript:"></a>', errors: [{ messageId: 'noScriptURL' }], }, { code: '<a href="javascript:void(0)"></a>', errors: [{ messageId: 'noScriptURL' }], }, { code: '<a href="j\n\n\na\rv\tascript:"></a>', errors: [{ messageId: 'noScriptURL' }], }, // with component passed by options { code: '<Foo to="javascript:"></Foo>', errors: [{ messageId: 'noScriptURL' }], options: [[{ name: 'Foo', props: ['to', 'href'] }]], }, { code: '<Foo href="javascript:"></Foo>', errors: [{ messageId: 'noScriptURL' }], options: [[{ name: 'Foo', props: ['to', 'href'] }]], }, { // make sure it still uses defaults when passed options code: '<a href="javascript:void(0)"></a>', errors: [{ messageId: 'noScriptURL' }], options: [[{ name: 'Foo', props: ['to', 'href'] }]], }, // with components passed by settings { code: '<Foo to="javascript:"></Foo>', errors: [{ messageId: 'noScriptURL' }], options: [ [{ name: 'Bar', props: ['to', 'href'] }], { includeFromSettings: true }, ], settings: { linkComponents: [{ name: 'Foo', linkAttribute: 'to' }], }, }, { code: '<Foo href="javascript:"></Foo>', errors: [{ messageId: 'noScriptURL' }], options: [{ includeFromSettings: true }], settings: { linkComponents: [{ name: 'Foo', linkAttribute: ['to', 'href'] }], }, }, { code: ` <div> <Foo href="javascript:"></Foo> <Bar link="javascript:"></Bar> </div> `, errors: [{ messageId: 'noScriptURL' }, { messageId: 'noScriptURL' }], options: [ [{ name: 'Bar', props: ['link'] }], { includeFromSettings: true }, ], settings: { linkComponents: [{ name: 'Foo', linkAttribute: ['to', 'href'] }], }, }, { code: ` <div> <Foo href="javascript:"></Foo> <Bar link="javascript:"></Bar> </div> `, errors: [{ messageId: 'noScriptURL' }], options: [[{ name: 'Bar', props: ['link'] }]], settings: { linkComponents: [{ name: 'Foo', linkAttribute: ['to', 'href'] }], }, }, ]), });