ClassBody.js — svelte Source File
Architecture documentation for ClassBody.js, a javascript file in the svelte codebase. 3 imports, 1 dependents.
Entity Profile
Dependency Diagram
graph LR 81444023_4896_5434_7a65_69f9a6e56d31["ClassBody.js"] bbca3d2a_42c8_b215_d3b5_5077ccaf0797["nodes.js"] 81444023_4896_5434_7a65_69f9a6e56d31 --> bbca3d2a_42c8_b215_d3b5_5077ccaf0797 d69a156c_617a_9397_4c8b_e94508c59e30["get_name"] 81444023_4896_5434_7a65_69f9a6e56d31 --> d69a156c_617a_9397_4c8b_e94508c59e30 95c28355_f14c_c3cd_5a03_d5a53ca255bc["builders"] 81444023_4896_5434_7a65_69f9a6e56d31 --> 95c28355_f14c_c3cd_5a03_d5a53ca255bc 86cf8685_38fa_3a1c_9b81_21c452968289["transform-server.js"] 86cf8685_38fa_3a1c_9b81_21c452968289 --> 81444023_4896_5434_7a65_69f9a6e56d31 style 81444023_4896_5434_7a65_69f9a6e56d31 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
/** @import { CallExpression, ClassBody, MethodDefinition, PropertyDefinition, StaticBlock } from 'estree' */
/** @import { Context } from '../types.js' */
import * as b from '#compiler/builders';
import { get_name } from '../../../nodes.js';
/**
* @param {ClassBody} node
* @param {Context} context
*/
export function ClassBody(node, context) {
const state_fields = context.state.analysis.classes.get(node);
if (!state_fields) {
// in legacy mode, do nothing
context.next();
return;
}
/** @type {Array<MethodDefinition | PropertyDefinition | StaticBlock>} */
const body = [];
const child_state = { ...context.state, state_fields };
for (const [name, field] of state_fields) {
if (name[0] === '#') {
continue;
}
// insert backing fields for stuff declared in the constructor
if (
field &&
field.node.type === 'AssignmentExpression' &&
(field.type === '$derived' || field.type === '$derived.by')
) {
const member = b.member(b.this, field.key);
body.push(
b.prop_def(field.key, null),
b.method('get', b.key(name), [], [b.return(b.call(member))]),
b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))])
);
}
}
// Replace parts of the class body
for (const definition of node.body) {
if (definition.type !== 'PropertyDefinition') {
body.push(
/** @type {MethodDefinition | StaticBlock} */ (context.visit(definition, child_state))
);
continue;
}
const name = get_name(definition.key);
const field = name && state_fields.get(name);
if (!field) {
body.push(/** @type {PropertyDefinition} */ (context.visit(definition, child_state)));
continue;
}
if (name[0] === '#' || field.type === '$state' || field.type === '$state.raw') {
body.push(/** @type {PropertyDefinition} */ (context.visit(definition, child_state)));
} else if (field.node === definition) {
// $derived / $derived.by
const member = b.member(b.this, field.key);
body.push(
b.prop_def(
field.key,
/** @type {CallExpression} */ (context.visit(field.value, child_state))
),
b.method('get', definition.key, [], [b.return(b.call(member))]),
b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))])
);
}
}
return { ...node, body };
}
Domain
Subdomains
Functions
Source
Frequently Asked Questions
What does ClassBody.js do?
ClassBody.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 ClassBody.js?
ClassBody.js defines 1 function(s): ClassBody.
What does ClassBody.js depend on?
ClassBody.js imports 3 module(s): builders, get_name, nodes.js.
What files import ClassBody.js?
ClassBody.js is imported by 1 file(s): transform-server.js.
Where is ClassBody.js in the architecture?
ClassBody.js is located at packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js (domain: Compiler, subdomain: Transformer, directory: packages/svelte/src/compiler/phases/3-transform/server/visitors).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free