marko
Version:
Optimized runtime for Marko templates.
53 lines (52 loc) • 3.76 kB
TypeScript
import { types as t } from "@marko/compiler";
import { type AccessorPrefix, AccessorProp } from "../../common/types";
import { type Opt } from "./optional";
import { type Binding, type Getter, type ReferencedBindings } from "./references";
import { type Section } from "./sections";
export interface Signal {
identifier: t.Identifier;
referencedBindings: ReferencedBindings;
section: Section;
build: undefined | (() => t.Expression | undefined);
register?: boolean;
values: Array<{
signal: Signal;
value: t.Expression;
}>;
intersection: Opt<Signal>;
render: t.Statement[];
renderReferencedBindings: ReferencedBindings;
effect: t.Statement[];
effectReferencedBindings: ReferencedBindings;
hasDynamicSubscribers: boolean;
hasSideEffect: boolean;
export: boolean;
extraArgs: t.Expression[] | undefined;
prependStatements: t.Statement[] | undefined;
buildAssignment: ((valueSection: Section, value: t.Expression) => t.Expression | undefined) | undefined;
}
type closureSignalBuilder = (closure: Binding, render: t.Expression) => t.Expression;
export declare function setClosureSignalBuilder(tag: t.NodePath<t.MarkoTag>, builder: closureSignalBuilder): void;
export declare const getTryHasPlaceholder: (section: Section) => true | undefined, setTryHasPlaceholder: (section: Section, value: true | undefined) => void;
export declare function setSectionSerializedValue(section: Section, prop: AccessorProp, expression: t.Expression): void;
export declare function setBindingSerializedValue(section: Section, binding: Binding, expression: t.Expression, prefix?: AccessorPrefix): void;
export declare function setSerializedValue(section: Section, key: string, expression: t.Expression): void;
export declare function addWriteScopeBuilder(section: Section, builder: (writeCall: t.Expression) => t.Expression): void;
export declare const getHTMLSectionStatements: (section: Section) => t.Statement[];
export declare function getBindingGetterIdentifier(binding: Binding, getterSection: Getter["hoisted"]): t.Identifier;
export declare function getSignal(section: Section, referencedBindings: ReferencedBindings, name?: string): Signal;
export declare function initValue(binding: Binding, isLet?: boolean): Signal;
export declare function signalHasStatements(signal: Signal): boolean;
export declare function getSignalFn(signal: Signal): t.Expression;
export declare function getSignalValueIdentifier(signal: Signal): t.Identifier;
export declare function replaceNullishAndEmptyFunctionsWith0(args: (t.Expression | undefined | false)[]): t.Expression[];
export declare function addStatement(type: "render" | "effect", targetSection: Section, referencedBindings: ReferencedBindings, statement: t.Statement | t.Statement[], usedReferences?: ReferencedBindings[] | false, isPure?: boolean): void;
export declare function addValue(targetSection: Section, referencedBindings: ReferencedBindings, signal: Signal, value: t.Expression): void;
export declare function getResumeRegisterId(section: Section, referencedBindings: string | ReferencedBindings, type?: string): string;
export declare function writeSignals(section: Section): Set<Signal>;
export declare function writeRegisteredFns(): void;
export declare function addHTMLEffectCall(section: Section, referencedBindings?: ReferencedBindings): void;
export declare function writeHTMLResumeStatements(path: t.NodePath<t.MarkoTagBody | t.Program>): void;
export declare function getSetup(section: Section): Signal | undefined;
export declare function replaceRegisteredFunctionNode(node: t.Node): t.CallExpression | t.ClassPrivateProperty | t.ClassProperty | t.Identifier | t.ObjectProperty | t.VariableDeclaration | undefined;
export {};