chore: simplify SSR (#11977)

* chore: simplify SSR escaping

* treat solo expressions the same as sequence expressions

* reduce some indirection

* more

* tidy

* tidy

* remove unused types

* more

* this doesnt do anything

* more

* Anchor is unused

* simplify

* simplify

* move special case handling

* more

* simplify

* simplify

* simplify

* more

* unnecessary

* simplify

* remove unused arg

* more

* more

* unnecessary

* more

* more

* dedupe
pull/11985/head
Rich Harris 1 year ago committed by GitHub
parent 2be6d43ea3
commit f752b1e255
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -3,18 +3,6 @@ import { function_visitor, serialize_hoistable_params } from '../utils.js';
/** @type {import('../types.js').ComponentVisitors} */
export const javascript_visitors = {
Program(node, { visit }) {
return /** @type {import('estree').Program} */ ({
...node,
body: node.body.map((node) => /** @type {import('estree').Node} */ (visit(node)))
});
},
BlockStatement(node, { visit }) {
return /** @type {import('estree').BlockStatement} */ ({
...node,
body: node.body.map((node) => /** @type {import('estree').Node} */ (visit(node)))
});
},
FunctionExpression: function_visitor,
ArrowFunctionExpression: function_visitor,
FunctionDeclaration(node, context) {

@ -1435,37 +1435,29 @@ function get_node_id(expression, state, name) {
}
/**
* @param {true | Array<import('#compiler').Text | import('#compiler').ExpressionTag>} attribute_value
* @param {true | Array<import('#compiler').Text | import('#compiler').ExpressionTag>} value
* @param {import('../types').ComponentContext} context
* @returns {[boolean, import('estree').Expression]}
* @returns {[contains_call_expression: boolean, import('estree').Expression]}
*/
function serialize_attribute_value(attribute_value, context) {
let contains_call_expression = false;
if (attribute_value === true) {
return [contains_call_expression, b.literal(true)];
function serialize_attribute_value(value, context) {
if (value === true) {
return [false, b.literal(true)];
}
if (attribute_value.length === 0) {
return [contains_call_expression, b.literal('')]; // is this even possible?
}
if (value.length === 1) {
const chunk = value[0];
if (attribute_value.length === 1) {
const value = attribute_value[0];
if (value.type === 'Text') {
return [contains_call_expression, b.literal(value.data)];
} else {
if (value.type === 'ExpressionTag') {
contains_call_expression = value.metadata.contains_call_expression;
}
return [
contains_call_expression,
/** @type {import('estree').Expression} */ (context.visit(value.expression))
];
if (chunk.type === 'Text') {
return [false, b.literal(chunk.data)];
}
return [
chunk.metadata.contains_call_expression,
/** @type {import('estree').Expression} */ (context.visit(chunk.expression))
];
}
return serialize_template_literal(attribute_value, context.visit, context.state);
return serialize_template_literal(value, context.visit, context.state);
}
/**

@ -1,38 +1,9 @@
import type {
Expression,
Identifier,
Statement,
ModuleDeclaration,
LabeledStatement
} from 'estree';
import type { Expression, Statement, ModuleDeclaration, LabeledStatement } from 'estree';
import type { SvelteNode, Namespace, ValidatedCompileOptions } from '#compiler';
import type { TransformState } from '../types.js';
import type { ComponentAnalysis } from '../../types.js';
import type { StateField } from '../client/types.js';
export type TemplateExpression = {
type: 'expression';
value: Expression;
needs_escaping: boolean;
};
export type TemplateString = {
type: 'string';
value: string;
};
export type TemplateStatement = {
type: 'statement';
value: Statement;
};
export type Template = TemplateExpression | TemplateString | TemplateStatement;
export interface Anchor {
type: 'Anchor';
id: Identifier;
}
export interface ServerTransformState extends TransformState {
/** The $: calls, which will be ordered in the end */
readonly legacy_reactive_statements: Map<LabeledStatement, Statement>;
@ -48,10 +19,8 @@ export interface ComponentServerTransformState extends ServerTransformState {
readonly hoisted: Array<Statement | ModuleDeclaration>;
/** The SSR template */
readonly template: Template[];
readonly metadata: {
namespace: Namespace;
};
readonly template: Array<Statement | Expression>;
readonly namespace: Namespace;
readonly preserve_whitespace: boolean;
}

@ -0,0 +1,5 @@
import { test } from '../../test';
export default test({
html: `<p>&lt;marquee&gt;hello&lt;/marquee&gt;</p>`
});
Loading…
Cancel
Save