Skip to content

Commit 0713e75

Browse files
committed
Build script updates
1 parent 1fc1495 commit 0713e75

21 files changed

+2498
-7304
lines changed

Gulpfile.js

+138-56
Large diffs are not rendered by default.

Jakefile.js

+148-48
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const fold = require("travis-fold");
99
const ts = require("./lib/typescript");
1010
const del = require("del");
1111
const getDirSize = require("./scripts/build/getDirSize");
12+
const { base64VLQFormatEncode } = require("./scripts/build/sourcemaps");
13+
const needsUpdate = require("./scripts/build/needsUpdate");
14+
const { flatten } = require("./scripts/build/project");
1215

1316
// add node_modules to path so we don't need global modules, prefer the modules by adding them first
1417
var nodeModulesPathPrefix = path.resolve("./node_modules/.bin/") + path.delimiter;
@@ -64,9 +67,14 @@ Paths.typesMapOutput = "built/local/typesMap.json";
6467
Paths.typescriptFile = "built/local/typescript.js";
6568
Paths.servicesFile = "built/local/typescriptServices.js";
6669
Paths.servicesDefinitionFile = "built/local/typescriptServices.d.ts";
70+
Paths.servicesOutFile = "built/local/typescriptServices.out.js";
71+
Paths.servicesDefinitionOutFile = "built/local/typescriptServices.out.d.ts";
6772
Paths.typescriptDefinitionFile = "built/local/typescript.d.ts";
6873
Paths.typescriptStandaloneDefinitionFile = "built/local/typescript_standalone.d.ts";
74+
Paths.tsserverLibraryFile = "built/local/tsserverlibrary.js";
6975
Paths.tsserverLibraryDefinitionFile = "built/local/tsserverlibrary.d.ts";
76+
Paths.tsserverLibraryOutFile = "built/local/tsserverlibrary.out.js";
77+
Paths.tsserverLibraryDefinitionOutFile = "built/local/tsserverlibrary.out.d.ts";
7078
Paths.baselines = {};
7179
Paths.baselines.local = "tests/baselines/local";
7280
Paths.baselines.localTest262 = "tests/baselines/test262/local";
@@ -101,7 +109,9 @@ const ConfigFileFor = {
101109
runjs: "src/testRunner",
102110
lint: "scripts/tslint",
103111
scripts: "scripts",
104-
all: "src"
112+
all: "src",
113+
typescriptServices: "built/local/typescriptServices.tsconfig.json",
114+
tsserverLibrary: "built/local/tsserverlibrary.tsconfig.json",
105115
};
106116

