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

@ -15,8 +15,7 @@ const TYPESCRIPT_LIB_DESTINATION = path.join(__dirname, '../src/lib');
} catch (err) {
fs.mkdirSync(TYPESCRIPT_LIB_DESTINATION);
}
importLibDeclarationFile('lib.d.ts');
importLibDeclarationFile('lib.es6.d.ts');
importLibs();
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);
})();
/**
* Import a lib*.d.ts file from TypeScript's dist
*/
function importLibDeclarationFile(name) {
var dstName = name.replace(/\.d\.ts$/, '').replace(/\./g, '-') + '-ts';
var contents = resolveLibFile(null, name);
var dstPath = path.join(TYPESCRIPT_LIB_DESTINATION, dstName + '.ts');
fs.writeFileSync(dstPath,
`/*---------------------------------------------------------------------------------------------
* 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 importLibs() {
function getFileName(name) {
return (name === '' ? 'lib.d.ts' : `lib.${name}.d.ts`);
}
function getVariableName(name) {
return (name === '' ? 'lib_dts' : `lib_${name.replace(/\./g, '_')}_dts`);
}
function readLibFile(name) {
var srcPath = path.join(TYPESCRIPT_LIB_SOURCE, getFileName(name));
return fs.readFileSync(srcPath).toString();
}
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 queue = [];
var in_queue = {};
var enqueue = function (name) {
if (in_queue[name]) {
return;
}
in_queue[name] = true;
queue.push(name);
};
enqueue('');
enqueue('es6');
var contents = fs.readFileSync(srcPath).toString();
var lines = contents.split(/\r\n|\r|\n/);
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++) {
let m = lines[i].match(/\/\/\/\s*<reference\s*lib="([^"]+)"/);
if (m) {
result.push('\n' + resolveLibFile(m[1], null) + '\n');
flushOutputLines();
writeOutput(getVariableName(m[1]));
deps.push(getVariableName(m[1]));
enqueue(m[1]);
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';
import * as ts from './lib/typescriptServices';
import { contents as libdts } from './lib/lib-ts';
import { contents as libes6ts } from './lib/lib-es6-ts';
import { lib_dts, lib_es6_dts } from './lib/lib';
import Promise = monaco.Promise;
import IWorkerContext = monaco.worker.IWorkerContext;
const DEFAULT_LIB = {
NAME: 'defaultLib:lib.d.ts',
CONTENTS: libdts
CONTENTS: lib_dts
};
const ES6_LIB = {
NAME: 'defaultLib:lib.es6.d.ts',
CONTENTS: libes6ts
CONTENTS: lib_es6_dts
};
export class TypeScriptWorker implements ts.LanguageServiceHost {