• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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