Allow to customize the css scope class

pull/4377/head
Christian Kaisermann 7 years ago
parent 6928f9492c
commit 50aa595e7e

@ -133,12 +133,15 @@ export default class Component {
this.locate = getLocator(this.source, { offsetLine: 1 });
// styles
this.stylesheet = new Stylesheet(
this.stylesheet = new Stylesheet({
source,
ast,
compile_options.filename,
compile_options.dev
);
filename: compile_options.filename,
options: {
dev: compile_options.dev,
scope_class_getter: compile_options.scopeClass
}
});
this.stylesheet.validate(this);
this.component_options = process_component_options(

@ -2,7 +2,7 @@ import MagicString from 'magic-string';
import { walk } from 'estree-walker';
import Selector from './Selector';
import Element from '../nodes/Element';
import { Ast } from '../../interfaces';
import { Ast, CssScopeClassGetter } from '../../interfaces';
import Component from '../Component';
import { CssNode } from './interfaces';
import hash from '../utils/hash';
@ -275,6 +275,10 @@ class Atrule {
}
}
const getDefaultScopeClass: CssScopeClassGetter = ({ hash }) => {
return `svelte-${hash}`;
};
export default class Stylesheet {
source: string;
ast: Ast;
@ -289,14 +293,27 @@ export default class Stylesheet {
nodes_with_css_class: Set<CssNode> = new Set();
constructor(source: string, ast: Ast, filename: string, dev: boolean) {
constructor({
source,
ast,
filename,
options: { dev, scope_class_getter = getDefaultScopeClass },
}: {
source: string;
ast: Ast;
filename: string;
options: {
dev: boolean;
scope_class_getter: CssScopeClassGetter;
};
}) {
this.source = source;
this.ast = ast;
this.filename = filename;
this.dev = dev;
if (ast.css && ast.css.children.length) {
this.id = `svelte-${hash(ast.css.content.styles)}`;
this.id = scope_class_getter({ filename, hash: hash(ast.css.content.styles) });
this.has_styles = true;

@ -28,7 +28,8 @@ const valid_options = [
'css',
'loopGuardTimeout',
'preserveComments',
'preserveWhitespace'
'preserveWhitespace',
'scopeClass',
];
function validate_options(options: CompileOptions, warnings: Warning[]) {

@ -104,6 +104,12 @@ export interface Warning {
export type ModuleFormat = 'esm' | 'cjs';
export type CssScopeClassGetter = (args: {
filename: string;
hash: string;
}) => string;
export interface CompileOptions {
format?: ModuleFormat;
name?: string;
@ -125,6 +131,7 @@ export interface CompileOptions {
css?: boolean;
loopGuardTimeout?: number;
namespace?: string;
scopeClass?: CssScopeClassGetter;
preserveComments?: boolean;
preserveWhitespace?: boolean;
@ -166,7 +173,7 @@ export interface Var {
imported?: boolean;
}
export interface CssResult {
export interface CssResult {
code: string;
map: SourceMap;
}

@ -0,0 +1,7 @@
export default {
compileOptions: {
scopeClass({ hash }) {
return `sv-${hash}`;
}
},
};

@ -0,0 +1,7 @@
<div>red</div>
<style>
div {
color: red;
}
</style>
Loading…
Cancel
Save