Use a more compact format for dts to avoid duplication

This commit is contained in:
Alex Dima 2018-08-08 17:34:03 +02:00
parent d1e907a30c
commit be47b28d96
5 changed files with 133 additions and 52 deletions

View file

@ -9,14 +9,13 @@ const fs = require('fs');
const TYPESCRIPT_LIB_SOURCE = path.join(__dirname, '../node_modules/typescript/lib'); const TYPESCRIPT_LIB_SOURCE = path.join(__dirname, '../node_modules/typescript/lib');
const TYPESCRIPT_LIB_DESTINATION = path.join(__dirname, '../src/lib'); const TYPESCRIPT_LIB_DESTINATION = path.join(__dirname, '../src/lib');
(function() { (function () {
try { try {
fs.statSync(TYPESCRIPT_LIB_DESTINATION); fs.statSync(TYPESCRIPT_LIB_DESTINATION);
} catch (err) { } catch (err) {
fs.mkdirSync(TYPESCRIPT_LIB_DESTINATION); fs.mkdirSync(TYPESCRIPT_LIB_DESTINATION);
} }
importLibDeclarationFile('lib.d.ts'); importLibs();
importLibDeclarationFile('lib.es6.d.ts');
var tsServices = fs.readFileSync(path.join(TYPESCRIPT_LIB_SOURCE, 'typescriptServices.js')).toString(); var tsServices = fs.readFileSync(path.join(TYPESCRIPT_LIB_SOURCE, 'typescriptServices.js')).toString();
@ -62,46 +61,103 @@ export = ts;
fs.writeFileSync(path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServices.d.ts'), dtsServices); fs.writeFileSync(path.join(TYPESCRIPT_LIB_DESTINATION, 'typescriptServices.d.ts'), dtsServices);
})(); })();
/** function importLibs() {
* Import a lib*.d.ts file from TypeScript's dist function getFileName(name) {
*/ return (name === '' ? 'lib.d.ts' : `lib.${name}.d.ts`);
function importLibDeclarationFile(name) { }
var dstName = name.replace(/\.d\.ts$/, '').replace(/\./g, '-') + '-ts'; function getVariableName(name) {
return (name === '' ? 'lib_dts' : `lib_${name.replace(/\./g, '_')}_dts`);
var contents = resolveLibFile(null, name); }
function readLibFile(name) {
var dstPath = path.join(TYPESCRIPT_LIB_DESTINATION, dstName + '.ts'); var srcPath = path.join(TYPESCRIPT_LIB_SOURCE, getFileName(name));
fs.writeFileSync(dstPath, return fs.readFileSync(srcPath).toString();
`/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export const contents = "${escapeText(contents)}";
`);
}
function resolveLibFile(name, filename) {
var srcPath;
if (filename) {
srcPath = path.join(TYPESCRIPT_LIB_SOURCE, filename);
} else {
srcPath = path.join(TYPESCRIPT_LIB_SOURCE, `lib.${name}.d.ts`);
} }
var contents = fs.readFileSync(srcPath).toString(); var queue = [];
var lines = contents.split(/\r\n|\r|\n/); var in_queue = {};
var enqueue = function (name) {
if (in_queue[name]) {
return;
}
in_queue[name] = true;
queue.push(name);
};
enqueue('');
enqueue('es6');
var result = []; var result = [];
while (queue.length > 0) {
var name = queue.shift();
var contents = readLibFile(name);
var lines = contents.split(/\r\n|\r|\n/);
var output = '';
var writeOutput = function (text) {
if (output.length === 0) {
output = text;
} else {
output += ` + ${text}`;
}
};
var outputLines = [];
var flushOutputLines = function () {
writeOutput(`"${escapeText(outputLines.join('\n'))}"`);
outputLines = [];
};
var deps = [];
for (let i = 0; i < lines.length; i++) { for (let i = 0; i < lines.length; i++) {
let m = lines[i].match(/\/\/\/\s*<reference\s*lib="([^"]+)"/); let m = lines[i].match(/\/\/\/\s*<reference\s*lib="([^"]+)"/);
if (m) { if (m) {
result.push('\n' + resolveLibFile(m[1], null) + '\n'); flushOutputLines();
writeOutput(getVariableName(m[1]));
deps.push(getVariableName(m[1]));
enqueue(m[1]);
continue; continue;
} }
result.push(lines[i]); outputLines.push(lines[i]);
}
flushOutputLines();
result.push({
name: getVariableName(name),
deps: deps,
output: output
});
} }
return result.join('\n'); var strResult = `/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
`;
// Do a topological sort
while (result.length > 0) {
for (let i = result.length - 1; i >= 0; i--) {
if (result[i].deps.length === 0) {
// emit this node
strResult += `\nexport const ${result[i].name} = ${result[i].output};\n`;
// mark dep as resolved
for (let j = 0; j < result.length; j++) {
for (let k = 0; k < result[j].deps.length; k++) {
if (result[j].deps[k] === result[i].name) {
result[j].deps.splice(k, 1);
break;
}
}
}
// remove from result
result.splice(i, 1);
break;
}
}
}
var dstPath = path.join(TYPESCRIPT_LIB_DESTINATION, 'lib.ts');
fs.writeFileSync(dstPath, strResult);
} }
/** /**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

38
src/lib/lib.ts Normal file

File diff suppressed because one or more lines are too long

View file

@ -5,20 +5,19 @@
'use strict'; 'use strict';
import * as ts from './lib/typescriptServices'; import * as ts from './lib/typescriptServices';
import { contents as libdts } from './lib/lib-ts'; import { lib_dts, lib_es6_dts } from './lib/lib';
import { contents as libes6ts } from './lib/lib-es6-ts';
import Promise = monaco.Promise; import Promise = monaco.Promise;
import IWorkerContext = monaco.worker.IWorkerContext; import IWorkerContext = monaco.worker.IWorkerContext;
const DEFAULT_LIB = { const DEFAULT_LIB = {
NAME: 'defaultLib:lib.d.ts', NAME: 'defaultLib:lib.d.ts',
CONTENTS: libdts CONTENTS: lib_dts
}; };
const ES6_LIB = { const ES6_LIB = {
NAME: 'defaultLib:lib.es6.d.ts', NAME: 'defaultLib:lib.es6.d.ts',
CONTENTS: libes6ts CONTENTS: lib_es6_dts
}; };
export class TypeScriptWorker implements ts.LanguageServiceHost { export class TypeScriptWorker implements ts.LanguageServiceHost {