diff --git a/src/compiler/compile/render_ssr/handlers/InlineComponent.ts b/src/compiler/compile/render_ssr/handlers/InlineComponent.ts index 4b9456a72a..f3c5e25858 100644 --- a/src/compiler/compile/render_ssr/handlers/InlineComponent.ts +++ b/src/compiler/compile/render_ssr/handlers/InlineComponent.ts @@ -1,115 +1,107 @@ -import { string_literal } from '../../utils/stringify'; +import { string_literal } from '../../utils/stringify.js'; import { get_attribute_value } from './shared/get_attribute_value'; -import Renderer, { RenderOptions } from '../Renderer'; -import InlineComponent from '../../nodes/InlineComponent'; import { p, x } from 'code-red'; import { namespaces } from '../../../utils/namespaces'; +/** @param {any} attribute */ function get_prop_value(attribute) { - if (attribute.is_true) return x`true`; - if (attribute.chunks.length === 0) return x`''`; - - return attribute.chunks - .map((chunk) => { - if (chunk.type === 'Text') return string_literal(chunk.data); - return chunk.node; - }) - .reduce((lhs, rhs) => x`${lhs} + ${rhs}`); + if (attribute.is_true) + return x `true`; + if (attribute.chunks.length === 0) + return x `''`; + return attribute.chunks + .map((chunk) => { + if (chunk.type === 'Text') + return string_literal(chunk.data); + return chunk.node; + }) + .reduce((lhs, rhs) => x `${lhs} + ${rhs}`); } -export default function (node: InlineComponent, renderer: Renderer, options: RenderOptions) { - const binding_props = []; - const binding_fns = []; - - node.bindings.forEach((binding) => { - renderer.has_bindings = true; - - // TODO this probably won't work for contextual bindings - const snippet = binding.expression.node; - - binding_props.push(p`${binding.name}: ${snippet}`); - binding_fns.push(p`${binding.name}: $$value => { ${snippet} = $$value; $$settled = false }`); - }); - - const uses_spread = node.attributes.find((attr) => attr.is_spread); - - let props; - - if (uses_spread) { - props = x`@_Object.assign({}, ${node.attributes - .map((attribute) => { - if (attribute.is_spread) { - return attribute.expression.node; - } else { - return x`{ ${attribute.name}: ${get_prop_value(attribute)} }`; - } - }) - .concat(binding_props.map((p) => x`{ ${p} }`))})`; - } else { - props = x`{ - ${node.attributes.map((attribute) => p`${attribute.name}: ${get_prop_value(attribute)}`)}, +/** + * @param {import('../../nodes/InlineComponent.js').default} node + * @param {import('../Renderer.js').default} renderer + * @param {import('../Renderer.js').RenderOptions} options + */ +export default function (node, renderer, options) { + const binding_props = []; + const binding_fns = []; + node.bindings.forEach((binding) => { + renderer.has_bindings = true; + // TODO this probably won't work for contextual bindings + const snippet = binding.expression.node; + binding_props.push(p `${binding.name}: ${snippet}`); + binding_fns.push(p `${binding.name}: $$value => { ${snippet} = $$value; $$settled = false }`); + }); + const uses_spread = node.attributes.find((attr) => attr.is_spread); + let props; + if (uses_spread) { + props = x `@_Object.assign({}, ${node.attributes + .map((attribute) => { + if (attribute.is_spread) { + return attribute.expression.node; + } + else { + return x `{ ${attribute.name}: ${get_prop_value(attribute)} }`; + } + }) + .concat(binding_props.map((p) => x `{ ${p} }`))})`; + } + else { + props = x `{ + ${node.attributes.map((attribute) => p `${attribute.name}: ${get_prop_value(attribute)}`)}, ${binding_props} }`; - } - - const bindings = x`{ + } + const bindings = x `{ ${binding_fns} }`; - - const expression = - node.name === 'svelte:self' - ? renderer.name - : node.name === 'svelte:component' - ? x`(${node.expression.node}) || @missing_component` - : node.name.split('.').reduce(((lhs, rhs) => x`${lhs}.${rhs}`) as any); - - const slot_fns = []; - - const children = node.children; - - if (children.length) { - const slot_scopes = new Map(); - - renderer.render( - children, - Object.assign({}, options, { - slot_scopes - }) - ); - - slot_scopes.forEach(({ input, output, statements }, name) => { - slot_fns.push(p`${name}: (${input}) => { ${statements}; return ${output}; }`); - }); - } - - const slots = x`{ + const expression = node.name === 'svelte:self' + ? renderer.name + : node.name === 'svelte:component' + ? x `(${node.expression.node}) || @missing_component` + : node.name.split('.').reduce(/** @type {any} */ (((lhs, rhs) => x `${lhs}.${rhs}`))); + const slot_fns = []; + const children = node.children; + if (children.length) { + const slot_scopes = new Map(); + renderer.render(children, Object.assign({}, options, { + slot_scopes + })); + slot_scopes.forEach(({ input, output, statements }, name) => { + slot_fns.push(p `${name}: (${input}) => { ${statements}; return ${output}; }`); + }); + } + const slots = x `{ ${slot_fns} }`; + if (node.css_custom_properties.length > 0) { + if (node.namespace === namespaces.svg) { + renderer.add_string(' { + renderer.add_string(`${attr.name}:`); + renderer.add_expression(get_attribute_value(attr)); + renderer.add_string(';'); + if (index < node.css_custom_properties.length - 1) + renderer.add_string(' '); + }); + renderer.add_string('">'); + } + renderer.add_expression(x `@validate_component(${expression}, "${node.name}").$$render($$result, ${props}, ${bindings}, ${slots})`); + if (node.css_custom_properties.length > 0) { + if (node.namespace === namespaces.svg) { + renderer.add_string(''); + } + else { + renderer.add_string(''); + } + } +} + - if (node.css_custom_properties.length > 0) { - if (node.namespace === namespaces.svg) { - renderer.add_string(' { - renderer.add_string(`${attr.name}:`); - renderer.add_expression(get_attribute_value(attr)); - renderer.add_string(';'); - if (index < node.css_custom_properties.length - 1) renderer.add_string(' '); - }); - renderer.add_string('">'); - } - renderer.add_expression( - x`@validate_component(${expression}, "${node.name}").$$render($$result, ${props}, ${bindings}, ${slots})` - ); - if (node.css_custom_properties.length > 0) { - if (node.namespace === namespaces.svg) { - renderer.add_string(''); - } else { - renderer.add_string(''); - } - } -}