remove preprocess from ssr renderer

pull/992/head
Rich Harris 8 years ago
parent 3fa83e332f
commit 9b2a7e17ad

@ -725,6 +725,10 @@ export default class Generator {
node.__proto__ = nodes[node.type].prototype;
}
if (node.type === 'Element') {
generator.stylesheet.apply(node);
}
if (node.type === 'EachBlock') {
node.metadata = contextualise(node.expression, contextDependencies, indexes);
@ -800,6 +804,22 @@ export default class Generator {
indexes = indexesStack[indexesStack.length - 1];
}
}
if (node.type === 'Element' && node.name === 'option') {
// Special case — treat these the same way:
// <option>{{foo}}</option>
// <option value='{{foo}}'>{{foo}}</option>
const valueAttribute = node.attributes.find((attribute: Node) => attribute.name === 'value');
if (!valueAttribute) {
node.attributes.push(new nodes.Attribute({
generator,
name: 'value',
value: node.children,
parent: node
}));
}
}
}
});
}

@ -162,11 +162,7 @@ export default class Attribute {
updater = `@setInputType(${node.var}, ${shouldCache ? last : value});`;
} else if (isSelectValueAttribute) {
// annoying special case
const isMultipleSelect =
node.name === 'select' &&
node.attributes.find(
(attr: Attribute) => attr.name.toLowerCase() === 'multiple'
); // TODO use getStaticAttributeValue
const isMultipleSelect = node.getStaticAttributeValue('multiple');
const i = block.getUniqueName('i');
const option = block.getUniqueName('option');

@ -89,18 +89,6 @@ export default class Element extends Node {
const valueAttribute = this.attributes.find((attribute: Attribute) => attribute.name === 'value');
// Treat these the same way:
// <option>{{foo}}</option>
// <option value='{{foo}}'>{{foo}}</option>
if (this.name === 'option' && !valueAttribute) {
this.attributes.push(new Attribute({
generator: this.generator,
name: 'value',
value: this.children,
parent: this
}));
}
if (this.name === 'textarea') {
// this is an egregious hack, but it's the easiest way to get <textarea>
// children treated the same way as a value attribute

@ -2,7 +2,6 @@ import deindent from '../../utils/deindent';
import Generator from '../Generator';
import Stylesheet from '../../css/Stylesheet';
import Block from './Block';
import preprocess from './preprocess';
import visit from './visit';
import { removeNode, removeObjectKey } from '../../utils/removeNode';
import getName from '../../utils/getName';
@ -28,8 +27,6 @@ export class SsrGenerator extends Generator {
this.renderCode = '';
this.appendTargets = [];
preprocess(this, parsed.html);
this.stylesheet.warnOnUnusedSelectors(options.onwarn);
}

@ -1,112 +0,0 @@
import getStaticAttributeValue from '../../utils/getStaticAttributeValue';
import isChildOfComponent from '../shared/utils/isChildOfComponent';
import Element from '../nodes/Element';
import { SsrGenerator } from './index';
import { Node } from '../../interfaces';
function noop () {}
const preprocessors = {
MustacheTag: noop,
RawMustacheTag: noop,
Text: noop,
AwaitBlock: (
generator: SsrGenerator,
node: Node,
elementStack: Node[]
) => {
preprocessChildren(generator, node.pending, elementStack);
preprocessChildren(generator, node.then, elementStack);
preprocessChildren(generator, node.catch, elementStack);
},
IfBlock: (
generator: SsrGenerator,
node: Node,
elementStack: Node[]
) => {
preprocessChildren(generator, node, elementStack);
if (node.else) {
preprocessChildren(
generator,
node.else,
elementStack
);
}
},
EachBlock: (
generator: SsrGenerator,
node: Node,
elementStack: Node[]
) => {
preprocessChildren(generator, node, elementStack);
if (node.else) {
preprocessChildren(
generator,
node.else,
elementStack
);
}
},
Element: (
generator: SsrGenerator,
node: Element,
elementStack: Node[]
) => {
generator.stylesheet.apply(node);
const slot = getStaticAttributeValue(node, 'slot');
if (slot && node.isChildOfComponent()) {
node.slotted = true;
}
// Treat these the same way:
// <option>{{foo}}</option>
// <option value='{{foo}}'>{{foo}}</option>
const valueAttribute = node.attributes.find((attribute: Node) => attribute.name === 'value');
if (node.name === 'option' && !valueAttribute) {
node.attributes.push({
type: 'Attribute',
name: 'value',
value: node.children
});
}
if (node.children.length) {
preprocessChildren(generator, node, elementStack.concat(node));
}
},
Component: (
generator: SsrGenerator,
node: Node,
elementStack: Node[]
) => {
if (node.children.length) {
preprocessChildren(generator, node, elementStack);
}
},
};
function preprocessChildren(
generator: SsrGenerator,
node: Node,
elementStack: Node[]
) {
node.children.forEach((child: Node, i: number) => {
child.parent = node;
const preprocessor = preprocessors[child.type];
if (preprocessor) preprocessor(generator, child, elementStack);
});
}
export default function preprocess(generator: SsrGenerator, html: Node) {
preprocessChildren(generator, html, []);
}

@ -3,6 +3,7 @@ import visitSlot from './Slot';
import isVoidElementName from '../../../utils/isVoidElementName';
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';
@ -24,7 +25,7 @@ function stringifyAttributeValue(block: Block, chunks: Node[]) {
export default function visitElement(
generator: SsrGenerator,
block: Block,
node: Node
node: Element
) {
if (node.name === 'slot') {
visitSlot(generator, block, node);
@ -34,7 +35,8 @@ export default function visitElement(
let openingTag = `<${node.name}`;
let textareaContents; // awkward special case
if (node.slotted) {
const slot = node.getStaticAttributeValue('slot');
if (slot && node.isChildOfComponent()) {
const slot = node.attributes.find((attribute: Node) => attribute.name === 'slot');
const slotName = slot.value[0].data;
const appendTarget = generator.appendTargets[generator.appendTargets.length - 1];

Loading…
Cancel
Save