107117
const ExpectedLKGFiles = [
@@ -124,13 +134,18 @@ desc("Builds the full compiler and services");
124134
task(TaskNames.local, [
125135
TaskNames.buildFoldStart,
126136
TaskNames.coreBuild,
137+
Paths.servicesDefinitionFile,
138+
Paths.typescriptFile,
139+
Paths.typescriptDefinitionFile,
140+
Paths.typescriptStandaloneDefinitionFile,
141+
Paths.tsserverLibraryDefinitionFile,
127142
TaskNames.localize,
128143
TaskNames.buildFoldEnd
129144
]);
130145

131146
task("default", [TaskNames.local]);
132147

133-
const RunTestsPrereqs = [TaskNames.lib, Paths.servicesDefinitionFile, Paths.tsserverLibraryDefinitionFile];
148+
const RunTestsPrereqs = [TaskNames.lib, Paths.servicesDefinitionFile, Paths.typescriptDefinitionFile, Paths.tsserverLibraryDefinitionFile];
134149
desc("Runs all the tests in parallel using the built run.js file. Optional arguments are: t[ests]=category1|category2|... d[ebug]=true.");
135150
task(TaskNames.runtestsParallel, RunTestsPrereqs, function () {
136151
tsbuild([ConfigFileFor.runjs], true, () => {
@@ -172,6 +187,9 @@ task(TaskNames.lkg, [
172187
TaskNames.release,
173188
TaskNames.local,
174189
Paths.servicesDefinitionFile,
190+
Paths.typescriptFile,
191+
Paths.typescriptDefinitionFile,
192+
Paths.typescriptStandaloneDefinitionFile,
175193
Paths.tsserverLibraryDefinitionFile,
176194
Paths.releaseCompiler,
177195
...libraryTargets
@@ -333,64 +351,146 @@ file(Paths.diagnosticInformationMap, [Paths.diagnosticMessagesJson], function ()
333351
});
334352
}, { async: true });
335353

336-
// tsserverlibrary.d.ts
337-
file(Paths.tsserverLibraryDefinitionFile, [TaskNames.coreBuild], function() {
338-
const sources = ["compiler.d.ts", "jsTyping.d.ts", "services.d.ts", "server.d.ts"].map(f => path.join(Paths.builtLocal, f));
339-
let output = "";
340-
for (const f of sources) {
341-
output = output + "\n" + removeConstModifierFromEnumDeclarations(readFileSync(f));
342-
}
343-
output = output + "\nexport = ts;\nexport as namespace ts;";
344-
fs.writeFileSync(Paths.tsserverLibraryDefinitionFile, output, { encoding: "utf-8" });
354+
file(ConfigFileFor.tsserverLibrary, [], function () {
355+
flatten("src/tsserver/tsconfig.json", ConfigFileFor.tsserverLibrary, {
356+
exclude: ["src/tsserver/server.ts"],
357+
compilerOptions: {
358+
"removeComments": false,
359+
"stripInternal": true,
360+
"declarationMap": false,
361+
"outFile": "tsserverlibrary.out.js"
362+
}
363+
})
345364
});
346365

347-
// typescriptservices.d.ts
348-
file(Paths.servicesDefinitionFile, [TaskNames.coreBuild], function() {
349-
// Generate a config file
350-
const files = [];
351-
recur(`src/services/tsconfig.json`);
366+
// tsserverlibrary.js
367+
// tsserverlibrary.d.ts
368+
file(Paths.tsserverLibraryFile, [TaskNames.coreBuild, ConfigFileFor.tsserverLibrary], function() {
369+
tsbuild(ConfigFileFor.tsserverLibrary, false, () => {
370+
if (needsUpdate([Paths.tsserverLibraryOutFile, Paths.tsserverLibraryDefinitionOutFile], [Paths.tsserverLibraryFile, Paths.tsserverLibraryDefinitionFile])) {
371+
const copyright = readFileSync(Paths.copyright);
372+
373+
let libraryDefinitionContent = readFileSync(Paths.tsserverLibraryDefinitionOutFile);
374+
libraryDefinitionContent = copyright + removeConstModifierFromEnumDeclarations(libraryDefinitionContent);
375+
libraryDefinitionContent += "\nexport = ts;\nexport as namespace ts;";
376+
fs.writeFileSync(Paths.tsserverLibraryDefinitionFile, libraryDefinitionContent, "utf8");
377+
378+
let libraryContent = readFileSync(Paths.tsserverLibraryOutFile);
379+
libraryContent = copyright + libraryContent;
380+
fs.writeFileSync(Paths.tsserverLibraryFile, libraryContent, "utf8");
381+
382+
// adjust source map for tsserverlibrary.js
383+
let libraryMapContent = readFileSync(Paths.tsserverLibraryOutFile + ".map");
384+
const map = JSON.parse(libraryMapContent);
385+
const lineStarts = /**@type {*}*/(ts).computeLineStarts(copyright);
386+
let prependMappings = "";
387+
for (let i = 1; i < lineStarts.length; i++) {
388+
prependMappings += ";";
389+
}
390+
391+
const offset = copyright.length - lineStarts[lineStarts.length - 1];
392+
if (offset > 0) {
393+
prependMappings += base64VLQFormatEncode(offset) + ",";
394+
}
395+
396+
const outputMap = {
397+
version: map.version,
398+
file: map.file,
399+
sources: map.sources,
400+
sourceRoot: map.sourceRoot,
401+
mappings: prependMappings + map.mappings,
402+
names: map.names,
403+
sourcesContent: map.sourcesContent
404+
};
405+
406+
libraryMapContent = JSON.stringify(outputMap);
407+
fs.writeFileSync(Paths.tsserverLibraryFile + ".map", libraryMapContent);
408+
}
409+
complete();
410+
});
411+
}, { async: true });
412+
task(Paths.tsserverLibraryDefinitionFile, [Paths.tsserverLibraryFile]);
352413

353-
const config = {
354-
extends: "../../src/tsconfig-base",
414+
file(ConfigFileFor.typescriptServices, [], function () {
415+
flatten("src/services/tsconfig.json", ConfigFileFor.typescriptServices, {
355416
compilerOptions: {
417+
"removeComments": false,
356418
"stripInternal": true,
357-
"outFile": "typescriptServices.js"
358-
},
359-
files
360-
};
361-
362-
const configFilePath = `built/local/typescriptServices.tsconfig.json`;
363-
fs.writeFileSync(configFilePath, JSON.stringify(config, undefined, 2));
364-
tsbuild(configFilePath, false, () => {
365-
const servicesContent = readFileSync(Paths.servicesDefinitionFile);
366-
const servicesContentWithoutConstEnums = removeConstModifierFromEnumDeclarations(servicesContent);
367-
fs.writeFileSync(Paths.servicesDefinitionFile, servicesContentWithoutConstEnums);
368-
369-
// Also build typescript.js, typescript.js.map, and typescript.d.ts
370-
jake.cpR(Paths.servicesFile, Paths.typescriptFile);
371-
if (fs.existsSync(Paths.servicesFile + ".map")) {
372-
jake.cpR(Paths.servicesFile + ".map", Paths.typescriptFile + ".map");
419+
"declarationMap": false,
420+
"outFile": "typescriptServices.out.js"
373421
}
422+
});
423+
});
424+
425+
// typescriptServices.js
426+
// typescriptServices.d.ts
427+
file(Paths.servicesFile, [TaskNames.coreBuild, ConfigFileFor.typescriptServices], function() {
428+
tsbuild(ConfigFileFor.typescriptServices, false, () => {
429+
if (needsUpdate([Paths.servicesOutFile, Paths.servicesDefinitionOutFile], [Paths.servicesFile, Paths.servicesDefinitionFile])) {
430+
const copyright = readFileSync(Paths.copyright);
431+
432+
let servicesDefinitionContent = readFileSync(Paths.servicesDefinitionOutFile);
433+
servicesDefinitionContent = copyright + removeConstModifierFromEnumDeclarations(servicesDefinitionContent);
434+
fs.writeFileSync(Paths.servicesDefinitionFile, servicesDefinitionContent, "utf8");
435+
436+
let servicesContent = readFileSync(Paths.servicesOutFile);
437+
servicesContent = copyright + servicesContent;
438+
fs.writeFileSync(Paths.servicesFile, servicesContent, "utf8");
439+
440+
// adjust source map for typescriptServices.js
441+
let servicesMapContent = readFileSync(Paths.servicesOutFile + ".map");
442+
const map = JSON.parse(servicesMapContent);
443+
const lineStarts = /**@type {*}*/(ts).computeLineStarts(copyright);
444+
let prependMappings = "";
445+
for (let i = 1; i < lineStarts.length; i++) {
446+
prependMappings += ";";
447+
}
374448

375-
fs.writeFileSync(Paths.typescriptDefinitionFile, servicesContentWithoutConstEnums + "\r\nexport = ts", { encoding: "utf-8" });
376-
// And typescript_standalone.d.ts
377-
fs.writeFileSync(Paths.typescriptStandaloneDefinitionFile, servicesContentWithoutConstEnums.replace(/declare (namespace|module) ts(\..+)? \{/g, 'declare module "typescript" {'), { encoding: "utf-8"});
449+
const offset = copyright.length - lineStarts[lineStarts.length - 1];
450+
if (offset > 0) {
451+
prependMappings += base64VLQFormatEncode(offset) + ",";
452+
}
453+
454+
const outputMap = {
455+
version: map.version,
456+
file: map.file,
457+
sources: map.sources,
458+
sourceRoot: map.sourceRoot,
459+
mappings: prependMappings + map.mappings,
460+
names: map.names,
461+
sourcesContent: map.sourcesContent
462+
};
463+
464+
servicesMapContent = JSON.stringify(outputMap);
465+
fs.writeFileSync(Paths.servicesFile + ".map", servicesMapContent);
466+
}
378467

379468
complete();
380469
});
470+
}, { async: true });
471+
task(Paths.servicesDefinitionFile, [Paths.servicesFile]);
381472

382-
function recur(configPath) {
383-
const cfgFile = readJson(configPath);
384-
if (cfgFile.references) {
385-
for (const ref of cfgFile.references) {
386-
recur(path.join(path.dirname(configPath), ref.path, "tsconfig.json"));
387-
}
388-
}
389-
for (const file of cfgFile.files) {
390-
files.push(path.join(`../../`, path.dirname(configPath), file));
473+
// typescript.js
474+
// typescript.d.ts
475+
file(Paths.typescriptFile, [Paths.servicesFile], function() {
476+
if (needsUpdate([Paths.servicesFile, Paths.servicesDefinitionFile], [Paths.typescriptFile, Paths.typescriptDefinitionFile])) {
477+
jake.cpR(Paths.servicesFile, Paths.typescriptFile);
478+
if (fs.existsSync(Paths.servicesFile + ".map")) {
479+
jake.cpR(Paths.servicesFile + ".map", Paths.typescriptFile + ".map");
391480
}
481+
const content = readFileSync(Paths.servicesDefinitionFile);
482+
fs.writeFileSync(Paths.typescriptDefinitionFile, content + "\r\nexport = ts;", { encoding: "utf-8" });
392483
}
393-
}, { async: true });
484+
});
485+
task(Paths.typescriptDefinitionFile, [Paths.typescriptFile]);
486+
487+
// typescript_standalone.d.ts
488+
file(Paths.typescriptStandaloneDefinitionFile, [Paths.servicesDefinitionFile], function() {
489+
if (needsUpdate(Paths.servicesDefinitionFile, Paths.typescriptStandaloneDefinitionFile)) {
490+
const content = readFileSync(Paths.servicesDefinitionFile);
491+
fs.writeFileSync(Paths.typescriptStandaloneDefinitionFile, content.replace(/declare (namespace|module) ts(\..+)? \{/g, 'declare module "typescript" {'), { encoding: "utf-8"});
492+
}
493+
});
394494

395495
function getLibraryTargets() {
396496
/** @type {{ libs: string[], paths?: Record<string, string>, sources?: Record<string, string[]> }} */
@@ -765,4 +865,4 @@ function getDiffTool() {
765865
*/
766866
function removeConstModifierFromEnumDeclarations(text) {
767867
return text.replace(/^(\s*)(export )?const enum (\S+) {(\s*)$/gm, '$1$2enum $3 {$4');
768-
}
868+
}

0 commit comments

Comments
 (0)