diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index c83f8153a0..9466a1e47f 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -29,6 +29,7 @@ import add_to_set from './utils/add_to_set'; import check_graph_for_cycles from './utils/check_graph_for_cycles'; import { print, x, b } from 'code-red'; import { is_reserved_keyword } from './utils/reserved_keywords'; +import get_prefix from './utils/get_prefix'; interface ComponentOptions { namespace?: string; @@ -133,7 +134,8 @@ export default class Component { source, ast, compile_options.filename, - compile_options.dev + compile_options.dev, + get_prefix(compile_options.prefix), ); this.stylesheet.validate(this); diff --git a/src/compiler/compile/css/Stylesheet.ts b/src/compiler/compile/css/Stylesheet.ts index 246dab0f12..4bf8f3bd14 100644 --- a/src/compiler/compile/css/Stylesheet.ts +++ b/src/compiler/compile/css/Stylesheet.ts @@ -291,14 +291,14 @@ export default class Stylesheet { nodes_with_css_class: Set = new Set(); - constructor(source: string, ast: Ast, filename: string, dev: boolean) { + constructor(source: string, ast: Ast, filename: string, dev: boolean, prefix: string) { 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 = `${prefix}${hash(ast.css.content.styles)}`; this.has_styles = true; diff --git a/src/compiler/compile/nodes/Head.ts b/src/compiler/compile/nodes/Head.ts index 53e76d7a4d..dee28e7aed 100644 --- a/src/compiler/compile/nodes/Head.ts +++ b/src/compiler/compile/nodes/Head.ts @@ -1,6 +1,7 @@ import Node from './shared/Node'; import map_children from './shared/map_children'; import hash from '../utils/hash'; +import get_prefix from '../utils/get_prefix'; export default class Head extends Node { type: 'Head'; @@ -22,7 +23,7 @@ export default class Head extends Node { })); if (this.children.length > 0) { - this.id = `svelte-${hash(this.component.source.slice(this.start, this.end))}`; + this.id = `${get_prefix(this.component.compile_options.prefix)}${hash(this.component.source.slice(this.start, this.end))}`; } } } diff --git a/src/compiler/compile/utils/get_prefix.ts b/src/compiler/compile/utils/get_prefix.ts new file mode 100644 index 0000000000..9ea0f7fdaa --- /dev/null +++ b/src/compiler/compile/utils/get_prefix.ts @@ -0,0 +1,9 @@ +export default function get_prefix(str?: string): string { + const standard_prefix = 'svelte-'; + if (!str + || typeof str !== 'string') return standard_prefix; + str = str.replace(/^[^_-a-z]+|[^_-a-z0-9]/gi, ''); + return str.length + ? str + : standard_prefix; +} \ No newline at end of file diff --git a/src/compiler/interfaces.ts b/src/compiler/interfaces.ts index a5e286462f..05b7fb667a 100644 --- a/src/compiler/interfaces.ts +++ b/src/compiler/interfaces.ts @@ -123,6 +123,7 @@ export interface CompileOptions { tag?: string; css?: boolean; loopGuardTimeout?: number; + prefix?: string; preserveComments?: boolean; preserveWhitespace?: boolean; diff --git a/test/css/samples/custom-prefix-has-only-disallowed-characters/_config.js b/test/css/samples/custom-prefix-has-only-disallowed-characters/_config.js new file mode 100644 index 0000000000..90eadd2505 --- /dev/null +++ b/test/css/samples/custom-prefix-has-only-disallowed-characters/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: ' $!*' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-only-disallowed-characters/expected.css b/test/css/samples/custom-prefix-has-only-disallowed-characters/expected.css new file mode 100644 index 0000000000..5e31d0bc6b --- /dev/null +++ b/test/css/samples/custom-prefix-has-only-disallowed-characters/expected.css @@ -0,0 +1 @@ +div.svelte-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-only-disallowed-characters/input.svelte b/test/css/samples/custom-prefix-has-only-disallowed-characters/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-has-only-disallowed-characters/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-special-character/_config.js b/test/css/samples/custom-prefix-has-special-character/_config.js new file mode 100644 index 0000000000..fbdade1aed --- /dev/null +++ b/test/css/samples/custom-prefix-has-special-character/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: 'me$-' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-special-character/expected.css b/test/css/samples/custom-prefix-has-special-character/expected.css new file mode 100644 index 0000000000..2af15fb797 --- /dev/null +++ b/test/css/samples/custom-prefix-has-special-character/expected.css @@ -0,0 +1 @@ +div.me-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-special-character/input.svelte b/test/css/samples/custom-prefix-has-special-character/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-has-special-character/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-whitespace/_config.js b/test/css/samples/custom-prefix-has-whitespace/_config.js new file mode 100644 index 0000000000..edc54acd52 --- /dev/null +++ b/test/css/samples/custom-prefix-has-whitespace/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: 'me -' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-whitespace/expected.css b/test/css/samples/custom-prefix-has-whitespace/expected.css new file mode 100644 index 0000000000..2af15fb797 --- /dev/null +++ b/test/css/samples/custom-prefix-has-whitespace/expected.css @@ -0,0 +1 @@ +div.me-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-has-whitespace/input.svelte b/test/css/samples/custom-prefix-has-whitespace/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-has-whitespace/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix-no-string/_config.js b/test/css/samples/custom-prefix-no-string/_config.js new file mode 100644 index 0000000000..616abeeb13 --- /dev/null +++ b/test/css/samples/custom-prefix-no-string/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: true + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-no-string/expected.css b/test/css/samples/custom-prefix-no-string/expected.css new file mode 100644 index 0000000000..5e31d0bc6b --- /dev/null +++ b/test/css/samples/custom-prefix-no-string/expected.css @@ -0,0 +1 @@ +div.svelte-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-no-string/input.svelte b/test/css/samples/custom-prefix-no-string/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-no-string/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-number/_config.js b/test/css/samples/custom-prefix-starts-with-number/_config.js new file mode 100644 index 0000000000..0ede6c75e2 --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-number/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: '0me-' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-number/expected.css b/test/css/samples/custom-prefix-starts-with-number/expected.css new file mode 100644 index 0000000000..2af15fb797 --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-number/expected.css @@ -0,0 +1 @@ +div.me-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-number/input.svelte b/test/css/samples/custom-prefix-starts-with-number/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-number/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-whitespace/_config.js b/test/css/samples/custom-prefix-starts-with-whitespace/_config.js new file mode 100644 index 0000000000..3cdadf669e --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-whitespace/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: ' me-' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-whitespace/expected.css b/test/css/samples/custom-prefix-starts-with-whitespace/expected.css new file mode 100644 index 0000000000..2af15fb797 --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-whitespace/expected.css @@ -0,0 +1 @@ +div.me-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix-starts-with-whitespace/input.svelte b/test/css/samples/custom-prefix-starts-with-whitespace/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix-starts-with-whitespace/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file diff --git a/test/css/samples/custom-prefix/_config.js b/test/css/samples/custom-prefix/_config.js new file mode 100644 index 0000000000..1ff263f07d --- /dev/null +++ b/test/css/samples/custom-prefix/_config.js @@ -0,0 +1,5 @@ +export default { + compileOptions: { + prefix: 'me-' + } +}; \ No newline at end of file diff --git a/test/css/samples/custom-prefix/expected.css b/test/css/samples/custom-prefix/expected.css new file mode 100644 index 0000000000..2af15fb797 --- /dev/null +++ b/test/css/samples/custom-prefix/expected.css @@ -0,0 +1 @@ +div.me-xyz{color:blue} \ No newline at end of file diff --git a/test/css/samples/custom-prefix/input.svelte b/test/css/samples/custom-prefix/input.svelte new file mode 100644 index 0000000000..242eb44a66 --- /dev/null +++ b/test/css/samples/custom-prefix/input.svelte @@ -0,0 +1,7 @@ +
+ + \ No newline at end of file