Skip to content

Commit baf8b88

Browse files
committed
Add versioning to monaco.d.ts generation
1 parent 27f64e3 commit baf8b88

6 files changed

Lines changed: 124 additions & 21 deletions

File tree

build/lib/compilation.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,12 @@ class MonacoGenerator {
189189
// Nothing changed
190190
return null;
191191
}
192-
return monacodts.run2('src', this._dtsFilesContents2);
192+
let r = monacodts.run2('src', this._dtsFilesContents2);
193+
if (!r && !this._isWatch) {
194+
// The build must always be able to generate the monaco.d.ts
195+
throw new Error(`monaco.d.ts genration error - Cannot continue`);
196+
}
197+
return r;
193198
}
194199
_log(message, ...rest) {
195200
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);

build/lib/compilation.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,12 @@ class MonacoGenerator {
242242
return null;
243243
}
244244

245-
return monacodts.run2('src', this._dtsFilesContents2);
245+
let r = monacodts.run2('src', this._dtsFilesContents2);
246+
if (!r && !this._isWatch) {
247+
// The build must always be able to generate the monaco.d.ts
248+
throw new Error(`monaco.d.ts genration error - Cannot continue`);
249+
}
250+
return r;
246251
}
247252

248253
private _log(message: any, ...rest: any[]): void {

build/monaco/api.js

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const fs = require("fs");
88
const ts = require("typescript");
99
const path = require("path");
1010
const util = require("gulp-util");
11+
const dtsv = '1';
1112
const tsfmt = require('../../tsfmt.json');
1213
function log(message, ...rest) {
1314
util.log(util.colors.cyan('[monaco.d.ts]'), message, ...rest);
@@ -21,6 +22,9 @@ function logErr(message, ...rest) {
2122
util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE);
2223
util.log(util.colors.red('[monaco.d.ts]'), message, ...rest);
2324
}
25+
function _logErr(message, ...rest) {
26+
util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest);
27+
}
2428
function moduleIdToPath(out, moduleId) {
2529
if (/\.d\.ts/.test(moduleId)) {
2630
return path.join(SRC, moduleId);
@@ -315,6 +319,7 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
315319
let usageCounter = 0;
316320
let usageImports = [];
317321
let usage = [];
322+
let failed = false;
318323
usage.push(`var a;`);
319324
usage.push(`var b;`);
320325
const generateUsageImport = (moduleId) => {
@@ -323,13 +328,23 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
323328
return importName;
324329
};
325330
let enums = [];
331+
let version = null;
326332
lines.forEach(line => {
333+
if (failed) {
334+
return;
335+
}
336+
let m0 = line.match(/^\/\/dtsv=(\d+)$/);
337+
if (m0) {
338+
version = m0[1];
339+
}
327340
let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
328341
if (m1) {
329342
CURRENT_PROCESSING_RULE = line;
330343
let moduleId = m1[1];
331344
const sourceFile = sourceFileGetter(moduleId);
332345
if (!sourceFile) {
346+
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
347+
failed = true;
333348
return;
334349
}
335350
const importName = generateUsageImport(moduleId);
@@ -355,6 +370,8 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
355370
let moduleId = m2[1];
356371
const sourceFile = sourceFileGetter(moduleId);
357372
if (!sourceFile) {
373+
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
374+
failed = true;
358375
return;
359376
}
360377
const importName = generateUsageImport(moduleId);
@@ -391,6 +408,18 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
391408
}
392409
result.push(line);
393410
});
411+
if (failed) {
412+
return null;
413+
}
414+
if (version !== dtsv) {
415+
if (!version) {
416+
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`);
417+
}
418+
else {
419+
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`);
420+
}
421+
return null;
422+
}
394423
let resultTxt = result.join(endl);
395424
resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri');
396425
resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<');
@@ -405,11 +434,11 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
405434
''
406435
].concat(enums).join(endl);
407436
resultEnums = format(resultEnums, endl);
408-
return [
409-
resultTxt,
410-
`${usageImports.join('\n')}\n\n${usage.join('\n')}`,
411-
resultEnums
412-
];
437+
return {
438+
result: resultTxt,
439+
usageContent: `${usageImports.join('\n')}\n\n${usage.join('\n')}`,
440+
enums: resultEnums
441+
};
413442
}
414443
function getIncludesInRecipe() {
415444
let recipe = fs.readFileSync(exports.RECIPE_PATH).toString();
@@ -439,7 +468,13 @@ exports.getFilesToWatch = getFilesToWatch;
439468
function _run(sourceFileGetter) {
440469
log('Starting monaco.d.ts generation');
441470
const recipe = fs.readFileSync(exports.RECIPE_PATH).toString();
442-
const [result, usageContent, enums] = generateDeclarationFile(recipe, sourceFileGetter);
471+
const t = generateDeclarationFile(recipe, sourceFileGetter);
472+
if (!t) {
473+
return null;
474+
}
475+
const result = t.result;
476+
const usageContent = t.usageContent;
477+
const enums = t.enums;
443478
const currentContent = fs.readFileSync(DECLARATION_PATH).toString();
444479
const one = currentContent.replace(/\r\n/gm, '\n');
445480
const other = result.replace(/\r\n/gm, '\n');
@@ -470,7 +505,6 @@ function run(out, inputFiles) {
470505
};
471506
return _run(sourceFileGetter);
472507
}
473-
exports.run = run;
474508
function run2(out, sourceFileMap) {
475509
const sourceFileGetter = (moduleId) => {
476510
let filePath = path.normalize(moduleIdToPath(out, moduleId));
@@ -550,6 +584,10 @@ function execute() {
550584
OUTPUT_FILES[SRC_FILE_TO_EXPECTED_NAME[fileName]] = emitOutput.outputFiles[0].text;
551585
});
552586
console.log(`Generating .d.ts took ${Date.now() - t1} ms`);
553-
return run('src', OUTPUT_FILES);
587+
let r = run('src', OUTPUT_FILES);
588+
if (!r) {
589+
throw new Error(`monaco.d.ts genration error - Cannot continue`);
590+
}
591+
return r;
554592
}
555593
exports.execute = execute;

build/monaco/api.ts

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import * as ts from 'typescript';
88
import * as path from 'path';
99
import * as util from 'gulp-util';
1010

11+
const dtsv = '1';
12+
1113
const tsfmt = require('../../tsfmt.json');
1214

1315
function log(message: any, ...rest: any[]): void {
@@ -24,6 +26,9 @@ function logErr(message: any, ...rest: any[]): void {
2426
util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE);
2527
util.log(util.colors.red('[monaco.d.ts]'), message, ...rest);
2628
}
29+
function _logErr(message: any, ...rest: any[]): void {
30+
util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest);
31+
}
2732

