mirror of https://github.com/sveltejs/svelte
Merge pull request #1024 from sveltejs/gh-1013
update SSR render method, and introduce <:Head>pull/1028/head
commit
394dec9f11
@ -0,0 +1,32 @@
|
|||||||
|
import deindent from '../../utils/deindent';
|
||||||
|
import { stringify } from '../../utils/stringify';
|
||||||
|
import Node from './shared/Node';
|
||||||
|
import Block from '../dom/Block';
|
||||||
|
import Attribute from './Attribute';
|
||||||
|
|
||||||
|
export default class Head extends Node {
|
||||||
|
type: 'Head';
|
||||||
|
attributes: Attribute[];
|
||||||
|
|
||||||
|
init(
|
||||||
|
block: Block,
|
||||||
|
stripWhitespace: boolean,
|
||||||
|
nextSibling: Node
|
||||||
|
) {
|
||||||
|
this.initChildren(block, true, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
build(
|
||||||
|
block: Block,
|
||||||
|
parentNode: string,
|
||||||
|
parentNodes: string
|
||||||
|
) {
|
||||||
|
const { generator } = this;
|
||||||
|
|
||||||
|
this.var = 'document.head';
|
||||||
|
|
||||||
|
this.children.forEach((child: Node) => {
|
||||||
|
child.build(block, 'document.head', null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
import { SsrGenerator } from '../index';
|
||||||
|
import Block from '../Block';
|
||||||
|
import { Node } from '../../../interfaces';
|
||||||
|
import stringifyAttributeValue from './shared/stringifyAttributeValue';
|
||||||
|
import visit from '../visit';
|
||||||
|
|
||||||
|
export default function visitDocument(
|
||||||
|
generator: SsrGenerator,
|
||||||
|
block: Block,
|
||||||
|
node: Node
|
||||||
|
) {
|
||||||
|
generator.append('${(__result.head += `');
|
||||||
|
|
||||||
|
node.children.forEach((child: Node) => {
|
||||||
|
visit(generator, block, child);
|
||||||
|
});
|
||||||
|
|
||||||
|
generator.append('`, "")}');
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
import Block from '../../Block';
|
||||||
|
import { escape } from '../../../../utils/stringify';
|
||||||
|
import { Node } from '../../../../interfaces';
|
||||||
|
|
||||||
|
export default function stringifyAttributeValue(block: Block, chunks: Node[]) {
|
||||||
|
return chunks
|
||||||
|
.map((chunk: Node) => {
|
||||||
|
if (chunk.type === 'Text') {
|
||||||
|
return escape(chunk.data).replace(/"/g, '"');
|
||||||
|
}
|
||||||
|
|
||||||
|
block.contextualise(chunk.expression);
|
||||||
|
const { snippet } = chunk.metadata;
|
||||||
|
return '${' + snippet + '}';
|
||||||
|
})
|
||||||
|
.join('');
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
import { Validator } from '../index';
|
||||||
|
import { Node } from '../../interfaces';
|
||||||
|
|
||||||
|
export default function validateHead(validator: Validator, node: Node, refs: Map<string, Node[]>, refCallees: Node[]) {
|
||||||
|
if (node.attributes.length) {
|
||||||
|
validator.error(`<:Head> should not have any attributes or directives`, node.start);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
export default {
|
||||||
|
data: {
|
||||||
|
adjective: 'custom'
|
||||||
|
},
|
||||||
|
|
||||||
|
test(assert, component, target, window) {
|
||||||
|
assert.equal(window.document.title, 'a custom title');
|
||||||
|
|
||||||
|
component.set({ adjective: 'different' });
|
||||||
|
assert.equal(window.document.title, 'a different title');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,4 @@
|
|||||||
|
<:Head>
|
||||||
|
<title>a {{adjective}} title</title>
|
||||||
|
<meta name='twitter:creator' content='@sveltejs'>
|
||||||
|
</:Head>
|
@ -0,0 +1,5 @@
|
|||||||
|
export default {
|
||||||
|
test(assert, component, target, window) {
|
||||||
|
assert.equal(window.document.title, 'changed');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,4 @@
|
|||||||
|
<:Head>
|
||||||
|
<title>changed</title>
|
||||||
|
<meta name='twitter:creator' content='@sveltejs'>
|
||||||
|
</:Head>
|
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
<title>a custom title</title>
|
@ -0,0 +1 @@
|
|||||||
|
<title>a custom title</title>
|
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"adjective": "custom"
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
<:Head>
|
||||||
|
<title>a {{adjective}} title</title>
|
||||||
|
</:Head>
|
@ -1,3 +1,2 @@
|
|||||||
div[svelte-1408461649],[svelte-1408461649] div{color:red}
|
div[svelte-1408461649],[svelte-1408461649] div{color:red}
|
||||||
div[svelte-54999591],[svelte-54999591] div{color:green}
|
div[svelte-1580141456],[svelte-1580141456] div{color:green}
|
||||||
div[svelte-2385185803],[svelte-2385185803] div{color:blue}
|
|
@ -1,5 +1,8 @@
|
|||||||
<div svelte-1408461649>red</div>
|
<div svelte-1408461649>red</div>
|
||||||
<div svelte-54999591>green: foo</div>
|
<div svelte-1580141456>green: foo</div>
|
||||||
<div svelte-2385185803>blue: foo</div>
|
|
||||||
<div svelte-54999591>green: bar</div>
|
|
||||||
<div svelte-2385185803>blue: bar</div>
|
|
||||||
|
<div svelte-1580141456>green: bar</div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
div[svelte-1408461649],[svelte-1408461649] div{color:red}
|
div[svelte-1408461649],[svelte-1408461649] div{color:red}
|
||||||
div[svelte-54999591],[svelte-54999591] div{color:green}
|
div[svelte-1580141456],[svelte-1580141456] div{color:green}
|
||||||
div[svelte-2385185803],[svelte-2385185803] div{color:blue}
|
|
@ -1,5 +1,8 @@
|
|||||||
<div svelte-1408461649>red</div>
|
<div svelte-1408461649>red</div>
|
||||||
<div svelte-54999591>green: foo</div>
|
<div svelte-1580141456>green: foo</div>
|
||||||
<div svelte-2385185803>blue: foo</div>
|
|
||||||
<div svelte-54999591>green: bar</div>
|
|
||||||
<div svelte-2385185803>blue: bar</div>
|
|
||||||
|
<div svelte-1580141456>green: bar</div>
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in new issue