export type $DiffKey < T , U > = T extends U ? never : T ; export type $Diff < T , U > = Pick < T , $DiffKey < keyof T , keyof U > > ; export type $Optional < T > = { [ P in keyof T ] ? : T [ P ] ; } ; export type $PartialOptional < T , U > = $Diff < T , U > & $Optional < U > ; export type FileId = string ; export interface FileRef { readonly id : FileId ; readonly path : string ; } export interface SourceReader { read ( file ) : Promise < string > ; } export interface SourceWriter { write ( file , source ) : Promise < void > ; } export interface SourceRemover { delete ( file ) : Promise < void > ; } export interface DocumentRef { getFile ( ) : FileRef ; getDoc ( ) : DocumentEntity ; detach ( ) : void ; move ( newFile ) : Promise < this > ; commit ( ) : Promise < this > ; } export interface TransformOptions { from : string ; to : string ; } export interface Formatter { format ( filePath , code ) : Promise < string > ; } export interface DocumentEntityCreateOptions { projectRoot : string ; fileRef : FileRef ; fileMappingOptions ? : FileMappingOptions ; formatter ? : Formatter ; } export interface DocumentEntity { readonly fileRef : FileRef ; readonly isDirty : boolean ; reader : SourceReader ; writer : SourceWriter ; parse ( ) : Promise < this > ; transformPreceding ( to ) : this ; transformFollowing ( opt ) : this ; flush ( force ? ) : Promise < this > ; move ( newFile ) : Promise < this > ; } export type RootImportConfig = { rootPathSuffix ? : string ; rootPathPrefix ? : string ; } ; export type FileMappingOptions = { rootImport ? : RootImportConfig [ ] ; normalizeRootImport ? : boolean ; } ; export type FindQuery = { start : string ; } ; export interface Project { getProjectDir ( ) : string ; getFileMappingOptions ( ) : FileMappingOptions ; getDocumentsList ( ) : Promise < DocumentRef [ ] > ; findOne ( fileId ) : Promise < { found : DocumentRef | undefined ; rest : DocumentRef [ ] ; } > ; find ( query ) : Promise < { found : DocumentRef [ ] ; rest : DocumentRef [ ] ; } > ; commit ( ) : Promise < this > ; } export type LogLevel = "verbose" | "info" | "silent" ; export interface Logger { info ( msg ) : this ; warn ( msg ) : this ; error ( msg ) : this ; verbose ( msg , ... objects ) : this ; }