Skip to content

Commit

Permalink
feat: implemented the valid-style-parse rule (#1054)
Browse files Browse the repository at this point in the history
  • Loading branch information
marekdedic authored Feb 9, 2025
1 parent 1395d5d commit c587629
Show file tree
Hide file tree
Showing 17 changed files with 249 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/stupid-penguins-smoke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'eslint-plugin-svelte': minor
---

feat: added the valid-style-parse rule
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ These rules relate to possible syntax or logic errors in Svelte code:
| [svelte/require-store-callbacks-use-set-param](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-callbacks-use-set-param/) | store callbacks must use `set` param | |
| [svelte/require-store-reactive-access](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-reactive-access/) | disallow to use of the store itself as an operand. Need to use $ prefix or get function. | :star::wrench: |
| [svelte/valid-compile](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-compile/) | disallow warnings when compiling. | |
| [svelte/valid-style-parse](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-style-parse/) | require valid style element parsing | |

## Security Vulnerability

Expand Down
1 change: 1 addition & 0 deletions docs/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ These rules relate to possible syntax or logic errors in Svelte code:
| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param | |
| [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md) | disallow to use of the store itself as an operand. Need to use $ prefix or get function. | :star::wrench: |
| [svelte/valid-compile](./rules/valid-compile.md) | disallow warnings when compiling. | |
| [svelte/valid-style-parse](./rules/valid-style-parse.md) | require valid style element parsing | |

## Security Vulnerability

Expand Down
78 changes: 78 additions & 0 deletions docs/rules/valid-style-parse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
---
pageClass: 'rule-details'
sidebarDepth: 0
title: 'svelte/valid-style-parse'
description: 'require valid style element parsing'
---

# svelte/valid-style-parse

> require valid style element parsing
- :exclamation: <badge text="This rule has not been released yet." vertical="middle" type="error"> **_This rule has not been released yet._** </badge>

## :book: Rule Details

This rule reports issues with parsing of the `<style>` element by the svelte-eslint-parser.

<!--eslint-skip-->

```svelte
<script>
/* eslint svelte/valid-style-parse: ["error"] */
</script>
<!-- ✓ GOOD -->
<style>
.class {
font-weight: bold;
}
</style>
```

```svelte
<script>
/* eslint svelte/valid-style-parse: ["error"] */
</script>
<!-- ✓ GOOD -->
<style lang="scss">
.class {
font-weight: bold;
}
</style>
```

```svelte
<script>
/* eslint svelte/valid-style-parse: ["error"] */
</script>
<!-- ✗ BAD -->
<style>
.class
font-weight: bold;
</style>
```

```svelte
<script>
/* eslint svelte/valid-style-parse: ["error"] */
</script>
<!-- ✗ BAD -->
<style lang="unknown">
.class {
font-weight: bold;
}
</style>
```

## :wrench: Options

Nothing.

## :mag: Implementation

- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts)
- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts)
5 changes: 5 additions & 0 deletions packages/eslint-plugin-svelte/src/rule-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,11 @@ export interface RuleOptions {
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-prop-names-in-kit-pages/
*/
'svelte/valid-prop-names-in-kit-pages'?: Linter.RuleEntry<[]>
/**
* require valid style element parsing
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-style-parse/
*/
'svelte/valid-style-parse'?: Linter.RuleEntry<[]>
}

/* ======= Declarations ======= */
Expand Down
40 changes: 40 additions & 0 deletions packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { createRule } from '../utils/index.js';
import { getCwd, getSourceCode } from '../utils/compat.js';

export default createRule('valid-style-parse', {
meta: {
docs: {
description: 'require valid style element parsing',
category: 'Possible Errors',
recommended: false
},
schema: [],
messages: {},
type: 'problem'
},
create(context) {
const sourceCode = getSourceCode(context);
if (!sourceCode.parserServices.isSvelte) {
return {};
}
const cwd = `${getCwd(context)}/`;

return {
SvelteStyleElement(node) {
const styleContext = sourceCode.parserServices.getStyleContext!();
if (styleContext.status === 'parse-error') {
context.report({
loc: node.loc,
message: `Error parsing style element. Error message: "${styleContext.error.message.replace(cwd, '')}"`
});
}
if (styleContext.status === 'unknown-lang') {
context.report({
loc: node.loc,
message: `Found unsupported style element language "${styleContext.sourceLang}"`
});
}
}
};
}
});
4 changes: 3 additions & 1 deletion packages/eslint-plugin-svelte/src/utils/rules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import system from '../rules/system.js';
import validCompile from '../rules/valid-compile.js';
import validEachKey from '../rules/valid-each-key.js';
import validPropNamesInKitPages from '../rules/valid-prop-names-in-kit-pages.js';
import validStyleParse from '../rules/valid-style-parse.js';

export const rules = [
typescriptEslintNoUnnecessaryCondition,
Expand Down Expand Up @@ -143,5 +144,6 @@ export const rules = [
system,
validCompile,
validEachKey,
validPropNamesInKitPages
validPropNamesInKitPages,
validStyleParse
] as RuleModule[];
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
- message: 'Error parsing style element. Error message:
"tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte:4:11:
Unknown word"'
line: 7
column: 1
suggestions: null
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="container">
<div class="div-class">Hello</div>

<span class="span-class">World!</span>
</div>

<style>
// This syntax is intentionally invalid CSS - this is to be used to test resiliency against invalid input
.container {
class .div-class/35
# Weird comment
color: red;
.span-class begin
font-weight: bold;
end
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
- message: 'Error parsing style element. Error message:
"tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte:4:11:
Unknown word"'
line: 7
column: 1
suggestions: null
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="container">
<div class="div-class">Hello</div>

<span class="span-class">World!</span>
</div>

<style lang="scss">
// This syntax is intentionally invalid CSS - this is to be used to test resiliency against invalid input
.container {
class .div-class/35
# Weird comment
color: red;
.span-class begin
font-weight: bold;
end
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- message: Found unsupported style element language "invalid-lang"
line: 7
column: 1
suggestions: null
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="container">
<div class="div-class">Hello</div>

<span class="span-class">World!</span>
</div>

<style lang="invalid-lang">
// This syntax is intentionally invalid CSS - this is to be used to test resiliency against unknown style languages.
.container {
class .div-class/35
# Weird comment
color: red;
.span-class begin
font-weight: bold;
end
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<a href="https://svelte.dev">Hello</a>

<span style="font-weight: bold;">World!</span>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<div class="div-class">Hello</div>

<span class="span-class">World!</span>

<style>
.div-class {
color: red;
}
.span-class {
font-weight: bold;
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div class="container">
<div class="div-class">Hello</div>

<span class="span-class">World!</span>
</div>

<style lang="scss">
.container {
.div-class {
// This is an inline comment
color: red;
}
.span-class {
font-weight: bold;
}
}
</style>
12 changes: 12 additions & 0 deletions packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { RuleTester } from '../../utils/eslint-compat.js';
import rule from '../../../src/rules/valid-style-parse.js';
import { loadTestCases } from '../../utils/utils.js';

const tester = new RuleTester({
languageOptions: {
ecmaVersion: 2020,
sourceType: 'module'
}
});

tester.run('valid-style-parse', rule as any, loadTestCases('valid-style-parse'));

0 comments on commit c587629

Please sign in to comment.