mirror of https://github.com/sveltejs/svelte
commit
4273abc773
@ -0,0 +1,34 @@
|
||||
import { TemplateLiteral } from 'estree';
|
||||
import { escape_template } from './stringify';
|
||||
|
||||
/**
|
||||
* Collapse string literals together
|
||||
*/
|
||||
export function collapse_template_literal(literal: TemplateLiteral) {
|
||||
if (!literal.quasis.length) return;
|
||||
|
||||
const collapsed_quasis = [];
|
||||
const collapsed_expressions = [];
|
||||
|
||||
let cur_quasi = literal.quasis[0];
|
||||
|
||||
// An expression always follows a quasi and vice versa, ending with a quasi
|
||||
for (let i = 0; i < literal.quasis.length; i++) {
|
||||
const expr = literal.expressions[i];
|
||||
const next_quasi = literal.quasis[i + 1];
|
||||
// If an expression is a simple string literal, combine it with its preceding
|
||||
// and following quasi
|
||||
if (next_quasi && expr && expr.type === 'Literal' && typeof expr.value === 'string') {
|
||||
cur_quasi.value.raw += escape_template(expr.value) + next_quasi.value.raw;
|
||||
} else {
|
||||
if (expr) {
|
||||
collapsed_expressions.push(expr);
|
||||
}
|
||||
collapsed_quasis.push(cur_quasi);
|
||||
cur_quasi = next_quasi;
|
||||
}
|
||||
}
|
||||
|
||||
literal.quasis = collapsed_quasis;
|
||||
literal.expressions = collapsed_expressions;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,6 @@
|
||||
export default {
|
||||
options: {
|
||||
generate: 'ssr',
|
||||
dev: true
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,25 @@
|
||||
/* generated by Svelte vX.Y.Z */
|
||||
import { add_attribute, create_ssr_component, escape } from "svelte/internal";
|
||||
|
||||
const const1 = 1;
|
||||
const const2 = 'const2';
|
||||
|
||||
function foo() {
|
||||
return '';
|
||||
}
|
||||
|
||||
const Component = create_ssr_component(($$result, $$props, $$bindings, slots) => {
|
||||
return `
|
||||
<div class="class1 class2" style="color:red;">-</div>
|
||||
|
||||
|
||||
<div${add_attribute("class", const1, 0)}>-</div>
|
||||
<div${add_attribute("class", const1, 0)}>-</div>
|
||||
|
||||
|
||||
<div class="${"class1 " + escape('class2', true)}">-</div>
|
||||
<div class="${"class1 " + escape(const2, true)}">-</div>
|
||||
<div class="${"class1 " + escape(const2, true)}"${add_attribute("style", foo(), 0)}>-</div>`;
|
||||
});
|
||||
|
||||
export default Component;
|
||||
@ -0,0 +1,20 @@
|
||||
<script>
|
||||
const const1 = 1;
|
||||
const const2 = 'const2';
|
||||
|
||||
function foo() {
|
||||
return '';
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- canonical case - only markup -->
|
||||
<div class="class1 class2" style="color:red;">-</div>
|
||||
|
||||
<!-- various forms of variable syntax -->
|
||||
<div class="{const1}">-</div>
|
||||
<div class={const1}>-</div>
|
||||
|
||||
<!-- mixed static string + expressions -->
|
||||
<div class="class1 {'class2'}">-</div>
|
||||
<div class="class1 {const2}">-</div>
|
||||
<div class="class1 {const2}" style={foo()}>-</div>
|
||||
@ -0,0 +1,244 @@
|
||||
/* generated by Svelte vX.Y.Z */
|
||||
import {
|
||||
SvelteComponent,
|
||||
assign,
|
||||
detach,
|
||||
element,
|
||||
empty,
|
||||
get_spread_update,
|
||||
init,
|
||||
insert,
|
||||
noop,
|
||||
safe_not_equal,
|
||||
set_dynamic_element_data,
|
||||
space,
|
||||
toggle_class
|
||||
} from "svelte/internal";
|
||||
|
||||
function create_dynamic_element_3(ctx) {
|
||||
let svelte_element;
|
||||
|
||||
return {
|
||||
c() {
|
||||
svelte_element = element(static_value);
|
||||
set_dynamic_element_data(static_value)(svelte_element, { static_value, ...static_obj });
|
||||
toggle_class(svelte_element, "foo", static_value);
|
||||
},
|
||||
m(target, anchor) {
|
||||
insert(target, svelte_element, anchor);
|
||||
},
|
||||
p: noop,
|
||||
d(detaching) {
|
||||
if (detaching) detach(svelte_element);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// (10:0) <svelte:element this={dynamic_value} {static_value} {...static_obj} class:foo={static_value} />
|
||||
function create_dynamic_element_2(ctx) {
|
||||
let svelte_element;
|
||||
|
||||
return {
|
||||
c() {
|
||||
svelte_element = element(/*dynamic_value*/ ctx[0]);
|
||||
set_dynamic_element_data(/*dynamic_value*/ ctx[0])(svelte_element, { static_value, ...static_obj });
|
||||
toggle_class(svelte_element, "foo", static_value);
|
||||
},
|
||||
m(target, anchor) {
|
||||
insert(target, svelte_element, anchor);
|
||||
},
|
||||
p: noop,
|
||||
d(detaching) {
|
||||
if (detaching) detach(svelte_element);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// (12:0) <svelte:element this={static_value} {dynamic_value} {...dynamic_obj} class:foo={dynamic_value} />
|
||||
function create_dynamic_element_1(ctx) {
|
||||
let svelte_element;
|
||||
let svelte_element_levels = [{ dynamic_value: /*dynamic_value*/ ctx[0] }, /*dynamic_obj*/ ctx[1]];
|
||||
let svelte_element_data = {};
|
||||
|
||||
for (let i = 0; i < svelte_element_levels.length; i += 1) {
|
||||
svelte_element_data = assign(svelte_element_data, svelte_element_levels[i]);
|
||||
}
|
||||
|
||||
return {
|
||||
c() {
|
||||
svelte_element = element(static_value);
|
||||
set_dynamic_element_data(static_value)(svelte_element, svelte_element_data);
|
||||
toggle_class(svelte_element, "foo", /*dynamic_value*/ ctx[0]);
|
||||
},
|
||||
m(target, anchor) {
|
||||
insert(target, svelte_element, anchor);
|
||||
},
|
||||
p(ctx, dirty) {
|
||||
set_dynamic_element_data(static_value)(svelte_element, svelte_element_data = get_spread_update(svelte_element_levels, [
|
||||
dirty & /*dynamic_value*/ 1 && { dynamic_value: /*dynamic_value*/ ctx[0] },
|
||||
dirty & /*dynamic_obj*/ 2 && /*dynamic_obj*/ ctx[1]
|
||||
]));
|
||||
|
||||
toggle_class(svelte_element, "foo", /*dynamic_value*/ ctx[0]);
|
||||
},
|
||||
d(detaching) {
|
||||
if (detaching) detach(svelte_element);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// (14:0) <svelte:element this={dynamic_value} {dynamic_value} {...dynamic_obj} class:foo={dynamic_value} />
|
||||
function create_dynamic_element(ctx) {
|
||||
let svelte_element;
|
||||
let svelte_element_levels = [{ dynamic_value: /*dynamic_value*/ ctx[0] }, /*dynamic_obj*/ ctx[1]];
|
||||
let svelte_element_data = {};
|
||||
|
||||
for (let i = 0; i < svelte_element_levels.length; i += 1) {
|
||||
svelte_element_data = assign(svelte_element_data, svelte_element_levels[i]);
|
||||
}
|
||||
|
||||
return {
|
||||
c() {
|
||||
svelte_element = element(/*dynamic_value*/ ctx[0]);
|
||||
set_dynamic_element_data(/*dynamic_value*/ ctx[0])(svelte_element, svelte_element_data);
|
||||
toggle_class(svelte_element, "foo", /*dynamic_value*/ ctx[0]);
|
||||
},
|
||||
m(target, anchor) {
|
||||
insert(target, svelte_element, anchor);
|
||||
},
|
||||
p(ctx, dirty) {
|
||||
set_dynamic_element_data(/*dynamic_value*/ ctx[0])(svelte_element, svelte_element_data = get_spread_update(svelte_element_levels, [
|
||||
dirty & /*dynamic_value*/ 1 && { dynamic_value: /*dynamic_value*/ ctx[0] },
|
||||
dirty & /*dynamic_obj*/ 2 && /*dynamic_obj*/ ctx[1]
|
||||
]));
|
||||
|
||||
toggle_class(svelte_element, "foo", /*dynamic_value*/ ctx[0]);
|
||||
},
|
||||
d(detaching) {
|
||||
if (detaching) detach(svelte_element);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function create_fragment(ctx) {
|
||||
let t0;
|
||||
let previous_tag = /*dynamic_value*/ ctx[0];
|
||||
let t1;
|
||||
let t2;
|
||||
let previous_tag_1 = /*dynamic_value*/ ctx[0];
|
||||
let svelte_element3_anchor;
|
||||
let svelte_element0 = static_value && create_dynamic_element_3(ctx);
|
||||
let svelte_element1 = /*dynamic_value*/ ctx[0] && create_dynamic_element_2(ctx);
|
||||
let svelte_element2 = static_value && create_dynamic_element_1(ctx);
|
||||
let svelte_element3 = /*dynamic_value*/ ctx[0] && create_dynamic_element(ctx);
|
||||
|
||||
return {
|
||||
c() {
|
||||
if (svelte_element0) svelte_element0.c();
|
||||
t0 = space();
|
||||
if (svelte_element1) svelte_element1.c();
|
||||
t1 = space();
|
||||
if (svelte_element2) svelte_element2.c();
|
||||
t2 = space();
|
||||
if (svelte_element3) svelte_element3.c();
|
||||
svelte_element3_anchor = empty();
|
||||
},
|
||||
m(target, anchor) {
|
||||
if (svelte_element0) svelte_element0.m(target, anchor);
|
||||
insert(target, t0, anchor);
|
||||
if (svelte_element1) svelte_element1.m(target, anchor);
|
||||
insert(target, t1, anchor);
|
||||
if (svelte_element2) svelte_element2.m(target, anchor);
|
||||
insert(target, t2, anchor);
|
||||
if (svelte_element3) svelte_element3.m(target, anchor);
|
||||
insert(target, svelte_element3_anchor, anchor);
|
||||
},
|
||||
p(ctx, [dirty]) {
|
||||
if (static_value) {
|
||||
svelte_element0.p(ctx, dirty);
|
||||
}
|
||||
|
||||
if (/*dynamic_value*/ ctx[0]) {
|
||||
if (!previous_tag) {
|
||||
svelte_element1 = create_dynamic_element_2(ctx);
|
||||
previous_tag = /*dynamic_value*/ ctx[0];
|
||||
svelte_element1.c();
|
||||
svelte_element1.m(t1.parentNode, t1);
|
||||
} else if (safe_not_equal(previous_tag, /*dynamic_value*/ ctx[0])) {
|
||||
svelte_element1.d(1);
|
||||
svelte_element1 = create_dynamic_element_2(ctx);
|
||||
previous_tag = /*dynamic_value*/ ctx[0];
|
||||
svelte_element1.c();
|
||||
svelte_element1.m(t1.parentNode, t1);
|
||||
} else {
|
||||
svelte_element1.p(ctx, dirty);
|
||||
}
|
||||
} else if (previous_tag) {
|
||||
svelte_element1.d(1);
|
||||
svelte_element1 = null;
|
||||
previous_tag = /*dynamic_value*/ ctx[0];
|
||||
}
|
||||
|
||||
if (static_value) {
|
||||
svelte_element2.p(ctx, dirty);
|
||||
}
|
||||
|
||||
if (/*dynamic_value*/ ctx[0]) {
|
||||
if (!previous_tag_1) {
|
||||
svelte_element3 = create_dynamic_element(ctx);
|
||||
previous_tag_1 = /*dynamic_value*/ ctx[0];
|
||||
svelte_element3.c();
|
||||
svelte_element3.m(svelte_element3_anchor.parentNode, svelte_element3_anchor);
|
||||
} else if (safe_not_equal(previous_tag_1, /*dynamic_value*/ ctx[0])) {
|
||||
svelte_element3.d(1);
|
||||
svelte_element3 = create_dynamic_element(ctx);
|
||||
previous_tag_1 = /*dynamic_value*/ ctx[0];
|
||||
svelte_element3.c();
|
||||
svelte_element3.m(svelte_element3_anchor.parentNode, svelte_element3_anchor);
|
||||
} else {
|
||||
svelte_element3.p(ctx, dirty);
|
||||
}
|
||||
} else if (previous_tag_1) {
|
||||
svelte_element3.d(1);
|
||||
svelte_element3 = null;
|
||||
previous_tag_1 = /*dynamic_value*/ ctx[0];
|
||||
}
|
||||
},
|
||||
i: noop,
|
||||
o: noop,
|
||||
d(detaching) {
|
||||
if (svelte_element0) svelte_element0.d(detaching);
|
||||
if (detaching) detach(t0);
|
||||
if (svelte_element1) svelte_element1.d(detaching);
|
||||
if (detaching) detach(t1);
|
||||
if (svelte_element2) svelte_element2.d(detaching);
|
||||
if (detaching) detach(t2);
|
||||
if (detaching) detach(svelte_element3_anchor);
|
||||
if (svelte_element3) svelte_element3.d(detaching);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
let static_value = 'a';
|
||||
|
||||
function instance($$self, $$props, $$invalidate) {
|
||||
let { dynamic_value } = $$props;
|
||||
let { dynamic_obj } = $$props;
|
||||
let static_obj = {};
|
||||
|
||||
$$self.$$set = $$props => {
|
||||
if ('dynamic_value' in $$props) $$invalidate(0, dynamic_value = $$props.dynamic_value);
|
||||
if ('dynamic_obj' in $$props) $$invalidate(1, dynamic_obj = $$props.dynamic_obj);
|
||||
};
|
||||
|
||||
return [dynamic_value, dynamic_obj, static_obj];
|
||||
}
|
||||
|
||||
class Component extends SvelteComponent {
|
||||
constructor(options) {
|
||||
super();
|
||||
init(this, options, instance, create_fragment, safe_not_equal, { dynamic_value: 0, dynamic_obj: 1 });
|
||||
}
|
||||
}
|
||||
|
||||
export default Component;
|
||||
@ -0,0 +1,14 @@
|
||||
<script>
|
||||
export let dynamic_value;
|
||||
export let dynamic_obj;
|
||||
let static_value = 'a';
|
||||
let static_obj = {};
|
||||
</script>
|
||||
|
||||
<svelte:element this={static_value} {static_value} {...static_obj} class:foo={static_value} />
|
||||
|
||||
<svelte:element this={dynamic_value} {static_value} {...static_obj} class:foo={static_value} />
|
||||
|
||||
<svelte:element this={static_value} {dynamic_value} {...dynamic_obj} class:foo={dynamic_value} />
|
||||
|
||||
<svelte:element this={dynamic_value} {dynamic_value} {...dynamic_obj} class:foo={dynamic_value} />
|
||||
@ -0,0 +1,17 @@
|
||||
export default {
|
||||
async test({ assert, component, target, window }) {
|
||||
const button = target.querySelector('button');
|
||||
const event = new window.MouseEvent('click');
|
||||
|
||||
await button.dispatchEvent(event);
|
||||
assert.deepEqual(component.logs, ['click_1', 'click_2']);
|
||||
|
||||
component.click_2 = () => component.logs.push('22');
|
||||
await button.dispatchEvent(event);
|
||||
assert.deepEqual(component.logs, ['click_1', 'click_2', 'click_1', '22']);
|
||||
|
||||
component.click_1 = () => component.logs.push('11');
|
||||
await button.dispatchEvent(event);
|
||||
assert.deepEqual(component.logs, ['click_1', 'click_2', 'click_1', '22', '11', '22']);
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,22 @@
|
||||
<script>
|
||||
export let logs = [];
|
||||
|
||||
export let click_1 = () => {
|
||||
logs.push('click_1');
|
||||
}
|
||||
|
||||
export let click_2 = () => {
|
||||
logs.push('click_2');
|
||||
}
|
||||
|
||||
export let click_3 = () => {
|
||||
logs.push('click_3');
|
||||
}
|
||||
</script>
|
||||
|
||||
<button
|
||||
on:click={click_1}
|
||||
on:click|stopImmediatePropagation={click_2}
|
||||
on:click={click_3}>
|
||||
click me
|
||||
</button>
|
||||
@ -0,0 +1,19 @@
|
||||
export default {
|
||||
html: `
|
||||
<span data-xxx="&copy=value" style="&copy=value"></span>
|
||||
|
||||
<span data-xxx="&copy=value" style="&copy=value"></span>
|
||||
|
||||
<span data-xxx="©" style="©"></span>
|
||||
|
||||
<span data-xxx="©=value" style="©=value"></span>
|
||||
|
||||
<span data-xxx="&copyotherstring=value" style="&copyotherstring=value"></span>
|
||||
|
||||
<span data-xxx="&copy123=value" style="&copy123=value"></span>
|
||||
|
||||
<span data-xxx="&rect=value" style="&rect=value"></span>
|
||||
|
||||
<span data-xxx="▭=value" style="▭=value"></span>
|
||||
`
|
||||
};
|
||||
@ -0,0 +1,15 @@
|
||||
<span data-xxx="©=value" style="©=value"></span>
|
||||
|
||||
<span data-xxx="©=value" style="©=value"></span>
|
||||
|
||||
<span data-xxx="©" style="©"></span>
|
||||
|
||||
<span data-xxx="©=value" style="©=value"></span>
|
||||
|
||||
<span data-xxx="©otherstring=value" style="©otherstring=value"></span>
|
||||
|
||||
<span data-xxx="©123=value" style="©123=value"></span>
|
||||
|
||||
<span data-xxx="&rect=value" style="&rect=value"></span>
|
||||
|
||||
<span data-xxx="▭=value" style="▭=value"></span>
|
||||
@ -1,10 +1,24 @@
|
||||
<span>*</span>
|
||||
<span>*</span>
|
||||
<span>*</span>
|
||||
<span>*</span>
|
||||
<span>*</span>
|
||||
|
||||
<span> </span>
|
||||
<span>A</span>
|
||||
<span>€</span>
|
||||
<span>€</span>
|
||||
|
||||
<span>¬anentity;</span>
|
||||
<span>&stringnotanentity;</span>
|
||||
|
||||
<span>different &rect and ▭</span>
|
||||
|
||||
<span>©otherstring</span>
|
||||
|
||||
<span>©=otherstring</span>
|
||||
|
||||
<span>©=otherstring</span>
|
||||
|
||||
<span>©123</span>
|
||||
|
||||
<span>Ÿotherstring</span>
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
<template id="t1">
|
||||
<div>foo</div>
|
||||
</template>
|
||||
<template id="t2">123</template>
|
||||
<template id="t2">123</template>
|
||||
<template id="t3">1{@html '<b>B</b>'}1</template>
|
||||
@ -1 +1,6 @@
|
||||
<div scope/>
|
||||
<!-- valid -->
|
||||
<th scope />
|
||||
<svelte:element this={Math.random() ? 'th' : 'td'} scope />
|
||||
|
||||
<!-- invalid -->
|
||||
<div scope/>
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
[{
|
||||
"code": "css-invalid-global-selector-position",
|
||||
"message": ":global(...) not at the start of a selector sequence should not contain type or universal selectors",
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 5
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 17
|
||||
}
|
||||
}]
|
||||
@ -0,0 +1,5 @@
|
||||
<style>
|
||||
.foo:global(div) {
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in new issue