Skip to content

Commit e4e66e2

Browse files
feat: allow for svelte:options css injected (#12660)
* feat: allow for `svelte:options` css injected * chore: update test with different class * fix: regenerate types * remove external option * regenerate * Update .changeset/eight-comics-tell.md * fix --------- Co-authored-by: Rich Harris <[email protected]> Co-authored-by: Rich Harris <[email protected]>
1 parent be28f82 commit e4e66e2

File tree

19 files changed

+88
-5
lines changed

19 files changed

+88
-5
lines changed

.changeset/eight-comics-tell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
feat: add support for `<svelte:options css="injected" />`

packages/svelte/messages/compile-errors/template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ HTML restricts where certain elements can appear. In case of a violation the bro
324324
325325
## svelte_options_invalid_attribute_value
326326

327-
> Valid values are %list%
327+
> Value must be %list%, if specified
328328
329329
## svelte_options_invalid_customelement
330330

packages/svelte/src/compiler/errors.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,13 +1275,13 @@ export function svelte_options_invalid_attribute(node) {
12751275
}
12761276

12771277
/**
1278-
* Valid values are %list%
1278+
* Value must be %list%, if specified
12791279
* @param {null | number | NodeLike} node
12801280
* @param {string} list
12811281
* @returns {never}
12821282
*/
12831283
export function svelte_options_invalid_attribute_value(node, list) {
1284-
e(node, "svelte_options_invalid_attribute_value", `Valid values are ${list}`);
1284+
e(node, "svelte_options_invalid_attribute_value", `Value must be ${list}, if specified`);
12851285
}
12861286

12871287
/**

packages/svelte/src/compiler/phases/1-parse/read/options.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ export default function read_options(node) {
175175

176176
break;
177177
}
178+
case 'css': {
179+
const value = get_static_value(attribute);
180+
181+
if (value === 'injected') {
182+
component_options.css = value;
183+
} else {
184+
e.svelte_options_invalid_attribute_value(attribute, `"injected"`);
185+
}
186+
187+
break;
188+
}
178189
case 'immutable': {
179190
component_options.immutable = get_boolean_value(attribute);
180191
break;

packages/svelte/src/compiler/types/template.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export interface SvelteOptions {
7575
accessors?: boolean;
7676
preserveWhitespace?: boolean;
7777
namespace?: Namespace;
78+
css?: 'injected';
7879
customElement?: {
7980
tag: string;
8081
shadow?: 'open' | 'none';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<svelte:options css="injected" />
2+
3+
<div class="bar">bar</div>
4+
5+
<style>
6+
.bar {
7+
color: red;
8+
}
9+
</style>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
compileOptions: {
5+
css: 'external'
6+
}
7+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.foo.svelte-sg04hs {
3+
color: red;
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<!--[--><div class="bar svelte-ievf05">bar</div><!----> <div class="foo svelte-sg04hs">foo</div><!--]-->
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<style id="svelte-ievf05">
2+
.bar.svelte-ievf05 {
3+
color: red;
4+
}
5+
</style>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script lang="ts">
2+
import Nested from './Nested.svelte';
3+
</script>
4+
5+
<Nested />
6+
7+
<div class="foo">foo</div>
8+
9+
<style>
10+
.foo {
11+
color: red;
12+
}
13+
</style>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
compileOptions: {
5+
css: 'external'
6+
}
7+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
.foo.svelte-sg04hs {
3+
color: red;
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div class="foo svelte-sg04hs">foo</div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<style id="svelte-sg04hs">
2+
.foo.svelte-sg04hs {
3+
color: red;
4+
}
5+
</style>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<svelte:options css="injected" />
2+
3+
<div class="foo">foo</div>
4+
5+
<style>
6+
.foo {
7+
color: red;
8+
}
9+
</style>

packages/svelte/tests/validator/samples/namespace-invalid/errors.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"code": "svelte_options_invalid_attribute_value",
4-
"message": "Valid values are \"html\", \"mathml\", \"svg\" or \"foreign\"",
4+
"message": "Value must be \"html\", \"mathml\", \"svg\" or \"foreign\", if specified",
55
"start": {
66
"line": 1,
77
"column": 16

packages/svelte/tests/validator/samples/namespace-non-literal/errors.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"code": "svelte_options_invalid_attribute_value",
4-
"message": "Valid values are \"html\", \"mathml\", \"svg\" or \"foreign\"",
4+
"message": "Value must be \"html\", \"mathml\", \"svg\" or \"foreign\", if specified",
55
"start": {
66
"line": 1,
77
"column": 16

packages/svelte/types/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,7 @@ declare module 'svelte/compiler' {
15331533
accessors?: boolean;
15341534
preserveWhitespace?: boolean;
15351535
namespace?: Namespace;
1536+
css?: 'injected';
15361537
customElement?: {
15371538
tag: string;
15381539
shadow?: 'open' | 'none';

0 commit comments

Comments
 (0)