"use strict" ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
exports . createProgram = void 0 ;
const vue = require ( "@vue/language-core" ) ;
const volarTs = require ( "@volar/typescript" ) ;
const shared_1 = require ( "./shared" ) ;
const windowsPathReg = /\\/g ;
function createProgram ( options ) {
if ( ! options . options . noEmit && ! options . options . emitDeclarationOnly )
throw toThrow ( 'js emit is not supported' ) ;
if ( ! options . options . noEmit && options . options . noEmitOnError )
throw toThrow ( 'noEmitOnError is not supported' ) ;
if ( options . options . extendedDiagnostics || options . options . generateTrace )
throw toThrow ( '--extendedDiagnostics / --generateTrace is not supported, please run `Write Virtual Files` in VSCode to write virtual files and use `--extendedDiagnostics` / `--generateTrace` via tsc instead of vue-tsc to debug.' ) ;
if ( ! options . host )
throw toThrow ( '!options.host' ) ;
const ts = require ( 'typescript' ) ;
let program = options . oldProgram ;
if ( shared_1 . state . hook ) {
program = shared_1 . state . hook . program ;
program . __ vue . options = options ;
}
else if ( ! program ) {
const ctx = {
projectVersion : 0 ,
options ,
get languageHost ( ) {
return languageHost ;
} ,
get vueCompilerOptions ( ) {
return vueCompilerOptions ;
} ,
get languageService ( ) {
return vueTsLs ;
} ,
get langaugeContext ( ) {
return languageContext ;
} ,
} ;
const vueCompilerOptions = getVueCompilerOptions ( ) ;
const scripts = new Map ( ) ;
const languageHost = {
workspacePath : ctx . options . host . getCurrentDirectory ( ) . replace ( windowsPathReg , '/' ) ,
rootPath : ctx . options . host . getCurrentDirectory ( ) . replace ( windowsPathReg , '/' ) ,
getCompilationSettings : ( ) => ctx . options . options ,
getScriptFileNames : ( ) => {
return ctx . options . rootNames ;
} ,
getScriptSnapshot ,
getProjectVersion : ( ) => {
return ctx . projectVersion . toString ( ) ;
} ,
getProjectReferences : ( ) => ctx . options . projectReferences ,
getCancellationToken : ctx . options . host . getCancellationToken ? ( ) => ctx . options . host . getCancellationToken ( ) : undefined ,
} ;
const languageContext = vue . createLanguageContext ( languageHost , vue . createLanguages ( languageHost . getCompilationSettings ( ) , vueCompilerOptions , ts ) ) ;
const languageServiceHost = volarTs . createLanguageServiceHost ( languageContext , ts , ts . sys , undefined ) ;
const vueTsLs = ts . createLanguageService ( languageServiceHost , volarTs . getDocumentRegistry ( ts , ts . sys . useCaseSensitiveFileNames , languageHost . workspacePath ) ) ;
volarTs . decorateLanguageService ( languageContext . virtualFiles , vueTsLs , false ) ;
program = volarTs . getProgram ( ts , languageContext , vueTsLs , ts . sys ) ;
program . __ vue = ctx ;
function getVueCompilerOptions ( ) {
const tsConfig = ctx . options . options . configFilePath ;
if ( typeof tsConfig === 'string' ) {
return vue . createParsedCommandLine ( ts , ts . sys , tsConfig ) . vueOptions ;
}
return { } ;
}
function getScriptSnapshot ( fileName ) {
return getScript ( fileName ) ? . scriptSnapshot ;
}
function getScript ( fileName ) {
const script = scripts . get ( fileName ) ;
if ( script ? . projectVersion === ctx . projectVersion ) {
return script ;
}
const modifiedTime = ts . sys . getModifiedTime ? . ( fileName ) ? . valueOf ( ) ? ? 0 ;
if ( script ? . modifiedTime === modifiedTime ) {
return script ;
}
if ( ctx . options . host . fileExists ( fileName ) ) {
const fileContent = ctx . options . host . readFile ( fileName ) ;
if ( fileContent !== undefined ) {
const script = {
projectVersion : ctx . projectVersion ,
modifiedTime ,
scriptSnapshot : ts . ScriptSnapshot . fromString ( fileContent ) ,
version : ctx . options . host . createHash ? . ( fileContent ) ? ? fileContent ,
} ;
scripts . set ( fileName , script ) ;
return script ;
}
}
}
}
else {
const ctx = program . __ vue ;
ctx . options = options ;
ctx . projectVersion ++ ;
}
const vueCompilerOptions = program . __ vue . vueCompilerOptions ;
if ( vueCompilerOptions ? . hooks ) {
const index = ( shared_1 . state . hook ? . index ? ? - 1 ) + 1 ;
if ( index < vueCompilerOptions . hooks . length ) {
const hookPath = vueCompilerOptions . hooks [ index ] ;
const hook = require ( hookPath ) ;
shared_1 . state . hook = {
program ,
index ,
worker : ( async ( ) => await hook ( program ) ) ( ) ,
} ;
throw 'hook' ;
}
}
for ( const rootName of options . rootNames ) {
// register file watchers
options . host . getSourceFile ( rootName , ts . ScriptTarget . ESNext ) ;
}
return program ;
}
exports . createProgram = createProgram ;
function toThrow ( msg ) {
console . error ( msg ) ;
return msg ;
}
//# sourceMappingURL=index.js.map