Home / File/ RenderTag.js — svelte Source File

RenderTag.js — svelte Source File

Architecture documentation for RenderTag.js, a javascript file in the svelte codebase. 7 imports, 1 dependents.

File javascript Compiler Transformer 7 imports 1 dependents 1 functions

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

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