1/// <reference types="node" /> 2 3import childProcess = require("child_process"); 4import fs = require("fs-extra"); 5import path = require("path"); 6import glob = require("glob"); 7 8const root = path.join(__dirname, ".."); 9const source = path.join(root, "built/local"); 10const dest = path.join(root, "lib"); 11const copyright = fs.readFileSync(path.join(__dirname, "../CopyrightNotice.txt"), "utf-8"); 12 13async function produceLKG() { 14 console.log(`Building LKG from ${source} to ${dest}`); 15 await copyLibFiles(); 16 await copyLocalizedDiagnostics(); 17 await copyTypesMap(); 18 await copyScriptOutputs(); 19 await copyDeclarationOutputs(); 20 await buildProtocol(); 21 await writeGitAttributes(); 22} 23 24async function copyLibFiles() { 25 await copyFilesWithGlob("lib?(.*).d.ts"); 26} 27 28async function copyLocalizedDiagnostics() { 29 const dir = await fs.readdir(source); 30 const ignoredFolders = ["enu"]; 31 32 for (const d of dir) { 33 const fileName = path.join(source, d); 34 if ( 35 fs.statSync(fileName).isDirectory() && 36 ignoredFolders.indexOf(d) < 0 37 ) { 38 await fs.copy(fileName, path.join(dest, d)); 39 } 40 } 41} 42 43async function copyTypesMap() { 44 await copyFromBuiltLocal("typesMap.json"); // Cannot accommodate copyright header 45} 46 47async function buildProtocol() { 48 const protocolScript = path.join(__dirname, "buildProtocol.js"); 49 if (!fs.existsSync(protocolScript)) { 50 throw new Error(`Expected protocol script ${protocolScript} to exist`); 51 } 52 53 const protocolInput = path.join(__dirname, "../src/server/protocol.ts"); 54 const protocolServices = path.join(source, "typescriptServices.d.ts"); 55 const protocolOutput = path.join(dest, "protocol.d.ts"); 56 57 console.log(`Building ${protocolOutput}...`); 58 await exec(protocolScript, [protocolInput, protocolServices, protocolOutput]); 59} 60 61async function copyScriptOutputs() { 62 await copyWithCopyright("cancellationToken.js"); 63 await copyWithCopyright("tsc.release.js", "tsc.js"); 64 await copyWithCopyright("tsserver.js"); 65 await copyFromBuiltLocal("tsserverlibrary.js"); // copyright added by build 66 await copyFromBuiltLocal("typescript.js"); // copyright added by build 67 await copyFromBuiltLocal("typescriptServices.js"); // copyright added by build 68 await copyWithCopyright("typingsInstaller.js"); 69 await copyWithCopyright("watchGuard.js"); 70} 71 72async function copyDeclarationOutputs() { 73 await copyFromBuiltLocal("tsserverlibrary.d.ts"); // copyright added by build 74 await copyFromBuiltLocal("typescript.d.ts"); // copyright added by build 75 await copyFromBuiltLocal("typescriptServices.d.ts"); // copyright added by build 76} 77 78async function writeGitAttributes() { 79 await fs.writeFile(path.join(dest, ".gitattributes"), `* text eol=lf`, "utf-8"); 80} 81 82async function copyWithCopyright(fileName: string, destName = fileName) { 83 const content = await fs.readFile(path.join(source, fileName), "utf-8"); 84 await fs.writeFile(path.join(dest, destName), copyright + "\n" + content); 85} 86 87async function copyFromBuiltLocal(fileName: string) { 88 await fs.copy(path.join(source, fileName), path.join(dest, fileName)); 89} 90 91async function copyFilesWithGlob(pattern: string) { 92 const files = glob.sync(path.join(source, pattern)).map(f => path.basename(f)); 93 for (const f of files) { 94 await copyFromBuiltLocal(f); 95 } 96 console.log(`Copied ${files.length} files matching pattern ${pattern}`); 97} 98 99async function exec(path: string, args: string[] = []) { 100 const cmdLine = ["node", path, ...args].join(" "); 101 console.log(cmdLine); 102 childProcess.execSync(cmdLine); 103} 104 105process.on("unhandledRejection", err => { throw err; }); 106produceLKG().then(() => console.log("Done"), err => { throw err; }); 107