2833
function moduleIdToPath(out: string, moduleId: string): string {
2934
if (/\.d\.ts/.test(moduleId)) {
@@ -362,7 +367,13 @@ function createReplacer(data: string): (str: string) => string {
362367
};
363368
}
364369

365-
function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): [string, string, string] {
370+
interface ITempResult {
371+
result: string;
372+
usageContent: string;
373+
enums: string;
374+
}
375+
376+
function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): ITempResult | null {
366377
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
367378

368379
let lines = recipe.split(endl);
@@ -372,6 +383,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
372383
let usageImports: string[] = [];
373384
let usage: string[] = [];
374385

386+
let failed = false;
387+
375388
usage.push(`var a;`);
376389
usage.push(`var b;`);
377390

@@ -382,15 +395,27 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
382395
};
383396

384397
let enums: string[] = [];
398+
let version: string | null = null;
385399

386400
lines.forEach(line => {
387401

402+
if (failed) {
403+
return;
404+
}
405+
406+
let m0 = line.match(/^\/\/dtsv=(\d+)$/);
407+
if (m0) {
408+
version = m0[1];
409+
}
410+
388411
let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
389412
if (m1) {
390413
CURRENT_PROCESSING_RULE = line;
391414
let moduleId = m1[1];
392415
const sourceFile = sourceFileGetter(moduleId);
393416
if (!sourceFile) {
417+
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
418+
failed = true;
394419
return;
395420
}
396421

@@ -420,6 +445,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
420445
let moduleId = m2[1];
421446
const sourceFile = sourceFileGetter(moduleId);
422447
if (!sourceFile) {
448+
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
449+
failed = true;
423450
return;
424451
}
425452

@@ -461,6 +488,19 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
461488
result.push(line);
462489
});
463490

491+
if (failed) {
492+
return null;
493+
}
494+
495+
if (version !== dtsv) {
496+
if (!version) {
497+
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`);
498+
} else {
499+
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`);
500+
}
501+
return null;
502+
}
503+
464504
let resultTxt = result.join(endl);
465505
resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri');
466506
resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<');
@@ -477,11 +517,11 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
477517
].concat(enums).join(endl);
478518
resultEnums = format(resultEnums, endl);
479519

