typescript-closure-tools
Version:
Command-line tools to convert closure-style JSDoc annotations to typescript, and to convert typescript sources to closure externs files
78 lines (77 loc) • 2.29 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const parser = require("./parser");
const combine = require("./combine");
const options = require("./options");
var fileByProvide = {};
var providesByFile = {};
function parent_symbol(name) {
var dot = name.lastIndexOf('.');
return name.substring(0, dot);
}
/**
* @param symbolName
* @returns file that goog.provide's name
*/
function file(symbolName) {
if (symbolName)
return fileByProvide[symbolName] || file(parent_symbol(symbolName));
else
return null;
}
exports.file = file;
/**
* @param fileName
* @returns value of name
*/
function symbols(fileName) {
if (!providesByFile[fileName])
providesByFile[fileName] = combine.members(parser.jsdoc(fs.readFileSync(fileName, 'utf8')));
if (providesByFile[fileName])
return providesByFile[fileName];
}
exports.symbols = symbols;
function symbol(symbolName) {
var fileName = file(symbolName);
if (fileName) {
var s = symbols(fileName);
return s.classes[symbolName] || s.modules[symbolName];
}
else
return null;
}
exports.symbol = symbol;
function member(symbolName) {
var fileName = file(symbolName);
if (fileName) {
var s = symbols(fileName);
var dot = symbolName.lastIndexOf('.');
var moduleName = symbolName.substring(0, dot);
var memberName = symbolName.substring(dot + 1);
var moduleValue = s.modules[moduleName] || {};
return moduleValue[memberName] || null;
}
else
return null;
}
exports.member = member;
// If user gives a TSV file with provided symbols, use that
if (options.provides) {
fs.readFileSync(options.provides, 'utf8').split('\n').forEach(line => {
var columns = line.split('\t');
var file = columns[0];
var symbol = columns[1];
fileByProvide[symbol] = file;
});
}
// Otherwise parse all inputs
else {
options.todo.forEach(todo => {
var found = symbols(todo.input);
var classNames = Object.keys(found.classes);
var moduleNames = Object.keys(found.modules);
var names = classNames.concat(moduleNames);
names.forEach(name => fileByProvide[name] = todo.input);
});
}
;