import Vue, { VNode } from "vue"
|
|
/*
|
* Template compilation options / results
|
*/
|
interface CompilerOptions {
|
modules?: ModuleOptions[];
|
directives?: Record<string, DirectiveFunction>;
|
preserveWhitespace?: boolean;
|
whitespace?: 'preserve' | 'condense';
|
outputSourceRange?: any
|
}
|
|
interface CompilerOptionsWithSourceRange extends CompilerOptions {
|
outputSourceRange: true
|
}
|
|
interface ErrorWithRange {
|
msg: string;
|
start: number;
|
end: number;
|
}
|
|
interface CompiledResult<ErrorType> {
|
ast: ASTElement | undefined;
|
render: string;
|
staticRenderFns: string[];
|
errors: ErrorType[];
|
tips: ErrorType[];
|
}
|
|
interface CompiledResultFunctions {
|
render: () => VNode;
|
staticRenderFns: (() => VNode)[];
|
}
|
|
interface ModuleOptions {
|
preTransformNode: (el: ASTElement) => ASTElement | undefined;
|
transformNode: (el: ASTElement) => ASTElement | undefined;
|
postTransformNode: (el: ASTElement) => void;
|
genData: (el: ASTElement) => string;
|
transformCode?: (el: ASTElement, code: string) => string;
|
staticKeys?: string[];
|
}
|
|
type DirectiveFunction = (node: ASTElement, directiveMeta: ASTDirective) => void;
|
|
/*
|
* AST Types
|
*/
|
|
/**
|
* - 0: FALSE - whole sub tree un-optimizable
|
* - 1: FULL - whole sub tree optimizable
|
* - 2: SELF - self optimizable but has some un-optimizable children
|
* - 3: CHILDREN - self un-optimizable but have fully optimizable children
|
* - 4: PARTIAL - self un-optimizable with some un-optimizable children
|
*/
|
export type SSROptimizability = 0 | 1 | 2 | 3 | 4
|
|
export interface ASTModifiers {
|
[key: string]: boolean;
|
}
|
|
export interface ASTIfCondition {
|
exp: string | undefined;
|
block: ASTElement;
|
}
|
|
export interface ASTElementHandler {
|
value: string;
|
params?: any[];
|
modifiers: ASTModifiers | undefined;
|
}
|
|
export interface ASTElementHandlers {
|
[key: string]: ASTElementHandler | ASTElementHandler[];
|
}
|
|
export interface ASTDirective {
|
name: string;
|
rawName: string;
|
value: string;
|
arg: string | undefined;
|
modifiers: ASTModifiers | undefined;
|
}
|
|
export type ASTNode = ASTElement | ASTText | ASTExpression;
|
|
export interface ASTElement {
|
type: 1;
|
tag: string;
|
attrsList: { name: string; value: any }[];
|
attrsMap: Record<string, any>;
|
parent: ASTElement | undefined;
|
children: ASTNode[];
|
|
processed?: true;
|
|
static?: boolean;
|
staticRoot?: boolean;
|
staticInFor?: boolean;
|
staticProcessed?: boolean;
|
hasBindings?: boolean;
|
|
text?: string;
|
attrs?: { name: string; value: any }[];
|
props?: { name: string; value: string }[];
|
plain?: boolean;
|
pre?: true;
|
ns?: string;
|
|
component?: string;
|
inlineTemplate?: true;
|
transitionMode?: string | null;
|
slotName?: string;
|
slotTarget?: string;
|
slotScope?: string;
|
scopedSlots?: Record<string, ASTElement>;
|
|
ref?: string;
|
refInFor?: boolean;
|
|
if?: string;
|
ifProcessed?: boolean;
|
elseif?: string;
|
else?: true;
|
ifConditions?: ASTIfCondition[];
|
|
for?: string;
|
forProcessed?: boolean;
|
key?: string;
|
alias?: string;
|
iterator1?: string;
|
iterator2?: string;
|
|
staticClass?: string;
|
classBinding?: string;
|
staticStyle?: string;
|
styleBinding?: string;
|
events?: ASTElementHandlers;
|
nativeEvents?: ASTElementHandlers;
|
|
transition?: string | true;
|
transitionOnAppear?: boolean;
|
|
model?: {
|
value: string;
|
callback: string;
|
expression: string;
|
};
|
|
directives?: ASTDirective[];
|
|
forbidden?: true;
|
once?: true;
|
onceProcessed?: boolean;
|
wrapData?: (code: string) => string;
|
wrapListeners?: (code: string) => string;
|
|
// 2.4 ssr optimization
|
ssrOptimizability?: SSROptimizability;
|
|
// weex specific
|
appendAsTree?: boolean;
|
}
|
|
export interface ASTExpression {
|
type: 2;
|
expression: string;
|
text: string;
|
tokens: (string | Record<string, any>)[];
|
static?: boolean;
|
// 2.4 ssr optimization
|
ssrOptimizability?: SSROptimizability;
|
}
|
|
export interface ASTText {
|
type: 3;
|
text: string;
|
static?: boolean;
|
isComment?: boolean;
|
// 2.4 ssr optimization
|
ssrOptimizability?: SSROptimizability;
|
}
|
|
/*
|
* SFC parser related types
|
*/
|
interface SFCParserOptions {
|
pad?: true | 'line' | 'space';
|
deindent?: boolean
|
}
|
|
export interface SFCBlock {
|
type: string;
|
content: string;
|
attrs: Record<string, string>;
|
start?: number;
|
end?: number;
|
lang?: string;
|
src?: string;
|
scoped?: boolean;
|
module?: string | boolean;
|
}
|
|
export interface SFCDescriptor {
|
template: SFCBlock | undefined;
|
script: SFCBlock | undefined;
|
styles: SFCBlock[];
|
customBlocks: SFCBlock[];
|
}
|
|
/*
|
* Exposed functions
|
*/
|
export function compile(
|
template: string,
|
options: CompilerOptionsWithSourceRange
|
): CompiledResult<ErrorWithRange>
|
|
export function compile(
|
template: string,
|
options?: CompilerOptions
|
): CompiledResult<string>;
|
|
export function compileToFunctions(template: string): CompiledResultFunctions;
|
|
export function ssrCompile(
|
template: string,
|
options: CompilerOptionsWithSourceRange
|
): CompiledResult<ErrorWithRange>;
|
|
export function ssrCompile(
|
template: string,
|
options?: CompilerOptions
|
): CompiledResult<string>;
|
|
export function ssrCompileToFunctions(template: string): CompiledResultFunctions;
|
|
export function parseComponent(
|
file: string,
|
options?: SFCParserOptions
|
): SFCDescriptor;
|
|
export function generateCodeFrame(
|
template: string,
|
start: number,
|
end: number
|
): string;
|