Skip to content

Commit 8ebc0fe

Browse files
committed
Allow to customize the css scope class
1 parent 3cbe38c commit 8ebc0fe

File tree

7 files changed

+54
-11
lines changed

7 files changed

+54
-11
lines changed

src/compiler/compile/Component.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,15 @@ export default class Component {
128128
this.locate = getLocator(this.source, { offsetLine: 1 });
129129

130130
// styles
131-
this.stylesheet = new Stylesheet(
131+
this.stylesheet = new Stylesheet({
132132
source,
133133
ast,
134-
compile_options.filename,
135-
compile_options.dev
136-
);
134+
filename: compile_options.filename,
135+
options: {
136+
dev: compile_options.dev,
137+
scope_class_getter: compile_options.scopeClass
138+
}
139+
});
137140
this.stylesheet.validate(this);
138141

139142
this.component_options = process_component_options(
@@ -1450,4 +1453,4 @@ function get_relative_path(from: string, to: string) {
14501453
}
14511454

14521455
return from_parts.concat(to_parts).join('/');
1453-
}
1456+
}

src/compiler/compile/css/Stylesheet.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import MagicString from 'magic-string';
22
import { walk } from 'estree-walker';
33
import Selector from './Selector';
44
import Element from '../nodes/Element';
5-
import { Ast, TemplateNode } from '../../interfaces';
5+
import { Ast, TemplateNode, CssScopeClassGetter } from '../../interfaces';
66
import Component from '../Component';
77
import { CssNode } from './interfaces';
88
import hash from "../utils/hash";
@@ -277,6 +277,10 @@ class Atrule {
277277
}
278278
}
279279

280+
const getDefaultScopeClass: CssScopeClassGetter = ({ hash }) => {
281+
return `svelte-${hash}`;
282+
};
283+
280284
export default class Stylesheet {
281285
source: string;
282286
ast: Ast;
@@ -291,14 +295,27 @@ export default class Stylesheet {
291295

292296
nodes_with_css_class: Set<CssNode> = new Set();
293297

294-
constructor(source: string, ast: Ast, filename: string, dev: boolean) {
298+
constructor({
299+
source,
300+
ast,
301+
filename,
302+
options: { dev, scope_class_getter = getDefaultScopeClass },
303+
}: {
304+
source: string;
305+
ast: Ast;
306+
filename: string;
307+
options: {
308+
dev: boolean;
309+
scope_class_getter: CssScopeClassGetter;
310+
};
311+
}) {
295312
this.source = source;
296313
this.ast = ast;
297314
this.filename = filename;
298315
this.dev = dev;
299316

300317
if (ast.css && ast.css.children.length) {
301-
this.id = `svelte-${hash(ast.css.content.styles)}`;
318+
this.id = scope_class_getter({ filename, hash: hash(ast.css.content.styles) });
302319

303320
this.has_styles = true;
304321

src/compiler/compile/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ const valid_options = [
2626
'css',
2727
'loopGuardTimeout',
2828
'preserveComments',
29-
'preserveWhitespace'
29+
'preserveWhitespace',
30+
'scopeClass',
3031
];
3132

3233
function validate_options(options: CompileOptions, warnings: Warning[]) {

src/compiler/interfaces.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ export interface Warning {
104104

105105
export type ModuleFormat = 'esm' | 'cjs';
106106

107+
108+
export type CssScopeClassGetter = (args: {
109+
filename: string;
110+
hash: string;
111+
}) => string;
112+
107113
export interface CompileOptions {
108114
format?: ModuleFormat;
109115
name?: string;
@@ -123,6 +129,7 @@ export interface CompileOptions {
123129
tag?: string;
124130
css?: boolean;
125131
loopGuardTimeout?: number;
132+
scopeClass?: CssScopeClassGetter;
126133

127134
preserveComments?: boolean;
128135
preserveWhitespace?: boolean;
@@ -163,7 +170,7 @@ export interface Var {
163170
is_reactive_dependency?: boolean;
164171
}
165172

166-
export interface CssResult {
173+
export interface CssResult {
167174
code: string;
168175
map: SourceMap;
169-
}
176+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default {
2+
compileOptions: {
3+
scopeClass({ hash }) {
4+
return `sv-${hash}`;
5+
}
6+
},
7+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
div.sv-bzh57p{color:red}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<div>red</div>
2+
3+
<style>
4+
div {
5+
color: red;
6+
}
7+
</style>

0 commit comments

Comments
 (0)