@vue-jsx-vapor/compiler
Version:
Vue JSX Vapor Compiler
427 lines (426 loc) • 14.7 kB
TypeScript
import { Prettify } from "@vue/shared";
import { BaseCodegenResult, CodegenOptions as CodegenOptions$1, CommentNode, CompilerCompatOptions, CompilerOptions as CompilerOptions$1, CompoundExpressionNode, DirectiveNode, SimpleExpressionNode, TransformOptions as TransformOptions$1 } from "@vue/compiler-dom";
import { JSXAttribute, JSXElement, JSXFragment, Node } from "@babel/types";
//#region src/transform.d.ts
type NodeTransform = (node: BlockIRNode['node'], context: TransformContext<BlockIRNode['node']>) => void | (() => void) | (() => void)[];
type DirectiveTransform = (dir: JSXAttribute, node: JSXElement, context: TransformContext<JSXElement>) => DirectiveTransformResult | void;
interface DirectiveTransformResult {
key: SimpleExpressionNode;
value: SimpleExpressionNode;
modifier?: '.' | '^';
runtimeCamelize?: boolean;
handler?: boolean;
handlerModifiers?: SetEventIRNode['modifiers'];
model?: boolean;
modelModifiers?: string[];
}
type StructuralDirectiveTransform = (node: JSXElement, dir: JSXAttribute, context: TransformContext) => void | (() => void);
type TransformOptions = HackOptions<TransformOptions$1> & {
source?: string;
templates?: string[];
/**
* Compile JSX Component to createComponentWithFallback.
* @default false
*/
withFallback?: boolean;
};
declare class TransformContext<T extends BlockIRNode['node'] = BlockIRNode['node']> {
ir: RootIRNode;
node: T;
parent: TransformContext<RootNode | JSXElement | JSXFragment> | null;
root: TransformContext<RootNode>;
index: number;
block: BlockIRNode;
options: Required<Omit<TransformOptions, 'filename' | 'inline' | 'bindingMetadata' | 'prefixIdentifiers' | keyof CompilerCompatOptions>>;
template: string;
childrenTemplate: (string | null)[];
dynamic: IRDynamicInfo;
inVOnce: boolean;
inVFor: number;
comment: CommentNode[];
component: Set<string>;
directive: Set<string>;
slots: IRSlots[];
private globalId;
constructor(ir: RootIRNode, node: T, options?: TransformOptions);
enterBlock(ir: BlockIRNode, isVFor?: boolean): () => void;
increaseId: () => number;
reference(): number;
pushTemplate(content: string): number;
registerTemplate(): number;
registerEffect(expressions: SimpleExpressionNode[], operation: OperationNode | OperationNode[], getEffectIndex?: () => number, getOperationIndex?: () => number): void;
registerOperation(operation: OperationNode | OperationNode[], getOperationIndex?: () => number): void;
create<E extends T>(node: E, index: number): TransformContext<E>;
}
declare function transform(node: RootNode, options?: TransformOptions): RootIRNode;
declare function transformNode(context: TransformContext<BlockIRNode['node']>): void;
declare function createStructuralDirectiveTransform(name: string | string[], fn: StructuralDirectiveTransform): NodeTransform;
//#endregion
//#region src/ir/component.d.ts
interface IRProp extends Omit<DirectiveTransformResult, 'value'> {
values: SimpleExpressionNode[];
}
declare enum IRDynamicPropsKind {
EXPRESSION = 0,
// v-bind="value"
ATTRIBUTE = 1,
}
type IRPropsStatic = IRProp[];
interface IRPropsDynamicExpression {
kind: IRDynamicPropsKind.EXPRESSION;
value: SimpleExpressionNode;
handler?: boolean;
}
interface IRPropsDynamicAttribute extends IRProp {
kind: IRDynamicPropsKind.ATTRIBUTE;
}
type IRProps = IRPropsStatic | IRPropsDynamicAttribute | IRPropsDynamicExpression;
interface SlotBlockIRNode extends BlockIRNode {
props?: SimpleExpressionNode;
}
declare enum IRSlotType {
STATIC = 0,
DYNAMIC = 1,
LOOP = 2,
CONDITIONAL = 3,
EXPRESSION = 4,
}
interface IRSlotsStatic {
slotType: IRSlotType.STATIC;
slots: Record<string, SlotBlockIRNode>;
}
interface IRSlotDynamicBasic {
slotType: IRSlotType.DYNAMIC;
name: SimpleExpressionNode;
fn: SlotBlockIRNode;
}
interface IRSlotDynamicLoop {
slotType: IRSlotType.LOOP;
name: SimpleExpressionNode;
fn: SlotBlockIRNode;
loop: IRFor;
}
interface IRSlotDynamicConditional {
slotType: IRSlotType.CONDITIONAL;
condition: SimpleExpressionNode;
positive: IRSlotDynamicBasic;
negative?: IRSlotDynamicBasic | IRSlotDynamicConditional;
}
interface IRSlotsExpression {
slotType: IRSlotType.EXPRESSION;
slots: SimpleExpressionNode;
}
type IRSlotDynamic = IRSlotDynamicBasic | IRSlotDynamicLoop | IRSlotDynamicConditional;
type IRSlots = IRSlotsStatic | IRSlotDynamic | IRSlotsExpression;
//#endregion
//#region src/ir/index.d.ts
declare enum IRNodeTypes {
ROOT = 0,
BLOCK = 1,
SET_PROP = 2,
SET_DYNAMIC_PROPS = 3,
SET_TEXT = 4,
SET_EVENT = 5,
SET_DYNAMIC_EVENTS = 6,
SET_HTML = 7,
SET_TEMPLATE_REF = 8,
INSERT_NODE = 9,
PREPEND_NODE = 10,
CREATE_COMPONENT_NODE = 11,
SLOT_OUTLET_NODE = 12,
DIRECTIVE = 13,
DECLARE_OLD_REF = 14,
// consider make it more general
IF = 15,
FOR = 16,
GET_TEXT_CHILD = 17,
CREATE_NODES = 18,
SET_NODES = 19,
}
interface BaseIRNode {
type: IRNodeTypes;
}
interface RootNode {
type: IRNodeTypes.ROOT | JSXFragment['type'];
source: string;
children: JSXFragment['children'];
}
interface BlockIRNode extends BaseIRNode {
type: IRNodeTypes.BLOCK;
node: RootNode | Node;
dynamic: IRDynamicInfo;
tempId: number;
effect: IREffect[];
operation: OperationNode[];
returns: number[];
}
interface RootIRNode {
type: IRNodeTypes.ROOT;
node: RootNode;
source: string;
templates: string[];
rootTemplateIndex?: number;
component: Set<string>;
directive: Set<string>;
block: BlockIRNode;
hasTemplateRef: boolean;
}
interface IfIRNode extends BaseIRNode {
type: IRNodeTypes.IF;
id: number;
condition: SimpleExpressionNode;
positive: BlockIRNode;
negative?: BlockIRNode | IfIRNode;
once?: boolean;
parent?: number;
anchor?: number;
}
interface IRFor {
source: SimpleExpressionNode;
value?: SimpleExpressionNode;
key?: SimpleExpressionNode;
index?: SimpleExpressionNode;
}
interface ForIRNode extends BaseIRNode, IRFor {
type: IRNodeTypes.FOR;
id: number;
keyProp?: SimpleExpressionNode;
render: BlockIRNode;
once: boolean;
component: boolean;
onlyChild: boolean;
parent?: number;
anchor?: number;
}
interface SetPropIRNode extends BaseIRNode {
type: IRNodeTypes.SET_PROP;
element: number;
prop: IRProp;
root: boolean;
tag: string;
}
interface SetDynamicPropsIRNode extends BaseIRNode {
type: IRNodeTypes.SET_DYNAMIC_PROPS;
element: number;
props: IRProps[];
root: boolean;
}
interface SetDynamicEventsIRNode extends BaseIRNode {
type: IRNodeTypes.SET_DYNAMIC_EVENTS;
element: number;
event: SimpleExpressionNode;
}
interface SetTextIRNode extends BaseIRNode {
type: IRNodeTypes.SET_TEXT;
element: number;
values: SimpleExpressionNode[];
generated?: boolean;
}
interface SetNodesIRNode extends BaseIRNode {
type: IRNodeTypes.SET_NODES;
element: number;
values: SimpleExpressionNode[];
generated?: boolean;
}
type KeyOverride = [find: string, replacement: string];
interface SetEventIRNode extends BaseIRNode {
type: IRNodeTypes.SET_EVENT;
element: number;
key: SimpleExpressionNode;
value?: SimpleExpressionNode;
modifiers: {
options: string[];
keys: string[];
nonKeys: string[];
};
keyOverride?: KeyOverride;
delegate: boolean;
/** Whether it's in effect */
effect: boolean;
}
interface SetHtmlIRNode extends BaseIRNode {
type: IRNodeTypes.SET_HTML;
element: number;
value: SimpleExpressionNode;
}
interface SetTemplateRefIRNode extends BaseIRNode {
type: IRNodeTypes.SET_TEMPLATE_REF;
element: number;
value: SimpleExpressionNode;
refFor: boolean;
effect: boolean;
}
interface CreateNodesIRNode extends BaseIRNode {
type: IRNodeTypes.CREATE_NODES;
id: number;
values?: SimpleExpressionNode[];
}
interface InsertNodeIRNode extends BaseIRNode {
type: IRNodeTypes.INSERT_NODE;
elements: number[];
parent: number;
anchor?: number;
}
interface PrependNodeIRNode extends BaseIRNode {
type: IRNodeTypes.PREPEND_NODE;
elements: number[];
parent: number;
}
interface DirectiveIRNode extends BaseIRNode {
type: IRNodeTypes.DIRECTIVE;
element: number;
dir: VaporDirectiveNode;
name: string;
builtin?: boolean;
asset?: boolean;
modelType?: 'text' | 'dynamic' | 'radio' | 'checkbox' | 'select';
}
interface CreateComponentIRNode extends BaseIRNode {
type: IRNodeTypes.CREATE_COMPONENT_NODE;
id: number;
tag: string;
props: IRProps[];
slots: IRSlots[];
asset: boolean;
root: boolean;
once: boolean;
dynamic?: SimpleExpressionNode;
parent?: number;
anchor?: number;
}
interface DeclareOldRefIRNode extends BaseIRNode {
type: IRNodeTypes.DECLARE_OLD_REF;
id: number;
}
interface SlotOutletIRNode extends BaseIRNode {
type: IRNodeTypes.SLOT_OUTLET_NODE;
id: number;
name: SimpleExpressionNode;
props: IRProps[];
fallback?: BlockIRNode;
parent?: number;
anchor?: number;
}
interface GetTextChildIRNode extends BaseIRNode {
type: IRNodeTypes.GET_TEXT_CHILD;
parent: number;
}
type IRNode = OperationNode | RootIRNode;
type OperationNode = SetPropIRNode | SetDynamicPropsIRNode | SetTextIRNode | SetNodesIRNode | SetEventIRNode | SetDynamicEventsIRNode | SetHtmlIRNode | SetTemplateRefIRNode | CreateNodesIRNode | InsertNodeIRNode | PrependNodeIRNode | DirectiveIRNode | IfIRNode | ForIRNode | CreateComponentIRNode | DeclareOldRefIRNode | SlotOutletIRNode | GetTextChildIRNode;
declare enum DynamicFlag {
NONE = 0,
/**
* This node is referenced and needs to be saved as a variable.
*/
REFERENCED = 1,
/**
* This node is not generated from template, but is generated dynamically.
*/
NON_TEMPLATE = 2,
/**
* This node needs to be inserted back into the template.
*/
INSERT = 4,
}
interface IRDynamicInfo {
id?: number;
flags: DynamicFlag;
anchor?: number;
children: IRDynamicInfo[];
template?: number;
hasDynamicChild?: boolean;
operation?: OperationNode;
}
interface IREffect {
expressions: SimpleExpressionNode[];
operations: OperationNode[];
}
type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & Pick<U, Extract<keyof U, keyof T>>;
type HackOptions<T> = Prettify<Overwrite<T, {
nodeTransforms?: NodeTransform[];
directiveTransforms?: Record<string, DirectiveTransform | undefined>;
}>>;
type VaporDirectiveNode = Overwrite<DirectiveNode, {
exp: Exclude<DirectiveNode['exp'], CompoundExpressionNode>;
arg: Exclude<DirectiveNode['arg'], CompoundExpressionNode>;
}>;
type InsertionStateTypes = IfIRNode | ForIRNode | SlotOutletIRNode | CreateComponentIRNode;
declare function isBlockOperation(op: OperationNode): op is InsertionStateTypes;
//#endregion
//#region src/generate.d.ts
type CodegenOptions = Omit<CodegenOptions$1, 'optimizeImports' | 'inline' | 'bindingMetadata' | 'prefixIdentifiers'> & {
templates?: string[];
};
declare class CodegenContext {
ir: RootIRNode;
options: Required<CodegenOptions>;
helpers: Set<string>;
helper: (name: string) => string;
delegates: Set<string>;
identifiers: Record<string, (string | SimpleExpressionNode)[]>;
block: BlockIRNode;
withId<T>(fn: () => T, map: Record<string, string | SimpleExpressionNode | null>): T;
enterBlock(block: BlockIRNode): () => BlockIRNode;
scopeLevel: number;
enterScope(): [level: number, exit: () => number];
constructor(ir: RootIRNode, options: CodegenOptions);
}
interface VaporCodegenResult extends Omit<BaseCodegenResult, 'preamble'> {
ast: RootIRNode;
helpers: Set<string>;
templates: string[];
delegates: Set<string>;
}
declare function generate(ir: RootIRNode, options?: CodegenOptions): VaporCodegenResult;
//#endregion
//#region src/compile.d.ts
declare function compile(source: JSXElement | JSXFragment | string, options?: CompilerOptions): VaporCodegenResult;
type CompilerOptions = HackOptions<CompilerOptions$1> & TransformOptions;
type TransformPreset = [NodeTransform[], Record<string, DirectiveTransform>];
//#endregion
//#region src/transforms/transformText.d.ts
declare const transformText: NodeTransform;
//#endregion
//#region src/transforms/transformElement.d.ts
declare const transformElement: NodeTransform;
//#endregion
//#region src/transforms/transformChildren.d.ts
declare const transformChildren: NodeTransform;
//#endregion
//#region src/transforms/transformTemplateRef.d.ts
declare const transformTemplateRef: NodeTransform;
//#endregion
//#region src/transforms/vBind.d.ts
declare const transformVBind: DirectiveTransform;
//#endregion
//#region src/transforms/vOn.d.ts
declare const transformVOn: DirectiveTransform;
//#endregion
//#region src/transforms/vSlot.d.ts
declare const transformVSlot: NodeTransform;
//#endregion
//#region src/transforms/vSlots.d.ts
declare const transformVSlots: DirectiveTransform;
//#endregion
//#region src/transforms/vModel.d.ts
declare const transformVModel: DirectiveTransform;
//#endregion
//#region src/transforms/vShow.d.ts
declare const transformVShow: DirectiveTransform;
//#endregion
//#region src/transforms/vHtml.d.ts
declare const transformVHtml: DirectiveTransform;
//#endregion
//#region src/transforms/vFor.d.ts
declare const transformVFor: NodeTransform;
//#endregion
//#region src/transforms/vIf.d.ts
declare const transformVIf: NodeTransform;
//#endregion
//#region src/transforms/vOnce.d.ts
declare const transformVOnce: NodeTransform;
//#endregion
//#region src/transforms/vText.d.ts
declare const transformVText: DirectiveTransform;
//#endregion
export { BaseIRNode, BlockIRNode, CodegenContext, CodegenOptions, CompilerOptions, CreateComponentIRNode, CreateNodesIRNode, DeclareOldRefIRNode, DirectiveIRNode, DirectiveTransform, DirectiveTransformResult, DynamicFlag, ForIRNode, GetTextChildIRNode, HackOptions, IRDynamicInfo, IRDynamicPropsKind, IREffect, IRFor, IRNode, IRNodeTypes, IRProp, IRProps, IRPropsDynamicAttribute, IRPropsDynamicExpression, IRPropsStatic, IRSlotDynamic, IRSlotDynamicBasic, IRSlotDynamicConditional, IRSlotDynamicLoop, IRSlotType, IRSlots, IRSlotsExpression, IRSlotsStatic, IfIRNode, InsertNodeIRNode, InsertionStateTypes, KeyOverride, NodeTransform, OperationNode, PrependNodeIRNode, RootIRNode, RootNode, SetDynamicEventsIRNode, SetDynamicPropsIRNode, SetEventIRNode, SetHtmlIRNode, SetNodesIRNode, SetPropIRNode, SetTemplateRefIRNode, SetTextIRNode, SlotBlockIRNode, SlotOutletIRNode, StructuralDirectiveTransform, TransformContext, TransformOptions, TransformPreset, VaporCodegenResult, VaporDirectiveNode, compile, createStructuralDirectiveTransform, generate, isBlockOperation, transform, transformChildren, transformElement, transformNode, transformTemplateRef, transformText, transformVBind, transformVFor, transformVHtml, transformVIf, transformVModel, transformVOn, transformVOnce, transformVShow, transformVSlot, transformVSlots, transformVText };