import { Translator, Embedded } from '@lcap/nasl-types'; import { EventEmitter } from './EventEmitter'; import { Diagnostic } from '@lcap/nasl-types'; import type { EventPayload, Params, NodePathOption } from './types'; import { type SyntaxNode, type App, type TypeAnnotation, type SyntaxNodeConcept, type ConceptClassMap, Directory, type Logic, type Structure, type Enum } from '../concepts'; type SourceMap = Translator.SourceMap; interface TreeResult { directories: Directory[]; items: T[]; javaLogics?: Logic[]; } /** * 顶点类 * 属性均为只读,仅在初始化和 load 的情况下可以修改 */ export declare class BaseNode extends EventEmitter { static readonly ConceptName: string; static readonly inheritanceChain: string[]; /** * 可修改标志,内部属性 * 标记在构造函数结束后是否可修改 */ _mutable: boolean; /** 节点类别缓存 */ private _concept; /** * 概念 */ get concept(): string; /** * BaseNode 基础排除键(所有节点类型共享) */ static readonly BASE_JSON_EXCLUDED_KEYS: Set; /** * 按类缓存的 JSON_EXCLUDED_KEYS * 每个节点类型都有自己的 Set,但延迟初始化以节省内存 */ private static _classExcludedKeysCache; /** * 获取 JSON_EXCLUDED_KEYS * * 优化策略: * 1. 每个节点类型(类)维护自己的 JSON_EXCLUDED_KEYS Set * 2. 使用 WeakMap 缓存,避免重复创建 * 3. 合并 BaseNode 基础键和类特定的键 * * 注意:excludedInJSON 装饰器会在类原型上设置 JSON_EXCLUDED_KEYS, * 我们需要合并这些键和基础键。 */ get JSON_EXCLUDED_KEYS(): Set; /** * 唯一 Id * 延迟生成:只有访问时才创建,节省内存 */ private _id?; get id(): string; set id(value: string); /** * 用于AI指标的uuid */ _aiUID: undefined | string; /** * 变动时间 */ changedTime: number; /** * 服务端记录的变动时间 */ _changedTime: number; /** * 分支名称 */ branchName: string; /** * 合并代码相关 */ workingCopy: object; branch: object; /** * 父节点 */ parentNode: SyntaxNode; parentKey: string; /** * UI 状态位标志 * 使用一个 number(4 bytes)存储所有 UI 状态布尔值,节省内存 * 默认带上 EDITABLE,表示节点默认可编辑 */ private _uiFlags; /** * 是否可编辑 * 前端 UI 状态 */ get editable(): boolean; set editable(value: boolean); /** * 是否可以删除 * 前端 UI 状态 */ get removable(): boolean; set removable(value: boolean); /** * 是否正在请求 * 前端 UI 状态 */ get loading(): boolean; set loading(value: boolean); /** * 节点是否为展开状态 * 前端 UI 状态 */ get expanded(): boolean; set expanded(value: boolean); /** * 节点是否显示 * 前端 UI 状态 */ get hidden(): boolean; set hidden(value: boolean); /** * 页面树节点是否显示 * 前端 UI 状态 */ get pageTreeNodeHidden(): boolean; set pageTreeNodeHidden(value: boolean); /** * 逻辑树节点是否显示 * 前端 UI 状态 */ get logicTreeNodeHidden(): boolean; set logicTreeNodeHidden(value: boolean); /** * 数据树节点是否显示 * 前端 UI 状态 */ get dataTreeNodeHidden(): boolean; set dataTreeNodeHidden(value: boolean); /** * 流程树节点是否显示 * 前端 UI 状态 */ get processTreeNodeHidden(): boolean; set processTreeNodeHidden(value: boolean); /** * 逻辑树节点是否展开 * 前端 UI 状态 */ get logicTreeNodeExpanded(): boolean; set logicTreeNodeExpanded(value: boolean); /** * 用于挂 embeddedTS 的 sourceMap */ sourceMap: SourceMap; /** * 是否为叶子节点 * 前端 UI 状态 */ get isLeaf(): boolean; set isLeaf(value: boolean); storageJSON: any; /** * 当前节点上报错详细信息 */ tsErrorDetail: Diagnostic.Diagnostic | undefined; /** * 应用内节点的分组管理机制 * 暂无明确的名称定义要求,只要求唯一即可,建议使用时第一个分组给一个root分组 */ composedBy?: Array; /** * 当前节点的类型标注 */ __TypeAnnotation: TypeAnnotation; /** * 静默模式 * * @description 静默模式下,会屏蔽掉所有节点事件 * @description 该属性具有传染性,在实例化时,子树根节点是只读,那么其所有子节点都是静默的 * @description 创建静默实例,可以使用`App.createSilenceApp(data)` * @description 现在只会在发布模式下启用 */ silence: boolean; /** * 当前节点的类型标注是不是正确的 */ __isCorrectTypeAnnotation: boolean; /** * 断点状态 * undefined ==> 未设置 * null ==> 已删除 * 'ENABLED' ==> 启用断点 * 'DISABLED' ==> 禁用断点 */ breakpoint?: 'ENABLED' | 'DISABLED' | null | undefined; /** * @param source 需要合并的部分参数 */ constructor(source?: Partial); subConstructor(source?: Partial): void; fixInstantiate(): void; getIndexOfParent(): number; /** * 为存储点生成行为监听器 * @param action * @returns */ genActionListener($event: EventPayload): void; nodeEditing($event: EventPayload): void; createNode({ parentNode, parentKey, index }: { parentNode: SyntaxNode; parentKey: string; index: number; }): void; toTemplateJSON(): any; /** * 创建节点 */ create(parentParams: Params): void; /** * 如果有父节点,则删除节点,在添加时调用 */ ensureDelete(): void; /** * 删除节点 */ delete(): void; /** * 更新节点 */ update({ field, ...object }: any): void; collectOldObject(params: any): Array; collectNewObject(params: any): void; ensureDefined(params: any): any; updateInstance(object: any): Array; _delete(): Params; static from(source: any, parentNode?: BaseNode, parentKey?: string): BaseNode; get nodePath(): string; /** * 生成完整调用令牌 * * @description 语义检查时使用 */ getTokenKeyWithNamespace(): string; getNodePath(useIndex: boolean): string; getNodePath(useIndexKeys: string[]): string; getNodePath(option: NodePathOption): string; /** * 上层节点 */ get upperNode(): SyntaxNode; /** * 根节点 */ get rootNode(): App; /** * 获取祖先节点 */ getAncestor(concept: Concept): ConceptClassMap[Concept]; getAncestorRaw(concept: Concept): ConceptClassMap[Concept] | undefined; get app(): App; /** * * @param source * @param Ctor * @param completeList * @param idsList */ handleSource(source: any, completeList: any[]): void; /** * 获取当前的TsName */ get tsName(): any; __editing: boolean; get editing(): boolean; set editing(value: boolean); /** * 实例化一个 JSON * 由于有 from,只能先实例化父级,再实例化子级 * @param obj * @param parentNode * @returns */ instantiate(source: any, parentNode: BaseNode, parentKey: string): any; /** * 激活 JSON 内部实例 * @param source */ instantiateSub(source: any, parentKey: string): any; plainAssign(source: any): void; pick(source: any, keys?: Array): void; /** * 从对象中深度获取 * @param source * @param keys * @example 比如一般后端返回只是添加了个 id * ```ts * this.deepPick(result, ['id']) * ``` */ deepPick(source: any, keys?: Array): void; /** * 去除循环依赖,转为纯 JSON * @param parentKey 外面的 key,提供给 JSON.stringify 使用 * @param excludedKeys 需要额外排除的 keys */ toJSON(): any; /** * 允许在迭代中使用回调来实时操作原始实例和生成的对象 */ _toJSON(cb?: (source: Partial, instance?: BaseNode) => {}, pre?: (oldNd?: BaseNode) => void, post?: (oldNd?: BaseNode) => void): any; /** * 允许在迭代中使用回调来实时操作原始实例和生成的对象 */ _toFileJSON(check?: (Nd?: BaseNode) => boolean): any; /** * 转为单层的 JSON * @param parentKey 外面的 key,提供给 JSON.stringify 使用 * @param excludedKeys 需要额外排除的 keys */ toPlainJSON(parentKey?: string, excludedKeys?: Array): any; getNodeChinesePath(useIndex: boolean | string[] | NodePathOption): string; _tsErrorRefreshID: any; _typeRefreshID: any; ensureRef(): void; ensureTypeRef(): void; /** * 查找引用 */ findUsage(): Promise; /** * 通过当前节点,查找被引用的节点 */ nodeFindRefNodes(): Promise; findReadOnlyLogicUsage(): Promise; /** * 重命名 */ changeName(newValue: string, updateAll?: boolean): Promise; /** * 移除绑定实体元素的页面元素 */ removeBindEntityPropertyViewEelment(): Promise; /** * 删除流程节点绑定的页面的跳转 */ delProcessViewDestination(): Promise; /** * 准备删除 */ prepareDelete(cb?: Function): Promise; /** * 添加参数准备 */ addParamsPrepare(): Promise; /** * 获取当前节点类型 */ getCurrentTypeAnnotation(outTime?: number): Promise; /** * 获取当前节点的下一级内容 */ getSelectRef(newTypeAnnotation: TypeAnnotation, needNewStructure?: boolean): any; /** * 销毁 * 从 Map 中删除点和子节点 */ destroy(): void; onChange($event?: EventPayload): void; onCreate($event?: any): void; onDelete($event?: any): void; /** * 移动节点 * @param sourceNode * @param position */ moveNode(options: { sourceNode: BaseNode; position: 'append' | 'insertBefore' | 'insertAfter'; action?: string; }): void; replaceNode(newNode: any): void; updateRelyFileNode(app: any): Promise; /** * 获取添加时的默认选项 * @returns */ static getDefaultOptions(): any; /** * 迭代所有属性 * * @description 是所有属性!!不是所有子节点!! * @deprecated 请使用`traverseStrictChildren`方法 */ traverseChildren(cb: (el: any) => void, whitelist?: string[]): void; /** * 生成器中序遍历节点 * * @description 与`traverseChildren`不同,此方法会过滤掉非节点值 */ traverseChildrenGenerator(cb: (node: SyntaxNode) => (void | Generator)): Generator; /** * 迭代所有子节点 * * @description 严格迭代所有子节点!排除属性! */ traverseStrictChildren(cb: (el: SyntaxNode) => void, whitelist?: string[]): void; /** * 迭代所有子节点 * * @description 严格迭代所有子节点!排除属性!条件满足时整个遍历全部终止! * * 警告:获取到的不仅仅是语法节点还可能是数字。例如AssignmentLine的leftIndex也会被遍历到 */ traverseStrictChildrenStopWhen(cb: (el: unknown) => void, setStopFlag: (el: unknown) => boolean, whitelist?: string[]): void; /** * @description 并非迭代所有子节点,只迭代 NASL 节点的子节点。排除属性;多函数特化版本,不做额外检查。 */ traverseStrictChildrenDoMultiTasks(tasks: Array<(_: SyntaxNode) => Generator>, cleanups: Array<(_: SyntaxNode) => Generator>): Generator; /** * 带剪枝的先序遍历 * * @description 严格迭代所有子节点!排除属性! * @description 回调返回`true`时将不会继续迭代子树 * @description 注意:这里只是不会继续递归子树,而不是终止整个迭代流程 */ traverseStrictChildrenWithPruning(cb: (el: SyntaxNode) => boolean | void): void; /** * 获取当前节点在nasl标注节点上的节点 */ getCurrentAnnotatedJSON(): TypeAnnotation; /** * 获取 * 当前this上下文 的Source 和 父级文件级别的节点 */ getCurrentSource(): { currentSource: Translator.Range; fileNode: SyntaxNode; } | { fileNode: SyntaxNode; currentSource?: undefined; }; /** * 获取 * 当前this上下文 的Source 和 父级文件级别的节点 */ getFileConceptNode(concept: string): any; get isTreeLeaf(): boolean; get hasChildren(): {}[]; /** 收集所有节点 */ collectNodes(): SyntaxNode[]; /** 收集特定类型的子节点 */ collectNodes(concept: T): ConceptClassMap[T][]; /** 收集断言返回`true`的子节点 */ collectNodes(pre: (node?: SyntaxNode) => boolean): SyntaxNode[]; /** * 搜索节点 * * @description 搜索到首个节点就停止 */ findNode(concept: T): ConceptClassMap[T] | undefined; /** * 收集断言返回`true`的节点 * * @description 搜索到首个节点就停止 */ findNode(pre: (node: SyntaxNode) => boolean): SyntaxNode | undefined; /** * 广度遍历子节点,如果当前节点满足pre 函数,将不会再向下遍历 * @param input 搜索条件 * @param containsSelf: 是否包含自身 * @returns 搜索到的节点 */ findNaslNodeByBFS(input?: SyntaxNodeConcept | ((node: SyntaxNode) => boolean), containsSelf?: boolean): SyntaxNode[]; getEmbeddedFilePath(): string; toEmbeddedTS(): Generator; toEmbeddedTSFile(): Embedded.TSFileGenerator; toEmbeddedDeclarationTSFile(): Embedded.DeclarationTSFileResult; /** * 生成自然语言 TS * @param state 编译状态 * @returns 生成的代码 */ toNaturalTS(state?: Translator.TranslatorState): string; /** * 生成文本化代码 * @param state 编译状态 * @returns 生成的代码 */ toTextualNASL(state?: Translator.TranslatorState): string; /** * 调试用的 ToTS 接口 */ toDebugTs(): void; /** * 判断目标节点是否为当前节点的祖先节点 */ isAncestor(node: BaseNode): boolean; private getDirectory; private getTree; getLogicDirectory(): Directory; getStructureDirectory(): Directory; getEnumDirectory(): Directory; getLogicTree(): TreeResult; getStructureTree(): TreeResult; getEnumTree(): TreeResult; _refCount?: number; updateRefCount(): void; } export default BaseNode; //# sourceMappingURL=BaseNode.d.ts.map