@lcap/nasl
Version:
NetEase Application Specific Language
432 lines • 17.8 kB
TypeScript
/// <reference types="node" />
import { tsProtocol, NASLObject } from '@lcap/nasl-types';
import type { AxiosInstance } from 'axios';
import Messager from '../common/Messager';
import { Worker } from 'worker_threads';
import { Module, BaseNode, App, Logic, TypeAnnotation, Param, Interface, Argument, ViewElement, BindAttribute, CallInterface, Connector, Connection, SyntaxNode, EventEmitter, AuthLogicForCallInterface } from '../concepts';
import * as utils from '../utils';
import { Embedded, Translator, Logger, NaslServer as ServerInterface } from '@lcap/nasl-types';
import { MinRange } from './translator';
import { DiagnosticRecord, Diagnostic, DiagnosticManager } from '../manager/diagnostic';
type SourceMapItem = Translator.SourceMapItem;
type FileNode = Embedded.FileNode<BaseNode>;
type NaslServerOptions = ServerInterface.Options;
type SharedAppVersion = {
name: string;
provider: string;
version: string;
ideVersion: string;
};
import { SemanticData } from '@lcap/nasl-concepts';
import { ConcreteOQLDiagnostic, SymbolGraph, RefConcept, DefConcept, SemEnv } from '@lcap/nasl-language-server-core';
type IsHaveRefResultType = {
node: SyntaxNode;
fileNode: SyntaxNode;
file: string;
};
interface RenameResult {
node: SyntaxNode;
fileNode: SyntaxNode;
file: string;
newValue?: any;
setTypeMethods?: string;
doNotChange?: boolean;
}
type QuickInfoNode = {
filePath: string;
node: BaseNode;
item: SourceMapItem;
};
type QuickInfoNodes = Array<QuickInfoNode>;
type QuickInfoMap = Map<BaseNode, TypeAnnotation | {
typeAnnotation: TypeAnnotation;
option: any;
}>;
export declare function getDisplayString2Type(displayString: string): string[];
declare class NaslServer {
/** naslStdlib文件缓存 */
naslStdlibFileCacheMap: Map<string, tsProtocol.OpenRequestArgs>;
messager: Messager;
worker: Worker;
promise: Promise<void>;
/**
* 按道理 fileSourceMap: new Map<string, SourceMap>() 比较合理,
* 但是要多维护一层 vertex 增删 -> file 增删的关系问题,
* 先用挂在点上面,简单的方法实现,后期再考虑解耦
*/
file2NodeMap: Map<string, SyntaxNode>;
/** TS 翻译的源码 */
tsFiles: Map<string, string>;
/**
* 调试时是否储存 ts 文件
*/
openDebugEmbedded: boolean;
elementsLogic: {
[elementLogicName: string]: Array<Logic>;
};
diagnosticManager: DiagnosticManager;
embeddedTSEmitter: EventEmitter;
changeStackList: Array<NASLObject.EventPayload>;
typerCheckFiles: Set<SyntaxNode>;
typerRemoveNodes: Set<SyntaxNode>;
typerCreateNodes: Set<SyntaxNode>;
oqlRemoveNodesTsPath: Set<string>;
removedConnectors: Set<Connector>;
originProxyTargetNodes: Set<SyntaxNode>;
createUiTsArg0Copy: any;
createUiTsArg1Copy: any;
typerErrRecords: DiagnosticRecord[];
cachedEventPayloadValues: Array<any>;
currentRenameMode: 'rename-only' | 'update' | null;
oqlDisaster: boolean;
getProxyApp: () => App;
singleFileChangeIng: Boolean;
/**
* @deprecated FIXME wudengke 删除这个属性
*/
performance: boolean;
http: AxiosInstance;
logger: Logger;
useCache: boolean;
isFirstScreen: boolean;
semData: SemanticData;
symbolGraph: SymbolGraph;
semEnv: SemEnv;
private sqlSignatureFiles;
/**
* 语言服务运行完毕
*
* @description 初始化以及每次修改内容时都会重置
*/
lsRunEnd: Promise<void>;
/**
* 语言服务运行完毕标记
*
* @description `lsRunEnd`属性的内部状态
*/
private _lsRunEndSwitch;
/**
* 标注模式
*
* @description generator-fe 镜像中类型标注时使用,此模式下将会禁用所有因节点变化造成的 ts 文件修改
*/
isAnnotationMode: boolean;
readonly flags: {
profileMode: boolean;
};
constructor(opt: NaslServerOptions);
start(): Promise<void>;
terminate(): void;
launch(opt: NaslServerOptions): Promise<void>;
inited: Promise<() => void>;
createUiTs(components: any, options: {
basicUITsCode: string;
withTypeLibraryTsCode: string;
standardUIComponents: Record<string, any>;
}): Promise<void>;
private contentToFile;
_sqlFunctions?: any[];
requestDatabaseConfigs(http: any, app: App): Promise<void>;
requestSqlFunctions(http: any, appName: string): Promise<{
file: string;
fileContent: any;
}[]>;
getSqlFunctions(dbType: string): any;
getSqlFunction(dbType: string, functionName?: string): any;
_latestVersionsOfSharedApp: SharedAppVersion[];
requestLatestVersionsOfSharedApp(app: App): Promise<void>;
getStatusOfSharedApp(sharedApp: Module): "delete" | "update";
sharedAppsUpdated(app: App): boolean;
checkStatusOfSharedApps(app: App): Promise<void>;
getLatestVersionsOfSharedApp(): SharedAppVersion[];
getUpdatedSharedApp(app: App): Module;
fetchDtsFile(url: string): Promise<string>;
private firstScreenEndWork;
openApp(app: App, performance?: boolean, needRegisterCommand?: boolean): Promise<void>;
refreshApp(app: App, performance?: boolean): Promise<void>;
/**
* 初始化之前添加文件
*/
addFile(file: tsProtocol.OpenRequestArgs, { cache }?: {
cache?: boolean;
}): Promise<void>;
cacheFile(options: tsProtocol.OpenRequestArgs): void;
/**
* 只新增文件
* @param {*} files
*/
writeFiles(files: Array<tsProtocol.OpenRequestArgs>): Promise<void>;
/**
* 新增、修改
* 删除文件 文件用修改内容为空模拟,防止报错
* @param {*} args
*/
updateFiles(args: {
outputFiles: Array<tsProtocol.OpenRequestArgs>;
}): Promise<void>;
/**
* 清除一个目录下的所有文件
*/
deleteDirectoryFiles(args: {
directoryName: string;
}): Promise<void>;
_debugPutFilesInAnonymousApp(files: Array<tsProtocol.OpenRequestArgs>): Promise<void>;
_debugPutFilesByAppId(appId: string, openFiles: Array<tsProtocol.OpenRequestArgs>): Promise<void>;
_debugInFileStorage(node: BaseNode, openFiles: Array<tsProtocol.OpenRequestArgs>): Promise<void>;
open(): Promise<void>;
updateOpen(args: tsProtocol.UpdateOpenRequestArgs): Promise<void>;
fileReferences(filePath: string): Promise<void>;
references(args: tsProtocol.FileLocationRequestArgs): Promise<tsProtocol.ReferencesResponseBody>;
getValueSelectCompletion(node: BaseNode, value: string, noFilterList?: Array<string>): Promise<void>;
_getValueSelectCompletion(args: any): Promise<void>;
getDataSchemaStructureOrTypeAnnotation(node: ViewElement): Promise<any>;
/**
* ts的 quickInfo方法,查询指定位置的详情
* @param args 文件信息数组
* @returns 查询到的
*/
_getTypeQuickinfo(args: any): {
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
};
_getQuickInfoFull(args: Array<any>): {
responseRequired: boolean;
response: Array<tsProtocol.QuickInfoResponseBody>;
};
/**
* 获取nasl节点的 指定位置的详情
* 而且可以返回正确类型
* @param args 文件信息数组
* @returns 查询到的
*/
getNaslNodeQuickInfoFull(args: Array<any>): Promise<{
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody[];
}>;
_getTypeFull(args: Array<any>): {
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
};
_getTypeBatch(args: Array<any>): {
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
};
getNaslNodeTypeFull(args: Array<any>): Promise<{
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
}>;
getNaslNodeTypeBatch(args: Array<any>): Promise<{
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
}>;
/**
* 获取已经选中的内容的 下一级的内容
* @param node 已经选中的内容
* @param noFilterList 不过滤的key 的数据
* @returns 可以选择的数据数组
*/
getSelectNextCompletion(node: BaseNode, noFilterList?: Array<string>): Promise<void>;
_getSelectNextCompletion(args: any): Promise<void>;
getDiagnosticRecordsAndPushAllAndWaitPublishDiagnosticsEnd(fileNames?: Array<string>): Promise<ConcreteOQLDiagnostic[]>;
notifyPublishDiagnosticsEnd(tsDiagnostics: ConcreteOQLDiagnostic[]): void;
getDiagnosticRecordsAndPushAll(fileNames?: Array<string>): Promise<void>;
/**
* 将原始诊断信息与NASL节点进行关联并翻译成为中文。注意:只处理 OqlQueryComponent 节点
* @param diagnostic 诊断问题
* @param fileNode 诊断所在的文件节点
* @returns 处理后的诊断信息
*/
private _resolveSingleDiagnostic;
private _resolveDiagnosticRecordsWithGenerator;
/**
* 处理诊断结果,标注到 OQL 节点上
* @param records 结果
* @returns 过滤或者转换后的诊断结果
*/
private _resolveDiagnosticRecords;
/**
* 判断是否是Javalogic
*/
_isJavalogic(node: Logic): boolean;
isEntityUpdate(node: BaseNode): boolean;
timeoutCheck(fileNodeRaw: Connection | Interface, fileNode: SyntaxNode, diagnostics: Diagnostic[]): void;
_treeMetadataType2CoreType(type: TypeAnnotation, app: App): Generator<any, void, any>;
_isDuplicateCoreType(type: TypeAnnotation): Generator<any, boolean, any>;
checkRemoteConfig(node: Connection): boolean;
/**
* 判断当前CallInterface 对应的 Interface 是否含有鉴权方式
*/
hasAuth(node: CallInterface): boolean;
/**
* 查找节点
*
* @description 同步模式
*/
_fastFindMinRange(diagnostic: tsProtocol.Diagnostic, fileNode: FileNode): MinRange | undefined;
_findMinRange(diagnostic: tsProtocol.DiagnosticWithFileName | tsProtocol.ReferencesResponseItem, fileNode: FileNode): MinRange;
/**
* 查看当前节点是不是有引用
* @param node 节点
* @returns 查找到的数组
*
* @description FIXME: 保留旧的逻辑,验证完成之后需要删除
*/
_isHaveRef(__node: SyntaxNode): Promise<IsHaveRefResultType[]>;
/**
* 查找引用,并且做一些 修改前的准备工作,
* 有引用有的话,就返回集合
* @param node 当前重命名的节点
* @param newValue 传递过来的新值,给MemberExpression用的比较特殊
* 而且,这个新值不一定会用到,MemberExpression在批量更新的时候,可以取到新的value, 这里需要位置信息防止 a.a.a.a 中的一个a发生修改
* @returns 找到的引用
*/
_renamePrepare(__nd: BaseNode, refsList: utils.GetPromise<ReturnType<NaslServer['_isHaveRef']>>, newValue: string): RenameResult[];
_addParamsEffect(refsList: utils.GetPromise<ReturnType<NaslServer['_isHaveRef']>>, nd: Param): void;
_addParamsPrepare(nd: BaseNode, refsList: any[], needAdd?: boolean): BaseNode;
nodeFindRefNodes(nd: SyntaxNode): Promise<BaseNode[]>;
findReferenceAndRender: (nd: DefConcept) => Promise<Map<any, any>>;
getFieldKeySelectCompletion(nd: BaseNode, fieldKey?: string): Promise<void>;
getSlotCurrentCompletion(nd: BaseNode): Promise<void>;
_getFieldKeySelectCompletion(args: any): Promise<void>;
/**
* 获取模块下多个CallInterface 被依赖的页面节点
* 查找callInterface 被依赖的页面级别的节点,要让他们重新生成一次代码,因为多个Interface重新导入,需要查找到引用的额内容
* 对应引用地方,需要重新生成,因为是生成方控制是不是必填的,
* @param oldInterfaceModule 发生修改的module,查他下面的Interface被引用的地方
* @returns 查找到的有引用这个内容的页面级别节点
*/
findModulesCallInterfaceFileRef(oldInterfaceModule: Module): Promise<BaseNode[]>;
/**
* 查找calllogic 被依赖的页面级别的节点,要让他们重新生成一次代码,因为logic,参数必填非必填发生修改,
* 对应引用地方,需要重新生成,因为是生成方控制是不是必填的,
* @param logic 发生修改的logic
* @returns 查找到的有引用这个内容的页面级别节点
*/
findCallLogicFileRef(logic: Logic): Promise<BaseNode[]>;
/** 获取当前节点的已知类型
* @param node 当前要获取类型的节点
* @returns 不需要去查就可以返回类型的节点
*/
getCurrentNodeKnownTypeAnnotation(node0: BaseNode): TypeAnnotation;
/**
* 获取传入节点的 TypeAnnotation
*
* @description 生成器模式原型
*/
private _getQuickInfoNodesTypeMapWithGenerator;
private _getQuickInfoBindAttributeTypeWithGenerator;
/**
* 获取传入节点的 TypeAnnotation
*/
getQuickInfoNodesTypeMap(nodes: QuickInfoNodes, flag?: boolean): Promise<QuickInfoMap>;
fastGetNaslAnnotatedJSON(naslNode: App | Logic | AuthLogicForCallInterface): Promise<Partial<BaseNode>>;
/**
* 标注指定文件
*
* @description 会进行 TS 翻译,并且是全量标注
* @param fileNodes 标注的页面节点
*/
annotationFiles(fileNodes: SyntaxNode[]): Promise<QuickInfoMap>;
/**
* 根据变动的文件,找出其中的 OqlQueryComponent 节点,触发getQuickInfoNodesTypeMap,然后将结果标注到节点上
* @param records
*/
private _incrementalAnnotationJSONWithGenerator;
annotationToJson(typesMap: Map<BaseNode, TypeAnnotation | {
typeAnnotation: TypeAnnotation;
option: any;
}>, jsonMap: Map<BaseNode, any>): void;
/**
* 获取getArgument的参数位的类型
* 如果内部表达式的,就用表达式的,如果没有就试试用默认值的
* 获取logic的默认值和原来Arg的类型和默认值对应
*/
getArgumentTypeAnnotationWithGenerator(node: Argument, types: Map<BaseNode, TypeAnnotation>): Generator<void, TypeAnnotation, void>;
getCurrentTypeAnnotation(node: BaseNode): Promise<TypeAnnotation>;
getBindAttributeType(node: BindAttribute): Promise<TypeAnnotation | {
typeAnnotation: TypeAnnotation;
option: any;
}>;
_getTypeStrFull(args: Array<any>): {
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
};
getNaslNodeTypeStrFull(args: Array<any>): Promise<{
responseRequired: boolean;
response: tsProtocol.QuickInfoResponseBody;
}>;
/**
* 满足一些条件,不去查找依赖去check
* @param fileNode 当前删除节点的文件级别节点
* @param targetNode 当前操作的节点
*/
noFileRefCheck(fileNode: BaseNode, targetNode: BaseNode, action: string): boolean;
private processAllEvents;
private processSingleChangeEvent;
private notifyStartWork;
private acquireLock;
private flushChangesForTypeChecking;
/**
* 根据入参准备并往 TS Server 写入需要校验的 ts 文件
* @param chkFiles 需要校验的文件
* @param removedNodes 需要删除的文件
* @param oqlRemoveNodesTsPath 需要删除的文件路径
* @returns 需要校验的文件名
*/
private prepareAndWriteTsFilesToCheck;
getContextVariables(node: SyntaxNode): Promise<import("@lcap/nasl-language-server-core/out/query/context-variable-query").ContextVariableInfo[]>;
/**
* 获取 Connector 对应 Connector 的properties
*/
static getPropertyNames(fileNode: Connection | Connector): string[];
private getNodeCode;
waitOqlQueryComponentChildrenFinish(node: SyntaxNode): Promise<void>;
/** 关闭 metadataTypes 校验 */
disableMetadataTypesCheck(app: App): Promise<void>;
/** 打开 metadataTypes 校验 */
enableMetadataTypesCheck(app: App): Promise<void>;
static toRaw<T>(nd: T): T;
/**
* @deprecated: 不要再用了,请调用新方法 getFileNode
* 从 naslServer.ts 移动过来的
* 获取
* 当前this上下文 的Source 和 父级文件级别的节点
*/
static getCurrentSource(node: BaseNode): {
currentSource: Translator.Range;
fileNode: BaseNode & {
getEmbeddedFilePath(name?: string): string;
toEmbeddedTSFile(): Embedded.TSFileGenerator<BaseNode>;
} & SyntaxNode;
} | {
fileNode: BaseNode & {
getEmbeddedFilePath(name?: string): string;
toEmbeddedTSFile(): Embedded.TSFileGenerator<BaseNode>;
} & SyntaxNode;
currentSource?: undefined;
};
/**
* 获取节点引用
*
* @param {SyntaxNode} node 查询的节点
* @param {SyntaxNode} [fileNode] 节点所属的文件节点,外部输入可以省去计算
*/
getReferences(node: SyntaxNode, fileNode?: SyntaxNode): {
node: RefConcept;
fileNode: SyntaxNode;
}[];
/**
* 获取节点引用,不包括自己
*
* @param {SyntaxNode} node 查询的节点
* @param {SyntaxNode} [fileNode] 节点所属的文件节点,外部输入可以省去计算
*/
getDirectRefFileNodes(node: SyntaxNode): SyntaxNode[];
/** 新语言服务初始化 */
private languageServerInitiate;
getProxyNode: (nd: BaseNode) => SyntaxNode;
private _getAllElementLogicRoots;
private _refreshTreeViews;
}
export { NaslServer };
//# sourceMappingURL=naslServer.d.ts.map