alm
Version:
The best IDE for TypeScript
490 lines (431 loc) • 17 kB
text/typescript
import * as sl from "../socketLib/socketLib";
import { QRFunction, QRServerFunction, TypedEvent } from "../socketLib/socketLib";
import * as types from "../common/types";
import { AvailableProjectConfig } from "../common/types";
/**
* Consists of the following contracts
*
* a contract on how the client --calls--> server
* a contract on how the server --calls--> the client that is calling the server
* a contract on how the server --anycasts-> all clients
*/
export var server = {
echo: {} as QRServerFunction<{ text: string, num: number }, { text: string, num: number }, typeof client>,
filePaths: {} as QRFunction<{}, { filePaths: types.FilePath[], rootDir: string, completed: boolean }>,
makeAbsolute: {} as QRFunction<{ relativeFilePath: string }, { filePath: string }>,
/**
* File stuff
*/
openFile: {} as QRFunction<{ filePath: string }, { contents: string, saved: boolean, editorOptions: types.EditorOptions }>,
closeFile: {} as QRFunction<{ filePath: string }, {}>,
editFile: {} as QRFunction<{ filePath: string, edits: CodeEdit[] }, { saved: boolean }>,
saveFile: {} as QRFunction<{ filePath: string }, {}>,
getFileStatus: {} as QRFunction<{ filePath: string }, { saved: boolean }>,
/** File Tree */
addFile: {} as QRFunction<{ filePath: string }, { error?: string }>,
addFolder: {} as QRFunction<{ filePath: string }, { error?: string }>,
deleteFromDisk: {} as QRFunction<{ files: string[], dirs: string[] }, { errors?: { filePath: string, error: string }[] }>,
duplicateFile: {} as QRFunction<{ src: string, dest: string }, { error: string }>,
duplicateDir: {} as QRFunction<{ src: string, dest: string }, { error: string }>,
movePath: {} as QRFunction<{ src: string, dest: string }, { error: string }>, // both files / folders
launchDirectory: {} as QRFunction<{ filePath: string }, { error?: Error }>, // both files / folders
launchTerminal: {} as QRFunction<{ filePath: string }, { error?: Error }>, // both files / folders
/**
* config stuff
*/
availableProjects: {} as QRFunction<{}, AvailableProjectConfig[]>,
getActiveProjectConfigDetails: {} as QRFunction<{}, AvailableProjectConfig>,
setActiveProjectConfigDetails: {} as QRFunction<AvailableProjectConfig, {}>,
isFilePathInActiveProject: {} as QRFunction<{ filePath: string }, { inActiveProject: boolean }>,
setOpenUITabs: {} as QRFunction<{ sessionId: string, tabLayout: types.TabLayout, selectedTabId: string | null }, {}>,
getOpenUITabs: {} as QRFunction<{ sessionId: string }, { tabLayout: types.TabLayout, selectedTabId: string | null }>,
activeProjectFilePaths: {} as QRFunction<{}, { filePaths: string[] }>,
sync: {} as QRFunction<{}, {}>,
setSetting: {} as QRFunction<{ sessionId: string, settingId: string, value: any }, {}>,
getSetting: {} as QRFunction<{ sessionId: string, settingId: string }, any>,
getValidSessionId: {} as QRFunction<{ sessionId: string }, { sessionId: string; }>,
/**
* Error stuff
*/
getErrors: {} as QRFunction<{}, types.ErrorsByFilePath>,
/**
* Tested
*/
getTestResults: {} as QRFunction<{}, types.TestSuitesByFilePath>,
/**
* Project Service
*/
getCompletionsAtPosition: {} as QRFunction<Types.GetCompletionsAtPositionQuery, Types.GetCompletionsAtPositionResponse>,
getCompletionEntryDetails: {} as QRFunction<Types.GetCompletionEntryDetailsQuery, Types.GetCompletionEntryDetailsResponse>,
quickInfo: {} as QRFunction<Types.QuickInfoQuery, Types.QuickInfoResponse>,
getRenameInfo: {} as QRFunction<Types.GetRenameInfoQuery, Types.GetRenameInfoResponse>,
getDefinitionsAtPosition: {} as QRFunction<Types.GetDefinitionsAtPositionQuery, Types.GetDefinitionsAtPositionResponse>,
getReferences: {} as QRFunction<Types.GetReferencesQuery, Types.GetReferencesResponse>,
getDoctorInfo: {} as QRFunction<Types.GetDoctorInfoQuery, Types.GetDoctorInfoResponse>,
formatDocument: {} as QRFunction<Types.FormatDocumentQuery, Types.FormatDocumentResponse>,
formatDocumentRange: {} as QRFunction<Types.FormatDocumentRangeQuery, Types.FormatDocumentRangeResponse>,
getNavigateToItems: {} as QRFunction<{}, types.GetNavigateToItemsResponse>,
getNavigateToItemsForFilePath: {} as QRFunction<{ filePath: string }, types.GetNavigateToItemsResponse>,
getDependencies: {} as QRFunction<{}, Types.GetDependenciesResponse>,
getAST: {} as QRFunction<Types.GetASTQuery, Types.GetASTResponse>,
getQuickFixes: {} as QRFunction<Types.GetQuickFixesQuery, Types.GetQuickFixesResponse>,
applyQuickFix: {} as QRFunction<Types.ApplyQuickFixQuery, Types.ApplyQuickFixResponse>,
getSemanticTree: {} as QRFunction<Types.GetSemanticTreeQuery, Types.GetSemanticTreeReponse>,
getOccurrencesAtPosition: {} as QRFunction<Types.GetOccurancesAtPositionQuery, Types.GetOccurancesAtPositionResponse>,
getFormattingEditsAfterKeystroke: {} as QRFunction<Types.FormattingEditsAfterKeystrokeQuery, Types.FormattingEditsAfterKeystrokeResponse>,
removeUnusedImports: {} as QRFunction<Types.FilePathQuery, types.RefactoringsByFilePath>,
/**
* Documentation Browser
*/
getTopLevelModuleNames: {} as QRFunction<{}, types.GetTopLevelModuleNamesResponse>,
getUpdatedModuleInformation: {} as QRFunction<{ filePath: string }, types.DocumentedType>,
/** UML Diagram */
getUmlDiagramForFile: {} as QRFunction<{ filePath: string }, { classes: types.UMLClass[] }>,
/** tsFlow */
getFlowRoots: {} as QRFunction<types.TsFlowRootQuery, types.TsFlowRootResponse>,
/** live analysis */
getLiveAnalysis: {} as QRFunction<types.LiveAnalysisQuery, types.LiveAnalysisResponse>,
/**
* Output Status
*/
getCompleteOutputStatusCache: {} as QRFunction<{}, types.JSOutputStatusCache>,
getLiveBuildResults: {} as QRFunction<{}, types.LiveBuildResults>,
build: {} as QRFunction<{}, {}>,
getJSOutputStatus: {} as QRFunction<Types.FilePathQuery, types.GetJSOutputStatusResponse>,
/**
* Live demo
*/
enableLiveDemo: {} as QRFunction<{ filePath: string }, {}>,
disableLiveDemo: {} as QRFunction<{}, {}>,
enableLiveDemoReact: {} as QRFunction<{ filePath: string }, {}>,
disableLiveDemoReact: {} as QRFunction<{}, {}>,
/**
* Git service
*/
gitStatus: {} as QRFunction<{}, string>,
gitReset: {} as QRFunction<{ filePath: string }, string>,
gitDiff: {} as QRFunction<{ filePath: string }, types.GitDiff>,
gitAddAllCommitAndPush: {} as QRFunction<types.GitAddAllCommitAndPushQuery, types.GitAddAllCommitAndPushResult>,
gitFetchLatestAndRebase: {} as QRFunction<{}, types.GitAddAllCommitAndPushResult>,
/**
* NPM Service
*/
npmLatest: {} as QRFunction<{ pack: string }, { description?: string, version?: string }>,
/**
* FARM
*/
startFarming: {} as QRFunction<Types.FarmConfig, {}>,
stopFarmingIfRunning: {} as QRFunction<{}, {}>,
farmResults: {} as QRFunction<{}, Types.FarmNotification>,
/**
* Config creator
*/
createEditorconfig: {} as QRFunction<{}, { alreadyPresent: string }>,
/**
* Settings
*/
getSettingsFilePath: {} as QRFunction<{}, { filePath: string }>,
/**
* Server Disk Service
*/
getDirItems: {} as QRFunction<{ dirPath: string }, { dirItems: types.FilePath[] }>,
}
export var client = {
increment: {} as QRFunction<{ num: number }, { num: number }>,
}
export var cast = {
/** for testing */
hello: new TypedEvent<{ text: string }>(),
/** If the file worker notices a change */
filePathsUpdated: new TypedEvent<{ filePaths: types.FilePath[]; rootDir: string; completed: boolean }>(),
/** If an open and already saved file changes on disk */
savedFileChangedOnDisk: new TypedEvent<{ filePath: string; contents: string }>(),
/** If a user does a code edit */
didEdits: new TypedEvent<{ filePath: string, edits: CodeEdit[] }>(),
/** If any of the file status changes */
didStatusChange: new TypedEvent<{ filePath: string, saved: boolean, eol: string }>(),
/** If file editor options change */
editorOptionsChanged: new TypedEvent<{ filePath: string, editorOptions: types.EditorOptions }>(),
/** Errors for a file path */
errorsDelta: new TypedEvent<types.ErrorCacheDelta>(),
/** Tested */
testResultsDelta: new TypedEvent<types.TestResultsDelta>(),
testedWorking: new TypedEvent<types.Working>(),
/** TS analysis taking place */
tsWorking: new TypedEvent<types.Working>(),
/** Available projects updated */
availableProjectsUpdated: new TypedEvent<AvailableProjectConfig[]>(),
/** Active project name updated */
activeProjectConfigDetailsUpdated: new TypedEvent<AvailableProjectConfig>(),
/** Active project files */
activeProjectFilePathsUpdated: new TypedEvent<{ filePaths: string[] }>(),
/** FARM */
farmResultsUpdated: new TypedEvent<Types.FarmNotification>(),
/** JS Ouput status */
fileOutputStatusUpdated: new TypedEvent<types.JSOutputStatus>(),
completeOutputStatusCacheUpdated: new TypedEvent<types.JSOutputStatusCache>(),
liveBuildResults: new TypedEvent<types.LiveBuildResults>(),
/** Live demo */
liveDemoData: new TypedEvent<types.LiveDemoData>(),
liveDemoBuildComplete: new TypedEvent<types.LiveDemoBundleResult>(),
/** Server quit */
serverExiting: new TypedEvent<{}>(),
}
/**
* General utility interfaces
*/
export namespace Types {
/** Used a lot in project service */
export interface FilePathQuery {
filePath: string;
}
/** Used a lot in project service */
export interface FilePathPositionQuery {
filePath: string;
position: number;
}
/** Used a lot in project service */
export interface FilePathEditorPositionQuery {
filePath: string;
editorPosition: EditorPosition;
}
/**
* FARM:
* Find and Replace Multiple
*/
export type FarmResultsByFilePath = { [filePath: string]: FarmResultDetails[] };
export interface FarmResultDetails {
filePath: string;
/** 1 based at the moment ... todo Change it to 0 based */
line: number;
preview: string;
}
export interface FarmConfig {
query: string;
isRegex: boolean;
isFullWord: boolean;
isCaseSensitive: boolean;
globs: string[];
}
export interface FarmNotification {
completed: boolean;
results: Types.FarmResultDetails[];
/** Might be null if no query */
config: Types.FarmConfig | null;
}
/**
* Completions stuff
*/
export interface GetCompletionsAtPositionQuery extends FilePathPositionQuery {
prefix: string;
}
export type Completion = types.Completion;
export interface GetCompletionsAtPositionResponse {
completions: Completion[];
endsInPunctuation: boolean;
}
export interface GetCompletionEntryDetailsQuery {
filePath: string, position: number, label: string
}
export interface GetCompletionEntryDetailsResponse {
display: string, comment: string
}
/**
* Mouse hover
*/
export interface QuickInfoQuery extends FilePathPositionQuery { }
export interface QuickInfoResponse {
valid: boolean; // Do we have a valid response for this query
info?: {
name: string;
comment: string;
range?: {
from: EditorPosition,
to: EditorPosition
}
},
errors?: types.CodeError[]
}
/**
* Rename refactoring
*/
export interface GetRenameInfoQuery extends FilePathPositionQuery { }
export interface GetRenameInfoResponse {
canRename: boolean;
localizedErrorMessage?: string;
displayName?: string;
fullDisplayName?: string; // this includes the namespace name
kind?: string;
kindModifiers?: string;
triggerSpan?: ts.TextSpan;
locations?: {
/** Note that the Text Spans are from bottom of file to top of file */
[filePath: string]: ts.TextSpan[]
};
}
/**
* Goto definition
*/
export interface GetDefinitionsAtPositionQuery extends FilePathPositionQuery { }
export interface GetDefinitionsAtPositionResponse {
projectFileDirectory: string;
definitions: {
filePath: string;
position: EditorPosition;
span: ts.TextSpan;
}[]
}
/**
* Doctor
*/
export interface LangHelp {
displayName: string;
help: string;
}
export interface GetDoctorInfoQuery extends FilePathEditorPositionQuery { }
export interface GetDoctorInfoResponse {
valid: boolean;
definitions: {
filePath: string;
position: EditorPosition;
span: ts.TextSpan;
}[];
quickInfo?: {
name: string;
comment: string;
};
langHelp?: LangHelp;
references: ReferenceDetails[];
}
/**
* References
*/
export interface GetReferencesQuery extends FilePathPositionQuery { }
export interface GetReferencesResponse {
references: ReferenceDetails[];
}
/**
* Formatting
*/
export interface FormatDocumentQuery extends FilePathQuery {
editorOptions: types.EditorOptions;
}
export interface FormatDocumentResponse {
edits: FormattingEdit[];
}
export interface FormatDocumentRangeQuery extends FilePathQuery {
editorOptions: types.EditorOptions;
from: EditorPosition;
to: EditorPosition;
}
export interface FormatDocumentRangeResponse {
edits: FormattingEdit[];
}
export interface FormattingEditsAfterKeystrokeQuery extends FilePathEditorPositionQuery {
key: string
editorOptions: types.EditorOptions;
}
export interface FormattingEdit {
from: EditorPosition,
to: EditorPosition,
newText: string
}
export interface FormattingEditsAfterKeystrokeResponse {
edits: FormattingEdit[]
}
/**
* Dependency View
*/
export interface FileDependency {
sourcePath: string;
targetPath: string;
}
export interface GetDependenciesResponse {
links: FileDependency[]
}
/**
* AST View
*/
export enum ASTMode {
/** ts.forEachChild() */
visitor,
/** node.getChildren() */
children,
}
export interface GetASTQuery extends FilePathQuery {
mode: ASTMode;
}
export interface GetASTResponse {
root?: NodeDisplay
}
export interface NodeDisplay {
kind: string;
children: NodeDisplay[];
pos: number;
end: number;
/** Represents how many parents it has */
depth: number;
/** If we had a flat structure this is where this item would belong */
nodeIndex: number;
/** Key Details I understand */
details?: any;
/**
* Best attempt serialization of original node
* We remove `parent`
*/
rawJson: any;
}
/**
* Quick Fix
*/
/** Query interfaces */
export interface GetQuickFixesQuery extends FilePathPositionQuery {
indentSize: number;
}
export interface QuickFixDisplay {
/** Uniquely identifies which function will be called to carry out the fix */
key: string;
/** What will be displayed in the UI */
display: string;
}
/** Apply interfaces */
export interface GetQuickFixesResponse {
fixes: QuickFixDisplay[];
}
export interface ApplyQuickFixQuery extends Types.GetQuickFixesQuery {
key: string;
// This will need to be special cased
additionalData?: any;
}
export interface ApplyQuickFixResponse {
refactorings: types.RefactoringsByFilePath;
}
/**
* Semantic view
*/
export interface GetSemanticTreeQuery extends FilePathQuery { }
export interface SemanticTreeNode {
text: string;
kind: string;
kindModifiers: string;
start: EditorPosition;
end: EditorPosition;
subNodes: SemanticTreeNode[];
}
export interface GetSemanticTreeReponse {
nodes: SemanticTreeNode[];
}
/**
* Get occurances
*/
export interface GetOccurancesAtPositionQuery extends FilePathEditorPositionQuery { }
export interface GetOccurancesAtPositionResult {
filePath: string;
start: EditorPosition;
end: EditorPosition;
isWriteAccess: boolean;
}
export interface GetOccurancesAtPositionResponse {
results: GetOccurancesAtPositionResult[];
}
}