generate title in SSR compiler

pull/1024/head
Rich Harris 7 years ago
parent bc505161d1
commit 545ed7f0ed

@ -1,3 +1,16 @@
export default function visitDocument() {
// noop
}
import { SsrGenerator } from '../index';
import Block from '../Block';
import { Node } from '../../../interfaces';
import stringifyAttributeValue from './shared/stringifyAttributeValue';
export default function visitDocument(
generator: SsrGenerator,
block: Block,
node: Node
) {
const title = node.attributes.find(attribute => attribute.type === 'Attribute' && attribute.name === 'title');
if (title) {
generator.append('${(__result.title = `' + stringifyAttributeValue(block, title.value) + '`, "")}');
}
}

@ -5,22 +5,8 @@ import visit from '../visit';
import { SsrGenerator } from '../index';
import Element from '../../nodes/Element';
import Block from '../Block';
import { escape } from '../../../utils/stringify';
import { Node } from '../../../interfaces';
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('');
}
import stringifyAttributeValue from './shared/stringifyAttributeValue';
export default function visitElement(
generator: SsrGenerator,

@ -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('');
}

@ -59,7 +59,7 @@ describe("ssr", () => {
const data = tryToLoadJson(`${dir}/data.json`);
const { html, css } = component.render(data);
const { html, css, title } = component.render(data);
fs.writeFileSync(`${dir}/_actual.html`, html);
if (css.code) fs.writeFileSync(`${dir}/_actual.css`, css.code);
@ -70,6 +70,13 @@ describe("ssr", () => {
expectedCss.replace(/^\s+/gm, "")
);
if (fs.existsSync(`${dir}/title.txt`)) {
assert.equal(
title,
fs.readFileSync(`${dir}/title.txt`, 'utf-8')
);
}
if (show) showOutput(dir, { generate: 'ssr' });
} catch (err) {
showOutput(dir, { generate: 'ssr' });

@ -0,0 +1 @@
<:Document title='a {{adjective}} title'/>
Loading…
Cancel
Save