chore: move `custom_renderer` to `state.js`

svelte-custom-renderer-single-type-argument
paoloricciuti 4 months ago
parent a2ccdc4f47
commit 8e6d68c1db

@ -482,7 +482,8 @@ export function analyze_component(root, source, options) {
component_name: name,
dev: options.dev,
rootDir: options.rootDir,
runes
runes,
custom_renderer: custom_renderer
});
// TODO remove all the ?? stuff, we don't need it now that we're validating the config
@ -535,7 +536,6 @@ export function analyze_component(root, source, options) {
event_directive_node: null,
uses_event_attributes: false,
custom_element,
custom_renderer,
inject_styles: css === 'injected' || is_custom_element,
accessors:
is_custom_element ||

@ -1,13 +1,14 @@
/** @import { Context } from '../types' */
/** @import { AST } from '#compiler'; */
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
/**
* @param {AST.AnimateDirective} node
* @param {Context} context
*/
export function AnimateDirective(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`animate:`');
}

@ -2,6 +2,7 @@
/** @import { Context } from '../types' */
import { cannot_be_set_statically, can_delegate_event } from '../../../../utils.js';
import { get_attribute_chunks, is_event_attribute } from '../../../utils/ast.js';
import { custom_renderer } from '../../../state.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
/**
@ -60,7 +61,7 @@ export function Attribute(node, context) {
}
// we can't delegate event handlers in a non dom environment
if (!context.state.analysis.custom_renderer) {
if (!custom_renderer) {
node.metadata.delegated =
parent?.type === 'RegularElement' && can_delegate_event(node.name.slice(2));
}

@ -12,6 +12,7 @@ import { binding_properties } from '../../bindings.js';
import fuzzymatch from '../../1-parse/utils/fuzzymatch.js';
import { is_content_editable_binding, is_svg } from '../../../../utils.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
import { custom_renderer } from '../../../state.js';
/**
* @param {AST.BindDirective} node
@ -27,7 +28,7 @@ export function BindDirective(node, context) {
parent?.type === 'SvelteDocument' ||
parent?.type === 'SvelteBody'
) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`bind:`');
}
if (node.name in binding_properties) {

@ -2,6 +2,7 @@
/** @import { Context } from '../types' */
import { is_tag_valid_with_parent } from '../../../../html-tree-validation.js';
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
/**
@ -11,7 +12,7 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
export function ExpressionTag(node, context) {
const in_template = context.path.at(-1)?.type === 'Fragment';
if (in_template && context.state.parent_element && !context.state.analysis.custom_renderer) {
if (in_template && context.state.parent_element && !custom_renderer) {
const message = is_tag_valid_with_parent('#text', context.state.parent_element);
if (message) {
e.node_invalid_placement(node, message);

@ -3,13 +3,14 @@
import { mark_subtree_dynamic } from './shared/fragment.js';
import { validate_opening_tag } from './shared/utils.js';
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
/**
* @param {AST.HtmlTag} node
* @param {Context} context
*/
export function HtmlTag(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`@html`');
}
if (context.state.analysis.runes) {

@ -2,6 +2,7 @@
/** @import { Context } from '../types' */
import * as e from '../../../errors.js';
import * as w from '../../../warnings.js';
import { custom_renderer } from '../../../state.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
/**
@ -9,7 +10,7 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
* @param {Context} context
*/
export function OnDirective(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`on:`');
}

@ -17,7 +17,7 @@ import { check_element } from './shared/a11y/index.js';
import { validate_element } from './shared/element.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
import { object } from '../../../utils/ast.js';
import { runes } from '../../../state.js';
import { runes, custom_renderer } from '../../../state.js';
/**
* @param {AST.RegularElement} node
@ -26,7 +26,7 @@ import { runes } from '../../../state.js';
export function RegularElement(node, context) {
validate_element(node, context);
if (!context.state.analysis.custom_renderer) {
if (!custom_renderer) {
check_element(node, context);
}
@ -37,7 +37,7 @@ export function RegularElement(node, context) {
if (node.name === 'textarea' && node.fragment.nodes.length > 0) {
for (const attribute of node.attributes) {
if (attribute.type === 'Attribute' && attribute.name === 'value') {
if (!context.state.analysis.custom_renderer) {
if (!custom_renderer) {
e.textarea_invalid_content(node);
}
}
@ -117,7 +117,7 @@ export function RegularElement(node, context) {
// We mark the subtree as dynamic so parent elements properly include the child init code
if (
(is_customizable_select_element(node) || node.name === 'selectedcontent') &&
!context.state.analysis.custom_renderer
!custom_renderer
) {
// Mark the element's own fragment as dynamic so it's not treated as static
node.fragment.metadata.dynamic = true;
@ -165,7 +165,7 @@ export function RegularElement(node, context) {
mark_subtree_dynamic(context.path);
}
if (context.state.parent_element && !context.state.analysis.custom_renderer) {
if (context.state.parent_element && !custom_renderer) {
let past_parent = false;
let only_warn = false;
const ancestors = [context.state.parent_element];
@ -227,7 +227,7 @@ export function RegularElement(node, context) {
!is_void(node_name) &&
!is_svg(node_name) &&
!is_mathml(node_name) &&
!context.state.analysis.custom_renderer
!custom_renderer
) {
w.element_invalid_self_closing_tag(node, node.name);
}

@ -1,6 +1,7 @@
/** @import { AST } from '#compiler' */
/** @import { Context } from '../types' */
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { is_event_attribute } from '../../../utils/ast.js';
import { disallow_children } from './shared/special-element.js';
@ -9,7 +10,7 @@ import { disallow_children } from './shared/special-element.js';
* @param {Context} context
*/
export function SvelteBody(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`<svelte:body>`');
}

@ -2,6 +2,7 @@
/** @import { Context } from '../types' */
import { disallow_children } from './shared/special-element.js';
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { is_event_attribute } from '../../../utils/ast.js';
/**
@ -9,7 +10,7 @@ import { is_event_attribute } from '../../../utils/ast.js';
* @param {Context} context
*/
export function SvelteDocument(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`<svelte:document>`');
}

@ -5,6 +5,7 @@ import { is_text_attribute } from '../../../utils/ast.js';
import { check_element } from './shared/a11y/index.js';
import { validate_element } from './shared/element.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
import { custom_renderer } from '../../../state.js';
/**
* @param {AST.SvelteElement} node
@ -13,7 +14,7 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
export function SvelteElement(node, context) {
validate_element(node, context);
if (!context.state.analysis.custom_renderer) {
if (!custom_renderer) {
check_element(node, context);
}

@ -1,6 +1,7 @@
/** @import { AST } from '#compiler' */
/** @import { Context } from '../types' */
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
/**
@ -8,7 +9,7 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
* @param {Context} context
*/
export function SvelteHead(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`<svelte:head>`');
}

@ -2,6 +2,7 @@
/** @import { Context } from '../types' */
import { disallow_children } from './shared/special-element.js';
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { is_event_attribute } from '../../../utils/ast.js';
/**
@ -9,7 +10,7 @@ import { is_event_attribute } from '../../../utils/ast.js';
* @param {Context} context
*/
export function SvelteWindow(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
e.incompatible_with_custom_renderer(node, '`<svelte:window>`');
}

@ -4,6 +4,7 @@ import { is_tag_valid_with_parent } from '../../../../html-tree-validation.js';
import { regex_bidirectional_control_characters, regex_not_whitespace } from '../../patterns.js';
import * as e from '../../../errors.js';
import * as w from '../../../warnings.js';
import { custom_renderer } from '../../../state.js';
import { extract_svelte_ignore } from '../../../utils/extract_svelte_ignore.js';
/**
@ -17,7 +18,7 @@ export function Text(node, context) {
parent.type === 'Fragment' &&
context.state.parent_element &&
regex_not_whitespace.test(node.data) &&
!context.state.analysis.custom_renderer
!custom_renderer
) {
const message = is_tag_valid_with_parent('#text', context.state.parent_element);
if (message) {

@ -1,6 +1,7 @@
/** @import { AST } from '#compiler' */
/** @import { Context } from '../types' */
import * as e from '../../../errors.js';
import { custom_renderer } from '../../../state.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
@ -9,7 +10,7 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
* @param {Context} context
*/
export function TransitionDirective(node, context) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
const directive = node.intro && node.outro ? '`transition:`' : node.intro ? '`in:`' : '`out:`';
e.incompatible_with_custom_renderer(node, directive);
}

@ -4,6 +4,7 @@ import { get_attribute_expression, is_expression_attribute } from '../../../../u
import { regex_illegal_attribute_character } from '../../../patterns.js';
import * as e from '../../../../errors.js';
import * as w from '../../../../warnings.js';
import { custom_renderer } from '../../../../state.js';
import {
validate_attribute,
validate_attribute_name,
@ -79,12 +80,12 @@ export function validate_element(node, context) {
validate_slot_attribute(context, attribute);
}
if (attribute.name === 'is' && !context.state.analysis.custom_renderer) {
if (attribute.name === 'is' && !custom_renderer) {
w.attribute_avoid_is(attribute);
}
const correct_name = react_attributes.get(attribute.name);
if (correct_name && !context.state.analysis.custom_renderer) {
if (correct_name && !custom_renderer) {
w.attribute_invalid_property_name(attribute, attribute.name, correct_name);
}

@ -6,7 +6,7 @@ import { walk } from 'zimmerframe';
import * as b from '#compiler/builders';
import { build_getter, is_state_source } from './utils.js';
import { render_stylesheet } from '../css/index.js';
import { dev, filename } from '../../../state.js';
import { dev, filename, custom_renderer } from '../../../state.js';
import { AnimateDirective } from './visitors/AnimateDirective.js';
import { ArrowFunctionExpression } from './visitors/ArrowFunctionExpression.js';
import { AssignmentExpression } from './visitors/AssignmentExpression.js';
@ -138,13 +138,10 @@ const visitors = {
VariableDeclaration
};
/**
* @param {string | undefined} custom_renderer_module
*/
function get_imports(custom_renderer_module) {
function get_imports() {
const imports = [b.import_all('$', 'svelte/internal/client')];
if (custom_renderer_module) {
imports.push(b.imports([['$renderer', '$renderer', true]], custom_renderer_module));
if (custom_renderer) {
imports.push(b.imports([['$renderer', '$renderer', true]], custom_renderer));
}
return imports;
}
@ -162,7 +159,7 @@ export function client_component(analysis, options) {
scope: analysis.module.scope,
scopes: analysis.module.scopes,
is_instance: false,
hoisted: [...get_imports(analysis.custom_renderer), ...analysis.instance_body.hoisted],
hoisted: [...get_imports(), ...analysis.instance_body.hoisted],
node: /** @type {any} */ (null), // populated by the root node
legacy_reactive_imports: [],
legacy_reactive_statements: new Map(),
@ -575,11 +572,11 @@ export function client_component(analysis, options) {
// disclose version attach the svelte version to `window` which is not guaranteed
// to be a thing in custom renderers environments
if (options.discloseVersion && !analysis.custom_renderer) {
if (options.discloseVersion && !custom_renderer) {
body.unshift(b.imports([], 'svelte/internal/disclose-version'));
}
if (!analysis.custom_renderer) {
if (!custom_renderer) {
body.unshift(b.imports([], 'svelte/internal/init-operations'));
}
@ -606,7 +603,7 @@ export function client_component(analysis, options) {
component_block.body.unshift(b.const(analysis.props_id, b.call('$.props_id')));
}
if (analysis.custom_renderer) {
if (custom_renderer) {
component_block.body.unshift(
b.var('$$pop_renderer', b.call('$.push_renderer', b.id('$renderer')))
);

@ -2,7 +2,7 @@
/** @import { ComponentClientTransformState } from '../types.js' */
/** @import { Node } from './types.js' */
import { TEMPLATE_USE_MATHML, TEMPLATE_USE_SVG } from '../../../../../constants.js';
import { dev, locator } from '../../../../state.js';
import { dev, locator, custom_renderer } from '../../../../state.js';
import * as b from '../../../../utils/builders.js';
/**
@ -36,7 +36,7 @@ function build_locations(nodes) {
*/
export function transform_template(state, namespace, flags = 0) {
// custom renderers needs a tree to work because there's no template element we can use
const tree = state.options.fragments === 'tree' || !!state.analysis.custom_renderer;
const tree = state.options.fragments === 'tree' || custom_renderer;
const expression = tree ? state.template.as_tree() : state.template.as_html();
@ -51,7 +51,7 @@ export function transform_template(state, namespace, flags = 0) {
flags ? b.literal(flags) : undefined
);
if (state.template.contains_script_tag && !state.analysis.custom_renderer) {
if (state.template.contains_script_tag && !custom_renderer) {
call = b.call(`$.with_script`, call);
}

@ -8,7 +8,7 @@ import {
is_dom_property,
is_load_error_element
} from '../../../../../utils.js';
import { is_ignored } from '../../../../state.js';
import { is_ignored, custom_renderer } from '../../../../state.js';
import { is_event_attribute, is_text_attribute } from '../../../../utils/ast.js';
import * as b from '#compiler/builders';
import {
@ -39,9 +39,7 @@ import { TEMPLATE_FRAGMENT } from '../../../../../constants.js';
*/
export function RegularElement(node, context) {
const is_html =
context.state.metadata.namespace === 'html' &&
node.name !== 'svg' &&
!context.state.analysis.custom_renderer;
context.state.metadata.namespace === 'html' && node.name !== 'svg' && !custom_renderer;
const name = is_html ? node.name.toLowerCase() : node.name;
context.state.template.push_element(name, node.start, is_html);
@ -51,7 +49,7 @@ export function RegularElement(node, context) {
}
// we never treat elements as custom element in custom renderers, since we don't want to apply special handling to them (e.g. class merging)
const is_custom_element = is_custom_element_node(node) && !context.state.analysis.custom_renderer;
const is_custom_element = is_custom_element_node(node) && !custom_renderer;
// cloneNode is faster, but it does not instantiate the underlying class of the
// custom element until the template is connected to the dom, which would
@ -212,7 +210,7 @@ export function RegularElement(node, context) {
/** If true, needs `__value` for inputs */
const needs_special_value_handling =
!context.state.analysis.custom_renderer &&
!custom_renderer &&
(name === 'option' || name === 'select' || bindings.has('group') || bindings.has('checked'));
if (has_spread) {
@ -236,7 +234,7 @@ export function RegularElement(node, context) {
continue;
}
const name = get_attribute_name(node, attribute, !!context.state.analysis.custom_renderer);
const name = get_attribute_name(node, attribute);
if (
!is_custom_element &&
@ -258,7 +256,7 @@ export function RegularElement(node, context) {
if (name !== 'class' || value) {
context.state.template.set_prop(attribute.name, value === true ? '' : value);
}
} else if (name === 'autofocus' && !context.state.analysis.custom_renderer) {
} else if (name === 'autofocus' && !custom_renderer) {
let { value } = build_attribute_value(attribute.value, context);
context.state.init.push(b.stmt(b.call('$.autofocus', node_id, value)));
} else if (name === 'class') {
@ -274,14 +272,7 @@ export function RegularElement(node, context) {
(value, metadata) => context.state.memoizer.add(value, metadata)
);
const update = build_element_attribute_update(
node,
node_id,
name,
value,
attributes,
!!context.state.analysis.custom_renderer
);
const update = build_element_attribute_update(node, node_id, name, value, attributes);
(has_state ? context.state.update : context.state.init).push(b.stmt(update));
}
@ -357,7 +348,7 @@ export function RegularElement(node, context) {
const empty_string = value.type === 'Literal' && value.value === '';
if (!empty_string) {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
// custom renderers need to use the method to invoke the renderer
context.state.template.push_text([
{
@ -377,7 +368,7 @@ export function RegularElement(node, context) {
);
}
}
} else if (is_customizable_select_element(node) && !context.state.analysis.custom_renderer) {
} else if (is_customizable_select_element(node) && !custom_renderer) {
// For <option>, <optgroup>, or <select> elements with rich content, we need to branch based on browser support.
// Modern browsers preserve rich HTML in options, older browsers strip it to text only.
// We create a separate template for the rich content and append it to the element.
@ -439,7 +430,7 @@ export function RegularElement(node, context) {
// The same applies if it's a `<template>` element, since we need to
// set the value of `hydrate_node` to `node.content`
if (name === 'template' && !context.state.analysis.custom_renderer) {
if (name === 'template' && !custom_renderer) {
needs_reset = true;
child_state.init.push(b.stmt(b.call('$.hydrate_template', arg)));
arg = b.member(arg, 'content');
@ -476,7 +467,7 @@ export function RegularElement(node, context) {
context.state.after_update.push(...element_state.after_update);
}
if (name === 'selectedcontent' && !context.state.analysis.custom_renderer) {
if (name === 'selectedcontent' && !custom_renderer) {
context.state.init.push(
b.stmt(
b.call(
@ -608,14 +599,7 @@ export function build_style_directives_object(
* @param {Expression} value
* @param {Array<AST.Attribute | AST.SpreadAttribute>} attributes
*/
function build_element_attribute_update(
element,
node_id,
name,
value,
attributes,
custom_renderer = false
) {
function build_element_attribute_update(element, node_id, name, value, attributes) {
if (name === 'muted' && !custom_renderer) {
// Special case for Firefox who needs it set as a property in order to work
return b.assignment('=', b.member(node_id, b.id('muted')), value);

@ -2,6 +2,7 @@
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../types' */
import { unwrap_optional } from '../../../../utils/ast.js';
import { custom_renderer } from '../../../../state.js';
import * as b from '#compiler/builders';
import { add_svelte_meta, build_expression, Memoizer } from './shared/utils.js';
@ -46,7 +47,7 @@ export function RenderTag(node, context) {
if (node.metadata.dynamic) {
// In custom renderer components, validate that the snippet is compatible
// with the current renderer before rendering it
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
snippet_function = b.call('$.validate_snippet_renderer', b.id('$renderer'), snippet_function);
}
@ -65,7 +66,7 @@ export function RenderTag(node, context) {
} else {
// In custom renderer components, validate that the snippet is compatible
// with the current renderer before rendering it
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
snippet_function = b.call('$.validate_snippet_renderer', b.id('$renderer'), snippet_function);
}

@ -1,7 +1,7 @@
/** @import { AssignmentPattern, BlockStatement, Expression, Identifier, Statement } from 'estree' */
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../types' */
import { dev } from '../../../../state.js';
import { dev, custom_renderer } from '../../../../state.js';
import { extract_paths } from '../../../../utils/ast.js';
import * as b from '#compiler/builders';
import { get_value } from './shared/declarations.js';
@ -81,7 +81,7 @@ export function SnippetBlock(node, context) {
// wrap snippets in components with a custom renderer so they can only be
// rendered by the same renderer that compiled them
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
snippet = b.call('$.renderer_snippet', b.id('$renderer'), snippet);
}

@ -1,7 +1,7 @@
/** @import { BlockStatement, Expression, ExpressionStatement, Identifier, MemberExpression, Pattern, Property, SequenceExpression, SourceLocation, Statement } from 'estree' */
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../../types.js' */
import { dev, is_ignored } from '../../../../../state.js';
import { dev, is_ignored, custom_renderer } from '../../../../../state.js';
import { get_attribute_chunks, object } from '../../../../../utils/ast.js';
import * as b from '#compiler/builders';
import { add_svelte_meta, build_bind_this, Memoizer, validate_binding } from '../shared/utils.js';
@ -456,7 +456,7 @@ export function build_component(node, component_name, loc, context) {
};
}
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
const prev = fn;
fn = (node_id) => {
return b.call('$.without_renderer', b.arrow([], prev(node_id)));

@ -3,7 +3,7 @@
/** @import { ComponentContext } from '../../types' */
import { escape_html } from '../../../../../../escaping.js';
import { normalize_attribute } from '../../../../../../utils.js';
import { is_ignored } from '../../../../../state.js';
import { is_ignored, custom_renderer } from '../../../../../state.js';
import { is_event_attribute } from '../../../../../utils/ast.js';
import * as b from '#compiler/builders';
import { build_class_directives_object, build_style_directives_object } from '../RegularElement.js';
@ -132,9 +132,8 @@ export function build_attribute_value(value, context, memoize = (value) => value
/**
* @param {AST.RegularElement | AST.SvelteElement} element
* @param {AST.Attribute} attribute
* @param {boolean} [custom_renderer]
*/
export function get_attribute_name(element, attribute, custom_renderer) {
export function get_attribute_name(element, attribute) {
if (!custom_renderer && !element.metadata.svg && !element.metadata.mathml) {
return normalize_attribute(attribute.name);
}

@ -2,6 +2,7 @@
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../../types' */
import { cannot_be_set_statically } from '../../../../../../utils.js';
import { custom_renderer } from '../../../../../state.js';
import { is_event_attribute, is_text_attribute } from '../../../../../utils/ast.js';
import * as b from '#compiler/builders';
import { is_custom_element_node } from '../../../../nodes.js';
@ -83,7 +84,7 @@ export function process_children(nodes, initial, is_element, context) {
if (has_state && !within_bound_contenteditable) {
context.state.update.push(update);
} else {
if (context.state.analysis.custom_renderer) {
if (custom_renderer) {
// custom renderers need to use the method to invoke the renderer
context.state.init.push(update);
} else {

@ -3,7 +3,7 @@
/** @import { ComponentContext, ComponentServerTransformState } from '../types.js' */
/** @import { Scope } from '../../../scope.js' */
import { is_void } from '../../../../../utils.js';
import { dev, locator } from '../../../../state.js';
import { dev, locator, custom_renderer } from '../../../../state.js';
import * as b from '#compiler/builders';
import { clean_nodes, determine_namespace_for_children } from '../../utils.js';
import { build_element_attributes, prepare_element_spread_object } from './shared/element.js';
@ -110,7 +110,7 @@ export function RegularElement(node, context) {
const [attributes, ...rest] = prepare_element_spread_object(node, context, optimiser.transform);
if (is_customizable_select_element(node) && !context.state.analysis.custom_renderer) {
if (is_customizable_select_element(node) && !custom_renderer) {
rest.push(b.true);
}
@ -157,7 +157,7 @@ export function RegularElement(node, context) {
const [attributes, ...rest] = prepare_element_spread_object(node, context, optimiser.transform);
if (is_customizable_select_element(node) && !context.state.analysis.custom_renderer) {
if (is_customizable_select_element(node) && !custom_renderer) {
rest.push(b.true);
}
@ -195,7 +195,7 @@ export function RegularElement(node, context) {
if (
(name === 'optgroup' || name === 'select') &&
is_customizable_select_element(node) &&
!context.state.analysis.custom_renderer
!custom_renderer
) {
state.template.push(b.literal('<!>'));
}

@ -100,10 +100,6 @@ export interface ComponentAnalysis extends Analysis {
* or if not present a boolean which corresponds to the compiler option value
*/
custom_element: boolean | AST.SvelteOptions['customElement'];
/**
* The resolved custom renderer module path, or undefined if not using a custom renderer
*/
custom_renderer: string | undefined;
/** If `true`, should append styles through JavaScript */
inject_styles: boolean;
reactive_statements: Map<LabeledStatement, ReactiveStatement>;

@ -46,6 +46,9 @@ export let dev;
export let runes = false;
/** @type {string | null | undefined} */
export let custom_renderer = null;
/** @type {(index: number) => Location} */
export let locator;
@ -139,6 +142,7 @@ export function is_ignored(node, code) {
export function reset(state) {
dev = false;
runes = false;
custom_renderer = null;
component_name = UNKNOWN_FILENAME;
source = '';
source_lines = [];
@ -155,6 +159,7 @@ export function reset(state) {
* component_name?: string;
* rootDir?: string;
* runes: boolean;
* custom_renderer?: string | null | undefined;
* }} state
*/
export function adjust(state) {
@ -162,6 +167,7 @@ export function adjust(state) {
dev = state.dev;
runes = state.runes;
custom_renderer = state.custom_renderer;
component_name = state.component_name ?? UNKNOWN_FILENAME;
if (typeof root_dir === 'string' && filename.startsWith(root_dir)) {

Loading…
Cancel
Save