mirror of https://github.com/sveltejs/svelte
commit
d983d63d72
@ -0,0 +1,15 @@
|
||||
module.exports = {
|
||||
spec: [
|
||||
'src/**/__test__.ts',
|
||||
],
|
||||
require: [
|
||||
'sucrase/register'
|
||||
],
|
||||
recursive: true,
|
||||
};
|
||||
|
||||
// add coverage options when running 'npx c8 mocha'
|
||||
if (process.env.NODE_V8_COVERAGE) {
|
||||
module.exports.fullTrace = true;
|
||||
module.exports.require.push('source-map-support/register');
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
if (process.env.SKIP_PREPARE) {
|
||||
console.log('Skipped "prepare" script');
|
||||
} else {
|
||||
const { execSync } = require("child_process");
|
||||
const command = process.argv.slice(2).join(" ");
|
||||
execSync(command, { stdio: "inherit" });
|
||||
}
|
||||
@ -1,3 +1,5 @@
|
||||
export function is_head(node) {
|
||||
return node && node.type === 'MemberExpression' && node.object.name === '@_document' && node.property.name === 'head';
|
||||
import { Node } from 'estree';
|
||||
|
||||
export function is_head(node: Node) {
|
||||
return node && node.type === 'MemberExpression' && node.object['name'] === '@_document' && node.property['name'] === 'head';
|
||||
}
|
||||
|
||||
@ -1,6 +1,24 @@
|
||||
export const whitespace = /[ \t\r\n]/;
|
||||
export const start_whitespace = /^[ \t\r\n]*/;
|
||||
export const end_whitespace = /[ \t\r\n]*$/;
|
||||
export const start_newline = /^\r?\n/;
|
||||
export const regex_whitespace = /\s/;
|
||||
export const regex_whitespaces = /\s+/;
|
||||
export const regex_starts_with_whitespace = /^\s/;
|
||||
export const regex_starts_with_whitespaces = /^[ \t\r\n]*/;
|
||||
export const regex_ends_with_whitespace = /\s$/;
|
||||
export const regex_ends_with_whitespaces = /[ \t\r\n]*$/;
|
||||
export const regex_only_whitespaces = /^\s+$/;
|
||||
|
||||
export const dimensions = /^(?:offset|client)(?:Width|Height)$/;
|
||||
export const regex_whitespace_characters = /\s/g;
|
||||
export const regex_non_whitespace_character = /\S/;
|
||||
|
||||
export const regex_starts_with_newline = /^\r?\n/;
|
||||
export const regex_not_newline_characters = /[^\n]/g;
|
||||
|
||||
export const regex_double_quotes = /"/g;
|
||||
|
||||
export const regex_backslashes = /\\/g;
|
||||
|
||||
export const regex_starts_with_underscore = /^_/;
|
||||
export const regex_ends_with_underscore = /_$/;
|
||||
|
||||
export const regex_invalid_variable_identifier_characters = /[^a-zA-Z0-9_$]/g;
|
||||
|
||||
export const regex_dimensions = /^(?:offset|client)(?:Width|Height)$/;
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { start_whitespace, end_whitespace } from './patterns';
|
||||
import { regex_starts_with_whitespaces, regex_ends_with_whitespaces } from './patterns';
|
||||
|
||||
export function trim_start(str: string) {
|
||||
return str.replace(start_whitespace, '');
|
||||
return str.replace(regex_starts_with_whitespaces, '');
|
||||
}
|
||||
|
||||
export function trim_end(str: string) {
|
||||
return str.replace(end_whitespace, '');
|
||||
return str.replace(regex_ends_with_whitespaces, '');
|
||||
}
|
||||
|
||||
@ -0,0 +1 @@
|
||||
<div style:color|important={myColor}></div>
|
||||
@ -0,0 +1,50 @@
|
||||
{
|
||||
"html": {
|
||||
"start": 0,
|
||||
"end": 43,
|
||||
"type": "Fragment",
|
||||
"children": [
|
||||
{
|
||||
"start": 0,
|
||||
"end": 43,
|
||||
"type": "Element",
|
||||
"name": "div",
|
||||
"attributes": [
|
||||
{
|
||||
"start": 5,
|
||||
"end": 36,
|
||||
"type": "StyleDirective",
|
||||
"name": "color",
|
||||
"modifiers": [
|
||||
"important"
|
||||
],
|
||||
"value": [
|
||||
{
|
||||
"start": 27,
|
||||
"end": 36,
|
||||
"type": "MustacheTag",
|
||||
"expression": {
|
||||
"type": "Identifier",
|
||||
"start": 28,
|
||||
"end": 35,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 28
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 35
|
||||
}
|
||||
},
|
||||
"name": "myColor"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
export default {
|
||||
html: `
|
||||
<h1 class="svelte-szzkfu" style="background-color: red;">hello</h1>
|
||||
<h1 class="svelte-szzkfu" style="background-color: red !important;">hello</h1>
|
||||
`,
|
||||
|
||||
ssrHtml: `
|
||||
<h1 class="svelte-szzkfu" style="background-color: red;">hello</h1>
|
||||
<h1 class="svelte-szzkfu" style="background-color: red !important;">hello</h1>
|
||||
`,
|
||||
|
||||
test({ assert, target, window, component }) {
|
||||
const h1s = target.querySelectorAll('h1');
|
||||
|
||||
assert.equal(window.getComputedStyle(h1s[0])['backgroundColor'], 'rgb(0, 0, 255)');
|
||||
assert.equal(window.getComputedStyle(h1s[1])['backgroundColor'], 'rgb(255, 0, 0)');
|
||||
|
||||
component.color = 'yellow';
|
||||
assert.equal(window.getComputedStyle(h1s[0])['backgroundColor'], 'rgb(0, 0, 255)');
|
||||
assert.equal(window.getComputedStyle(h1s[1])['backgroundColor'], 'rgb(255, 255, 0)');
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,12 @@
|
||||
<script>
|
||||
export let color = 'red'
|
||||
</script>
|
||||
|
||||
<h1 style:background-color={color} >hello</h1>
|
||||
<h1 style:background-color|important="{color}">hello</h1>
|
||||
|
||||
<style>
|
||||
h1 {
|
||||
background-color: blue !important;
|
||||
}
|
||||
</style>
|
||||
@ -1,5 +1,6 @@
|
||||
export default {
|
||||
compileOptions: {
|
||||
hydratable: true
|
||||
}
|
||||
},
|
||||
withoutNormalizeHtml: true
|
||||
};
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"code": "assignment-to-const",
|
||||
"message": "You are assigning to a const",
|
||||
"start": {
|
||||
"line": 13,
|
||||
"column": 24,
|
||||
"character": 282
|
||||
},
|
||||
"end": {
|
||||
"line": 13,
|
||||
"column": 35,
|
||||
"character": 293
|
||||
},
|
||||
"pos": 282
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,15 @@
|
||||
<script>
|
||||
const immutable = 0;
|
||||
|
||||
const obj1 = { prop: true };
|
||||
const obj2 = { prop: 0 }
|
||||
</script>
|
||||
|
||||
<!-- should not error -->
|
||||
<button on:click={() => obj1.prop = false}>click</button>
|
||||
<button on:click={() => obj2.prop++}>click</button>
|
||||
|
||||
<!-- should error -->
|
||||
<button on:click={() => immutable++}>click</button>
|
||||
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"code": "assignment-to-const",
|
||||
"message": "You are assigning to a const",
|
||||
"start": {
|
||||
"line": 14,
|
||||
"column": 3,
|
||||
"character": 172
|
||||
},
|
||||
"end": {
|
||||
"line": 14,
|
||||
"column": 10,
|
||||
"character": 179
|
||||
},
|
||||
"pos": 172
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,20 @@
|
||||
<script>
|
||||
const foo = 'hello';
|
||||
|
||||
function shouldNotError() {
|
||||
let foo = 0;
|
||||
|
||||
function inner() {
|
||||
foo = 1;
|
||||
}
|
||||
}
|
||||
|
||||
function shouldError() {
|
||||
function inner() {
|
||||
foo = 1;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<button on:click={shouldNotError}>click</button>
|
||||
<button on:click={shouldError}>click</button>
|
||||
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"code": "assignment-to-const",
|
||||
"message": "You are assigning to a const",
|
||||
"start": {
|
||||
"line": 17,
|
||||
"column": 2,
|
||||
"character": 189
|
||||
},
|
||||
"end": {
|
||||
"line": 17,
|
||||
"column": 9,
|
||||
"character": 196
|
||||
},
|
||||
"pos": 189
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
<script>
|
||||
const foo = 'hello';
|
||||
</script>
|
||||
|
||||
<button on:click={() => {
|
||||
let foo = 0;
|
||||
|
||||
function inner() {
|
||||
foo = 1;
|
||||
}
|
||||
}}>
|
||||
click
|
||||
</button>
|
||||
|
||||
<button on:click={() => {
|
||||
function inner() {
|
||||
foo = 1;
|
||||
}
|
||||
}}>
|
||||
click
|
||||
</button>
|
||||
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"code": "assignment-to-const",
|
||||
"message": "You are assigning to a const",
|
||||
"start": {
|
||||
"line": 16,
|
||||
"column": 2,
|
||||
"character": 225
|
||||
},
|
||||
"end": {
|
||||
"line": 16,
|
||||
"column": 18,
|
||||
"character": 241
|
||||
},
|
||||
"pos": 225
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,24 @@
|
||||
<script>
|
||||
const immutable = false;
|
||||
|
||||
const obj1 = { prop: true };
|
||||
const obj2 = { prop: 0 };
|
||||
|
||||
function shouldNotError() {
|
||||
obj1.prop = false;
|
||||
}
|
||||
|
||||
function shouldNotError2() {
|
||||
obj2.prop++;
|
||||
}
|
||||
|
||||
function shouldError() {
|
||||
immutable = true
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<button on:click={shouldNotError}>click</button>
|
||||
<button on:click={shouldNotError2}>click</button>
|
||||
<button on:click={shouldError}>click</button>
|
||||
@ -0,0 +1,31 @@
|
||||
<a href="https://svelte.dev" target="_blank">svelte website (invalid)</a>
|
||||
<a href="https://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href="https://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href={'https://svelte.dev'} target="_blank">svelte website (invalid)</a>
|
||||
<a href={'https://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href={'https://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href="//svelte.dev" target="_blank">svelte website (invalid)</a>
|
||||
<a href="//svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href="//svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href="http://svelte.dev" target="_blank">svelte website (invalid)</a>
|
||||
<a href="http://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href="http://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href="HTTP://svelte.dev" target="_blank">svelte website (invalid)</a>
|
||||
<a href="HTTP://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href="HTTP://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href={'HTTPS://svelte.dev'} target="_blank">svelte website (invalid)</a>
|
||||
<a href={'HTTPS://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a>
|
||||
<a href={'HTTPS://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a>
|
||||
<a href="same-host" target="_blank">Same host (valid)</a>
|
||||
<a href="same-host" target="_blank" rel="">Same host (valid)</a>
|
||||
<a href="same-host" target="_blank" rel="noopener">Same host (valid)</a>
|
||||
<a href="http://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
|
||||
<a href="http://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
|
||||
<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
|
||||
<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
|
||||
<a href="https://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
|
||||
<a href="https://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
|
||||
<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
|
||||
<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
|
||||
<a href="//svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
|
||||
<a href="//svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
|
||||
@ -0,0 +1,272 @@
|
||||
[
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 73,
|
||||
"column": 73,
|
||||
"line": 1
|
||||
},
|
||||
"pos": 0,
|
||||
"start": {
|
||||
"character": 0,
|
||||
"column": 0,
|
||||
"line": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 154,
|
||||
"column": 80,
|
||||
"line": 2
|
||||
},
|
||||
"pos": 74,
|
||||
"start": {
|
||||
"character": 74,
|
||||
"column": 0,
|
||||
"line": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 243,
|
||||
"column": 88,
|
||||
"line": 3
|
||||
},
|
||||
"pos": 155,
|
||||
"start": {
|
||||
"character": 155,
|
||||
"column": 0,
|
||||
"line": 3
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 319,
|
||||
"column": 75,
|
||||
"line": 4
|
||||
},
|
||||
"pos": 244,
|
||||
"start": {
|
||||
"character": 244,
|
||||
"column": 0,
|
||||
"line": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 402,
|
||||
"column": 82,
|
||||
"line": 5
|
||||
},
|
||||
"pos": 320,
|
||||
"start": {
|
||||
"character": 320,
|
||||
"column": 0,
|
||||
"line": 5
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 493,
|
||||
"column": 90,
|
||||
"line": 6
|
||||
},
|
||||
"pos": 403,
|
||||
"start": {
|
||||
"character": 403,
|
||||
"column": 0,
|
||||
"line": 6
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 561,
|
||||
"column": 67,
|
||||
"line": 7
|
||||
},
|
||||
"pos": 494,
|
||||
"start": {
|
||||
"character": 494,
|
||||
"column": 0,
|
||||
"line": 7
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 636,
|
||||
"column": 74,
|
||||
"line": 8
|
||||
},
|
||||
"pos": 562,
|
||||
"start": {
|
||||
"character": 562,
|
||||
"column": 0,
|
||||
"line": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 719,
|
||||
"column": 82,
|
||||
"line": 9
|
||||
},
|
||||
"pos": 637,
|
||||
"start": {
|
||||
"character": 637,
|
||||
"column": 0,
|
||||
"line": 9
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 792,
|
||||
"column": 72,
|
||||
"line": 10
|
||||
},
|
||||
"pos": 720,
|
||||
"start": {
|
||||
"character": 720,
|
||||
"column": 0,
|
||||
"line": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 872,
|
||||
"column": 79,
|
||||
"line": 11
|
||||
},
|
||||
"pos": 793,
|
||||
"start": {
|
||||
"character": 793,
|
||||
"column": 0,
|
||||
"line": 11
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 960,
|
||||
"column": 87,
|
||||
"line": 12
|
||||
},
|
||||
"pos": 873,
|
||||
"start": {
|
||||
"character": 873,
|
||||
"column": 0,
|
||||
"line": 12
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1033,
|
||||
"column": 72,
|
||||
"line": 13
|
||||
},
|
||||
"pos": 961,
|
||||
"start": {
|
||||
"character": 961,
|
||||
"column": 0,
|
||||
"line": 13
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1113,
|
||||
"column": 79,
|
||||
"line": 14
|
||||
},
|
||||
"pos": 1034,
|
||||
"start": {
|
||||
"character": 1034,
|
||||
"column": 0,
|
||||
"line": 14
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1201,
|
||||
"column": 87,
|
||||
"line": 15
|
||||
},
|
||||
"pos": 1114,
|
||||
"start": {
|
||||
"character": 1114,
|
||||
"column": 0,
|
||||
"line": 15
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1277,
|
||||
"column": 75,
|
||||
"line": 16
|
||||
},
|
||||
"pos": 1202,
|
||||
"start": {
|
||||
"character": 1202,
|
||||
"column": 0,
|
||||
"line": 16
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1360,
|
||||
"column": 82,
|
||||
"line": 17
|
||||
},
|
||||
"pos": 1278,
|
||||
"start": {
|
||||
"character": 1278,
|
||||
"column": 0,
|
||||
"line": 17
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "security-anchor-rel-noreferrer",
|
||||
"message": "Security: Anchor with \"target=_blank\" should have rel attribute containing the value \"noreferrer\"",
|
||||
"end": {
|
||||
"character": 1451,
|
||||
"column": 90,
|
||||
"line": 18
|
||||
},
|
||||
"pos": 1361,
|
||||
"start": {
|
||||
"character": 1361,
|
||||
"column": 0,
|
||||
"line": 18
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,15 @@
|
||||
[{
|
||||
"message": "Valid modifiers for style directives are: important",
|
||||
"code": "invalid-style-directive-modifier",
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 8,
|
||||
"character": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 29,
|
||||
"character": 29
|
||||
},
|
||||
"pos": 8
|
||||
}]
|
||||
@ -0,0 +1 @@
|
||||
<button style:color|bad='red'></button>
|
||||
Loading…
Reference in new issue