import childProcess = require ( "child_process" ) ; import fs = require ( "fs-extra" ) ; import path = require ( "path" ) ; import glob = require ( "glob" ) ; const root = path . join ( __dirname , ".." ) ; const source = path . join ( root , "built/local" ) ; const dest = path . join ( root , "lib" ) ; const copyright = fs . readFileSync ( path . join ( __dirname , "../CopyrightNotice.txt" ) , "utf-8" ) ; async function produceLKG ( ) { console . log ( `Building LKG from ${ source } to ${ dest }` ) ; await copyLibFiles ( ) ; await copyLocalizedDiagnostics ( ) ; await copyTypesMap ( ) ; await copyScriptOutputs ( ) ; await copyDeclarationOutputs ( ) ; await buildProtocol ( ) ; await writeGitAttributes ( ) ; } async function copyLibFiles ( ) { await copyFilesWithGlob ( "lib?(.*).d.ts" ) ; } async function copyLocalizedDiagnostics ( ) { const dir = await fs . readdir ( source ) ; const ignoredFolders = [ "enu" ] ; for ( const d of dir ) { const fileName = path . join ( source , d ) ; if ( fs . statSync ( fileName ) . isDirectory ( ) && ignoredFolders . indexOf ( d ) < 0 ) { await fs . copy ( fileName , path . join ( dest , d ) ) ; } } } async function copyTypesMap ( ) { await copyFromBuiltLocal ( "typesMap.json" ) ; } async function buildProtocol ( ) { const protocolScript = path . join ( __dirname , "buildProtocol.js" ) ; if ( ! fs . existsSync ( protocolScript ) ) { throw new Error ( `Expected protocol script ${ protocolScript } to exist` ) ; } const protocolInput = path . join ( __dirname , "../src/server/protocol.ts" ) ; const protocolServices = path . join ( source , "typescriptServices.d.ts" ) ; const protocolOutput = path . join ( dest , "protocol.d.ts" ) ; console . log ( `Building ${ protocolOutput }...` ) ; await exec ( protocolScript , [ protocolInput , protocolServices , protocolOutput ] ) ; } async function copyScriptOutputs ( ) { await copyWithCopyright ( "cancellationToken.js" ) ; await copyWithCopyright ( "tsc.release.js" , "tsc.js" ) ; await copyWithCopyright ( "tsserver.js" ) ; await copyFromBuiltLocal ( "tsserverlibrary.js" ) ; await copyFromBuiltLocal ( "typescript.js" ) ; await copyFromBuiltLocal ( "typescriptServices.js" ) ; await copyWithCopyright ( "typingsInstaller.js" ) ; await copyWithCopyright ( "watchGuard.js" ) ; } async function copyDeclarationOutputs ( ) { await copyFromBuiltLocal ( "tsserverlibrary.d.ts" ) ; await copyFromBuiltLocal ( "typescript.d.ts" ) ; await copyFromBuiltLocal ( "typescriptServices.d.ts" ) ; } async function writeGitAttributes ( ) { await fs . writeFile ( path . join ( dest , ".gitattributes" ) , `* text eol=lf` , "utf-8" ) ; } async function copyWithCopyright ( fileName , destName = fileName ) { const content = await fs . readFile ( path . join ( source , fileName ) , "utf-8" ) ; await fs . writeFile ( path . join ( dest , destName ) , copyright + "\n" + content ) ; } async function copyFromBuiltLocal ( fileName ) { await fs . copy ( path . join ( source , fileName ) , path . join ( dest , fileName ) ) ; } async function copyFilesWithGlob ( pattern ) { const files = glob . sync ( path . join ( source , pattern ) ) . map ( f => path . basename ( f ) ) ; for ( const f of files ) { await copyFromBuiltLocal ( f ) ; } console . log ( `Copied ${ files . length } files matching pattern ${ pattern }` ) ; } async function exec ( path , args = [ ] ) { const cmdLine = [ "node" , path , ... args ] . join ( " " ) ; console . log ( cmdLine ) ; childProcess . execSync ( cmdLine ) ; } process . on ( "unhandledRejection" , err => { throw err ; } ) ; produceLKG ( ) . then ( ( ) => console . log ( "Done" ) , err => { throw err ; } ) ;