import * as fs from "fs" ; import * as walkSync from "walk-sync" ; import { CompletionItemKind } from "vscode-languageserver" ; import { URI } from "vscode-uri" ; import * as path from "path" ; export function safeWalkSync ( filePath , opts ) { if ( ! filePath ) { return [ ] ; } if ( ! fs . existsSync ( filePath ) ) { return [ ] ; } return walkSync ( filePath , opts ) ; } export function normalizeAngleTagName ( name ) { const ALPHA = /[A-Za-z]/ ; return name . replace ( /[A-Z]/g , ( char , index ) => { if ( index === 0 || ! ALPHA . test ( name [ index - 1 ] ) ) { return char . toLowerCase ( ) ; } return `-${ char . toLowerCase ( ) }` ; } ) . replace ( /::/g , '/' ) ; } export const PLACEHOLDER = "ELSCompletionDummy" ; export function mergeResults ( existingResults , newResults ) { let indexes = new Set ( ) ; let existingResultsMap = existingResults . reduce ( ( hash , item ) => { hash [ item . label ] = item ; indexes . add ( item . label ) ; return hash ; } , { } ) ; newResults . forEach ( el => { if ( el . label in existingResultsMap ) { Object . keys ( el ) . forEach ( key => { existingResultsMap [ el . label ] [ key ] = el [ key ] ; } ) ; } else { existingResultsMap [ el . label ] = el ; indexes . add ( el . label ) ; } } ) ; return Array . from ( indexes ) . map ( key => { return existingResultsMap [ key as string ] ; } ) ; } export function itemKind ( tsName ) { const kinds = { method : CompletionItemKind . Method , function : CompletionItemKind . Function , constructor : CompletionItemKind . Constructor , field : CompletionItemKind . Field , variable : CompletionItemKind . Variable , class : CompletionItemKind . Class , struct : CompletionItemKind . Struct , interface : CompletionItemKind . Interface , module : CompletionItemKind . Module , property : CompletionItemKind . Property , event : CompletionItemKind . Event , operator : CompletionItemKind . Operator , unit : CompletionItemKind . Unit , value : CompletionItemKind . Value , constant : CompletionItemKind . Constant , enum : CompletionItemKind . Enum , "enum-member" : CompletionItemKind . EnumMember , keyword : CompletionItemKind . Keyword , snippet : CompletionItemKind . Snippet , text : CompletionItemKind . Text , file : CompletionItemKind . File , reference : CompletionItemKind . Reference , folder : CompletionItemKind . Folder , "type-parameter" : CompletionItemKind . TypeParameter } ; return kinds [ tsName ] || CompletionItemKind . Property ; } export function toFilePath ( uri ) { return path . resolve ( URI . parse ( uri ) . fsPath ) ; } export function isHBS ( file ) { return file . endsWith ( '.hbs' ) ; } export function isJS ( file ) { return file . endsWith ( '.js' ) ; } export function isTS ( file ) { return file . endsWith ( '.ts' ) ; } export function normalizeToAngleBracketName ( name ) { const SIMPLE_DASHERIZE_REGEXP = /[a-z]|\/|-/g ; const ALPHA = /[A-Za-z0-9]/ ; if ( name . includes ( "." ) ) { return name ; } return name . replace ( SIMPLE_DASHERIZE_REGEXP , ( char , index ) => { if ( char === "/" ) { return "" ; } if ( index === 0 || ! ALPHA . test ( name [ index - 1 ] ) ) { return char . toUpperCase ( ) ; } return char === "-" ? "" : char . toLowerCase ( ) ; } ) ; }