480-
return [
481-
resultTxt,
482-
`${usageImports.join('\n')}\n\n${usage.join('\n')}`,
483-
resultEnums
484-
];
520+
return {
521+
result: resultTxt,
522+
usageContent: `${usageImports.join('\n')}\n\n${usage.join('\n')}`,
523+
enums: resultEnums
524+
};
485525
}
486526

487527
export function getIncludesInRecipe(): string[] {
@@ -521,11 +561,18 @@ export interface IMonacoDeclarationResult {
521561
isTheSame: boolean;
522562
}
523563

524-
function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult {
564+
function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult | null {
525565
log('Starting monaco.d.ts generation');
526566

527567
const recipe = fs.readFileSync(RECIPE_PATH).toString();
528-
const [result, usageContent, enums] = generateDeclarationFile(recipe, sourceFileGetter);
568+
const t = generateDeclarationFile(recipe, sourceFileGetter);
569+
if (!t) {
570+
return null;
571+
}
572+
573+
const result = t.result;
574+
const usageContent = t.usageContent;
575+
const enums = t.enums;
529576

530577
const currentContent = fs.readFileSync(DECLARATION_PATH).toString();
531578
const one = currentContent.replace(/\r\n/gm, '\n');
@@ -543,7 +590,7 @@ function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult {
543590
};
544591
}
545592

546-
export function run(out: string, inputFiles: { [file: string]: string; }): IMonacoDeclarationResult {
593+
function run(out: string, inputFiles: { [file: string]: string; }): IMonacoDeclarationResult | null {
547594

548595
let SOURCE_FILE_MAP: { [moduleId: string]: ts.SourceFile; } = {};
549596
const sourceFileGetter = (moduleId: string): ts.SourceFile | null => {
@@ -566,7 +613,7 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona
566613
return _run(sourceFileGetter);
567614
}
568615

569-
export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult {
616+
export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult | null {
570617
const sourceFileGetter = (moduleId: string): ts.SourceFile | null => {
571618
let filePath = path.normalize(moduleIdToPath(out, moduleId));
572619
return sourceFileMap[filePath];
@@ -663,5 +710,9 @@ export function execute(): IMonacoDeclarationResult {
663710
});
664711
console.log(`Generating .d.ts took ${Date.now() - t1} ms`);
665712

666-
return run('src', OUTPUT_FILES);
713+
let r = run('src', OUTPUT_FILES);
714+
if (!r) {
715+
throw new Error(`monaco.d.ts genration error - Cannot continue`);
716+
}
717+
return r;
667718
}

build/monaco/monaco.d.ts.recipe

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,5 @@ declare namespace monaco.worker {
8585
#includeAll(vs/editor/common/services/editorSimpleWorker;):
8686

8787
}
88+
89+
//dtsv=1

src/vs/monaco.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5542,3 +5542,5 @@ declare namespace monaco.worker {
55425542
}
55435543

55445544
}
5545+
5546+
//dtsv=1

0 commit comments

Comments
 (0)