fixclosure
Version:
JavaScript dependency checker/fixer for Closure Library based on ECMAScript AST
81 lines (80 loc) • 2.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFixedSource = exports.fixInPlace = void 0;
const fs_1 = __importDefault(require("fs"));
const util_1 = require("util");
function fixInPlace(file, src, info) {
const fixedSrc = getFixedSource(src, info);
return (0, util_1.promisify)(fs_1.default.writeFile)(file, fixedSrc, "utf8");
}
exports.fixInPlace = fixInPlace;
function getFixedSource(src, info) {
const buf = [];
let bodyStarted = false;
if (info.provideEnd === 0) {
writeDeclarationHeader(buf, info);
buf.push(src);
}
else {
src.split("\n").forEach((line, index) => {
const lineNum = index + 1;
if (lineNum < info.provideStart) {
buf.push(line);
}
else if (lineNum === info.provideStart) {
writeDeclarationHeader(buf, info);
}
else if (lineNum <= info.provideEnd) {
// skip
}
else if (bodyStarted || line) {
bodyStarted = true;
buf.push(line);
}
});
}
return buf.join("\n");
}
exports.getFixedSource = getFixedSource;
function writeDeclarationHeader(buf, info) {
const provides = getProvideSrc(info);
const requires = getRequireSrc(info);
const requireTypes = getRequireTypeSrc(info);
const forwardDeclares = getForwardDeclareSrc(info);
if (provides.length > 0) {
buf.push(...provides);
buf.push("");
}
if (requires.length > 0) {
buf.push(...requires);
buf.push("");
}
if (requireTypes.length > 0) {
buf.push(...requireTypes);
buf.push("");
}
if (forwardDeclares.length > 0) {
buf.push(...forwardDeclares);
buf.push("");
}
}
function getProvideSrc(info) {
return getDeclarationSrc(info.toProvide, info.ignoredProvide, "goog.provide");
}
function getRequireSrc(info) {
return getDeclarationSrc(info.toRequire, info.ignoredRequire, "goog.require");
}
function getRequireTypeSrc(info) {
return getDeclarationSrc(info.toRequireType, info.ignoredRequireType, "goog.requireType");
}
function getForwardDeclareSrc(info) {
return getDeclarationSrc(info.toForwardDeclare, info.ignoredForwardDeclare, "goog.forwardDeclare");
}
function getDeclarationSrc(to, ignored, method) {
const declarations = to.map((namespace) => `${method}('${namespace}');`);
const ignores = ignored.map((namespace) => `${method}('${namespace}'); // fixclosure: ignore`);
return declarations.concat(ignores).sort();
}