Add versioning to monaco.d.ts generation

This commit is contained in:
Alex Dima
2018-10-24 12:09:05 +02:00
parent 27f64e395f
commit baf8b88b1d
6 changed files with 124 additions and 21 deletions
+6 -1
View File
@@ -189,7 +189,12 @@ class MonacoGenerator {
// Nothing changed // Nothing changed
return null; return null;
} }
return monacodts.run2('src', this._dtsFilesContents2); let r = monacodts.run2('src', this._dtsFilesContents2);
if (!r && !this._isWatch) {
// The build must always be able to generate the monaco.d.ts
throw new Error(`monaco.d.ts genration error - Cannot continue`);
}
return r;
} }
_log(message, ...rest) { _log(message, ...rest) {
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest); util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);
+6 -1
View File
@@ -242,7 +242,12 @@ class MonacoGenerator {
return null; return null;
} }
return monacodts.run2('src', this._dtsFilesContents2); let r = monacodts.run2('src', this._dtsFilesContents2);
if (!r && !this._isWatch) {
// The build must always be able to generate the monaco.d.ts
throw new Error(`monaco.d.ts genration error - Cannot continue`);
}
return r;
} }
private _log(message: any, ...rest: any[]): void { private _log(message: any, ...rest: any[]): void {
+46 -8
View File
@@ -8,6 +8,7 @@ const fs = require("fs");
const ts = require("typescript"); const ts = require("typescript");
const path = require("path"); const path = require("path");
const util = require("gulp-util"); const util = require("gulp-util");
const dtsv = '1';
const tsfmt = require('../../tsfmt.json'); const tsfmt = require('../../tsfmt.json');
function log(message, ...rest) { function log(message, ...rest) {
util.log(util.colors.cyan('[monaco.d.ts]'), message, ...rest); util.log(util.colors.cyan('[monaco.d.ts]'), message, ...rest);
@@ -21,6 +22,9 @@ function logErr(message, ...rest) {
util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE); util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE);
util.log(util.colors.red('[monaco.d.ts]'), message, ...rest); util.log(util.colors.red('[monaco.d.ts]'), message, ...rest);
} }
function _logErr(message, ...rest) {
util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest);
}
function moduleIdToPath(out, moduleId) { function moduleIdToPath(out, moduleId) {
if (/\.d\.ts/.test(moduleId)) { if (/\.d\.ts/.test(moduleId)) {
return path.join(SRC, moduleId); return path.join(SRC, moduleId);
@@ -315,6 +319,7 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
let usageCounter = 0; let usageCounter = 0;
let usageImports = []; let usageImports = [];
let usage = []; let usage = [];
let failed = false;
usage.push(`var a;`); usage.push(`var a;`);
usage.push(`var b;`); usage.push(`var b;`);
const generateUsageImport = (moduleId) => { const generateUsageImport = (moduleId) => {
@@ -323,13 +328,23 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
return importName; return importName;
}; };
let enums = []; let enums = [];
let version = null;
lines.forEach(line => { lines.forEach(line => {
if (failed) {
return;
}
let m0 = line.match(/^\/\/dtsv=(\d+)$/);
if (m0) {
version = m0[1];
}
let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
if (m1) { if (m1) {
CURRENT_PROCESSING_RULE = line; CURRENT_PROCESSING_RULE = line;
let moduleId = m1[1]; let moduleId = m1[1];
const sourceFile = sourceFileGetter(moduleId); const sourceFile = sourceFileGetter(moduleId);
if (!sourceFile) { if (!sourceFile) {
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
failed = true;
return; return;
} }
const importName = generateUsageImport(moduleId); const importName = generateUsageImport(moduleId);
@@ -355,6 +370,8 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
let moduleId = m2[1]; let moduleId = m2[1];
const sourceFile = sourceFileGetter(moduleId); const sourceFile = sourceFileGetter(moduleId);
if (!sourceFile) { if (!sourceFile) {
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
failed = true;
return; return;
} }
const importName = generateUsageImport(moduleId); const importName = generateUsageImport(moduleId);
@@ -391,6 +408,18 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
} }
result.push(line); result.push(line);
}); });
if (failed) {
return null;
}
if (version !== dtsv) {
if (!version) {
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`);
}
else {
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`);
}
return null;
}
let resultTxt = result.join(endl); let resultTxt = result.join(endl);
resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri'); resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri');
resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<'); resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<');
@@ -405,11 +434,11 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
'' ''
].concat(enums).join(endl); ].concat(enums).join(endl);
resultEnums = format(resultEnums, endl); resultEnums = format(resultEnums, endl);
return [ return {
resultTxt, result: resultTxt,
`${usageImports.join('\n')}\n\n${usage.join('\n')}`, usageContent: `${usageImports.join('\n')}\n\n${usage.join('\n')}`,
resultEnums enums: resultEnums
]; };
} }
function getIncludesInRecipe() { function getIncludesInRecipe() {
let recipe = fs.readFileSync(exports.RECIPE_PATH).toString(); let recipe = fs.readFileSync(exports.RECIPE_PATH).toString();
@@ -439,7 +468,13 @@ exports.getFilesToWatch = getFilesToWatch;
function _run(sourceFileGetter) { function _run(sourceFileGetter) {
log('Starting monaco.d.ts generation'); log('Starting monaco.d.ts generation');
const recipe = fs.readFileSync(exports.RECIPE_PATH).toString(); const recipe = fs.readFileSync(exports.RECIPE_PATH).toString();
const [result, usageContent, enums] = generateDeclarationFile(recipe, sourceFileGetter); const t = generateDeclarationFile(recipe, sourceFileGetter);
if (!t) {
return null;
}
const result = t.result;
const usageContent = t.usageContent;
const enums = t.enums;
const currentContent = fs.readFileSync(DECLARATION_PATH).toString(); const currentContent = fs.readFileSync(DECLARATION_PATH).toString();
const one = currentContent.replace(/\r\n/gm, '\n'); const one = currentContent.replace(/\r\n/gm, '\n');
const other = result.replace(/\r\n/gm, '\n'); const other = result.replace(/\r\n/gm, '\n');
@@ -470,7 +505,6 @@ function run(out, inputFiles) {
}; };
return _run(sourceFileGetter); return _run(sourceFileGetter);
} }
exports.run = run;
function run2(out, sourceFileMap) { function run2(out, sourceFileMap) {
const sourceFileGetter = (moduleId) => { const sourceFileGetter = (moduleId) => {
let filePath = path.normalize(moduleIdToPath(out, moduleId)); let filePath = path.normalize(moduleIdToPath(out, moduleId));
@@ -550,6 +584,10 @@ function execute() {
OUTPUT_FILES[SRC_FILE_TO_EXPECTED_NAME[fileName]] = emitOutput.outputFiles[0].text; OUTPUT_FILES[SRC_FILE_TO_EXPECTED_NAME[fileName]] = emitOutput.outputFiles[0].text;
}); });
console.log(`Generating .d.ts took ${Date.now() - t1} ms`); console.log(`Generating .d.ts took ${Date.now() - t1} ms`);
return run('src', OUTPUT_FILES); let r = run('src', OUTPUT_FILES);
if (!r) {
throw new Error(`monaco.d.ts genration error - Cannot continue`);
}
return r;
} }
exports.execute = execute; exports.execute = execute;
+62 -11
View File
@@ -8,6 +8,8 @@ import * as ts from 'typescript';
import * as path from 'path'; import * as path from 'path';
import * as util from 'gulp-util'; import * as util from 'gulp-util';
const dtsv = '1';
const tsfmt = require('../../tsfmt.json'); const tsfmt = require('../../tsfmt.json');
function log(message: any, ...rest: any[]): void { function log(message: any, ...rest: any[]): void {
@@ -24,6 +26,9 @@ function logErr(message: any, ...rest: any[]): void {
util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE); util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE);
util.log(util.colors.red('[monaco.d.ts]'), message, ...rest); util.log(util.colors.red('[monaco.d.ts]'), message, ...rest);
} }
function _logErr(message: any, ...rest: any[]): void {
util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest);
}
function moduleIdToPath(out: string, moduleId: string): string { function moduleIdToPath(out: string, moduleId: string): string {
if (/\.d\.ts/.test(moduleId)) { if (/\.d\.ts/.test(moduleId)) {
@@ -362,7 +367,13 @@ function createReplacer(data: string): (str: string) => string {
}; };
} }
function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): [string, string, string] { interface ITempResult {
result: string;
usageContent: string;
enums: string;
}
function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): ITempResult | null {
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n'; const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
let lines = recipe.split(endl); let lines = recipe.split(endl);
@@ -372,6 +383,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
let usageImports: string[] = []; let usageImports: string[] = [];
let usage: string[] = []; let usage: string[] = [];
let failed = false;
usage.push(`var a;`); usage.push(`var a;`);
usage.push(`var b;`); usage.push(`var b;`);
@@ -382,15 +395,27 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
}; };
let enums: string[] = []; let enums: string[] = [];
let version: string | null = null;
lines.forEach(line => { lines.forEach(line => {
if (failed) {
return;
}
let m0 = line.match(/^\/\/dtsv=(\d+)$/);
if (m0) {
version = m0[1];
}
let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
if (m1) { if (m1) {
CURRENT_PROCESSING_RULE = line; CURRENT_PROCESSING_RULE = line;
let moduleId = m1[1]; let moduleId = m1[1];
const sourceFile = sourceFileGetter(moduleId); const sourceFile = sourceFileGetter(moduleId);
if (!sourceFile) { if (!sourceFile) {
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
failed = true;
return; return;
} }
@@ -420,6 +445,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
let moduleId = m2[1]; let moduleId = m2[1];
const sourceFile = sourceFileGetter(moduleId); const sourceFile = sourceFileGetter(moduleId);
if (!sourceFile) { if (!sourceFile) {
_logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`);
failed = true;
return; return;
} }
@@ -461,6 +488,19 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
result.push(line); result.push(line);
}); });
if (failed) {
return null;
}
if (version !== dtsv) {
if (!version) {
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`);
} else {
_logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`);
}
return null;
}
let resultTxt = result.join(endl); let resultTxt = result.join(endl);
resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri'); resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri');
resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<'); resultTxt = resultTxt.replace(/\bEvent</g, 'IEvent<');
@@ -477,11 +517,11 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
].concat(enums).join(endl); ].concat(enums).join(endl);
resultEnums = format(resultEnums, endl); resultEnums = format(resultEnums, endl);
return [ return {
resultTxt, result: resultTxt,
`${usageImports.join('\n')}\n\n${usage.join('\n')}`, usageContent: `${usageImports.join('\n')}\n\n${usage.join('\n')}`,
resultEnums enums: resultEnums
]; };
} }
export function getIncludesInRecipe(): string[] { export function getIncludesInRecipe(): string[] {
@@ -521,11 +561,18 @@ export interface IMonacoDeclarationResult {
isTheSame: boolean; isTheSame: boolean;
} }
function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult { function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult | null {
log('Starting monaco.d.ts generation'); log('Starting monaco.d.ts generation');
const recipe = fs.readFileSync(RECIPE_PATH).toString(); const recipe = fs.readFileSync(RECIPE_PATH).toString();
const [result, usageContent, enums] = generateDeclarationFile(recipe, sourceFileGetter); const t = generateDeclarationFile(recipe, sourceFileGetter);
if (!t) {
return null;
}
const result = t.result;
const usageContent = t.usageContent;
const enums = t.enums;
const currentContent = fs.readFileSync(DECLARATION_PATH).toString(); const currentContent = fs.readFileSync(DECLARATION_PATH).toString();
const one = currentContent.replace(/\r\n/gm, '\n'); const one = currentContent.replace(/\r\n/gm, '\n');
@@ -543,7 +590,7 @@ function _run(sourceFileGetter: SourceFileGetter): IMonacoDeclarationResult {
}; };
} }
export function run(out: string, inputFiles: { [file: string]: string; }): IMonacoDeclarationResult { function run(out: string, inputFiles: { [file: string]: string; }): IMonacoDeclarationResult | null {
let SOURCE_FILE_MAP: { [moduleId: string]: ts.SourceFile; } = {}; let SOURCE_FILE_MAP: { [moduleId: string]: ts.SourceFile; } = {};
const sourceFileGetter = (moduleId: string): ts.SourceFile | null => { const sourceFileGetter = (moduleId: string): ts.SourceFile | null => {
@@ -566,7 +613,7 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona
return _run(sourceFileGetter); return _run(sourceFileGetter);
} }
export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult { export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult | null {
const sourceFileGetter = (moduleId: string): ts.SourceFile | null => { const sourceFileGetter = (moduleId: string): ts.SourceFile | null => {
let filePath = path.normalize(moduleIdToPath(out, moduleId)); let filePath = path.normalize(moduleIdToPath(out, moduleId));
return sourceFileMap[filePath]; return sourceFileMap[filePath];
@@ -663,5 +710,9 @@ export function execute(): IMonacoDeclarationResult {
}); });
console.log(`Generating .d.ts took ${Date.now() - t1} ms`); console.log(`Generating .d.ts took ${Date.now() - t1} ms`);
return run('src', OUTPUT_FILES); let r = run('src', OUTPUT_FILES);
if (!r) {
throw new Error(`monaco.d.ts genration error - Cannot continue`);
}
return r;
} }
+2
View File
@@ -85,3 +85,5 @@ declare namespace monaco.worker {
#includeAll(vs/editor/common/services/editorSimpleWorker;): #includeAll(vs/editor/common/services/editorSimpleWorker;):
} }
//dtsv=1
+2
View File
@@ -5542,3 +5542,5 @@ declare namespace monaco.worker {
} }
} }
//dtsv=1