RenderTag.js — svelte Source File
Architecture documentation for RenderTag.js, a javascript file in the svelte codebase. 7 imports, 1 dependents.
Entity Profile
Dependency Diagram
graph LR 33213a93_cd07_c3e4_5bd9_38e1d3664aa0["RenderTag.js"] 0c5c28a7_226d_4e7c_e75e_0853c0a9fc2c["ast.js"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> 0c5c28a7_226d_4e7c_e75e_0853c0a9fc2c 9bcad0f1_2e1e_1fe2_1a87_0967adb89be8["unwrap_optional"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> 9bcad0f1_2e1e_1fe2_1a87_0967adb89be8 d04d7971_88df_542d_dd4f_26170ce6f581["utils.js"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> d04d7971_88df_542d_dd4f_26170ce6f581 575bfb79_8777_5076_eda3_be015882482a["add_svelte_meta"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> 575bfb79_8777_5076_eda3_be015882482a 66243dec_e2be_a66d_3992_3ea42cf964b5["build_expression"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> 66243dec_e2be_a66d_3992_3ea42cf964b5 be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1["Memoizer"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 95c28355_f14c_c3cd_5a03_d5a53ca255bc["builders"] 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 --> 95c28355_f14c_c3cd_5a03_d5a53ca255bc 7665e008_f37d_b860_a594_f2539a66af4e["transform-client.js"] 7665e008_f37d_b860_a594_f2539a66af4e --> 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 style 33213a93_cd07_c3e4_5bd9_38e1d3664aa0 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
/** @import { Expression, Statement } from 'estree' */
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../types' */
import { unwrap_optional } from '../../../../utils/ast.js';
import * as b from '#compiler/builders';
import { add_svelte_meta, build_expression, Memoizer } from './shared/utils.js';
/**
* @param {AST.RenderTag} node
* @param {ComponentContext} context
*/
export function RenderTag(node, context) {
context.state.template.push_comment();
const call = unwrap_optional(node.expression);
/** @type {Expression[]} */
let args = [];
const memoizer = new Memoizer();
for (let i = 0; i < call.arguments.length; i++) {
const arg = /** @type {Expression} */ (call.arguments[i]);
const metadata = node.metadata.arguments[i];
let expression = build_expression(context, arg, metadata);
const memoized = memoizer.add(expression, metadata);
if (expression !== memoized) {
expression = b.call('$.get', memoized);
}
args.push(b.thunk(expression));
}
memoizer.apply();
/** @type {Statement[]} */
const statements = memoizer.deriveds(context.state.analysis.runes);
let snippet_function = build_expression(
context,
/** @type {Expression} */ (call.callee),
node.metadata.expression
);
if (node.metadata.dynamic) {
// If we have a chain expression then ensure a nullish snippet function gets turned into an empty one
if (node.expression.type === 'ChainExpression') {
snippet_function = b.logical('??', snippet_function, b.id('$.noop'));
}
statements.push(
add_svelte_meta(
b.call('$.snippet', context.state.node, b.thunk(snippet_function), ...args),
node,
'render'
)
);
} else {
statements.push(
add_svelte_meta(
(node.expression.type === 'CallExpression' ? b.call : b.maybe_call)(
snippet_function,
context.state.node,
...args
),
node,
'render'
)
);
}
const async_values = memoizer.async_values();
const blockers = memoizer.blockers();
if (async_values || blockers) {
context.state.init.push(
b.stmt(
b.call(
'$.async',
context.state.node,
blockers,
memoizer.async_values(),
b.arrow([context.state.node, ...memoizer.async_ids()], b.block(statements))
)
)
);
if (context.state.is_standalone) {
context.state.init.push(b.stmt(b.call('$.next')));
}
} else {
context.state.init.push(statements.length === 1 ? statements[0] : b.block(statements));
}
}
Domain
Subdomains
Functions
Dependencies
Source
Frequently Asked Questions
What does RenderTag.js do?
RenderTag.js is a source file in the svelte codebase, written in javascript. It belongs to the Compiler domain, Transformer subdomain.
What functions are defined in RenderTag.js?
RenderTag.js defines 1 function(s): RenderTag.
What does RenderTag.js depend on?
RenderTag.js imports 7 module(s): Memoizer, add_svelte_meta, ast.js, build_expression, builders, unwrap_optional, utils.js.
What files import RenderTag.js?
RenderTag.js is imported by 1 file(s): transform-client.js.
Where is RenderTag.js in the architecture?
RenderTag.js is located at packages/svelte/src/compiler/phases/3-transform/client/visitors/RenderTag.js (domain: Compiler, subdomain: Transformer, directory: packages/svelte/src/compiler/phases/3-transform/client/visitors).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free