UNPKG

@selfage/cli

Version:

Basic CLI to buid, run and format TypeScript code.

108 lines 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.format = format; exports.sortImports = sortImports; const fs = require("fs"); const prettier = require("prettier"); const io_helper_1 = require("./io_helper"); const typescript_1 = require("typescript"); async function format(file, dryRun) { let tsFile = (0, io_helper_1.stripFileExtension)(file) + ".ts"; let sortedContent = sortImports(tsFile); let formattedContent = await prettier.format(sortedContent, { parser: "typescript", endOfLine: "lf", }); (0, io_helper_1.writeFileSync)(tsFile, formattedContent, dryRun); } function sortImports(tsFile) { let rawContent = fs.readFileSync(tsFile).toString(); let sourceFile = (0, typescript_1.createSourceFile)("placeholder", rawContent, typescript_1.ScriptTarget.ES2015, true); let equalImports = new Map(); let defaultImports = new Map(); let namespaceImports = new Map(); let namedImports = new Map(); let sideEffectImports = new Set(); let contentList = new Array(); let endPos = 0; for (let node of sourceFile.statements) { if (node.kind === typescript_1.SyntaxKind.ImportEqualsDeclaration) { let importNode = node; equalImports.set(importNode.moduleReference .expression.text, importNode.name.text); writeUncapturedContentInBetween(node, contentList); (endPos = getEnd(node)), contentList; continue; } else if (node.kind === typescript_1.SyntaxKind.ImportDeclaration) { let importNode = node; let importPath = importNode.moduleSpecifier.text; if (!importNode.importClause) { sideEffectImports.add(importPath); writeUncapturedContentInBetween(node, contentList); endPos = getEnd(node); continue; } else if (!importNode.importClause.namedBindings) { defaultImports.set(importPath, importNode.importClause.name.text); writeUncapturedContentInBetween(node, contentList); endPos = getEnd(node); continue; } else if (importNode.importClause.namedBindings.kind === typescript_1.SyntaxKind.NamespaceImport) { namespaceImports.set(importPath, importNode.importClause.namedBindings.name.text); writeUncapturedContentInBetween(node, contentList); endPos = getEnd(node); continue; } else if (importNode.importClause.namedBindings.kind === typescript_1.SyntaxKind.NamedImports) { if (!namedImports.has(importPath)) { namedImports.set(importPath, new Set()); } let names = namedImports.get(importPath); for (let specifier of importNode.importClause.namedBindings.elements) { names.add(specifier.getText()); } writeUncapturedContentInBetween(node, contentList); endPos = getEnd(node); continue; } } break; } for (let path of sideEffectImports) { contentList.push(`import '${path}';`); } for (let path of [...equalImports.keys()].sort()) { let name = equalImports.get(path); contentList.push(`import ${name} = require('${path}');`); } for (let path of [...defaultImports.keys()].sort()) { let name = defaultImports.get(path); contentList.push(`import ${name} from '${path}';`); } for (let path of [...namespaceImports.keys()].sort()) { let name = namespaceImports.get(path); contentList.push(`import * as ${name} from '${path}';`); } for (let path of [...namedImports.keys()].sort()) { let names = namedImports.get(path); let sortedNames = [...names].sort(); contentList.push(`import { ${sortedNames.join(",")} } from '${path}';`); } return contentList.join("\n") + rawContent.substring(endPos); } function getEnd(node) { return node.getStart() + node.getWidth(); } function writeUncapturedContentInBetween(node, contentList) { let newContent = node .getFullText() .substring(0, node.getStart() - node.getFullStart()) .trim(); if (newContent) { contentList.push(newContent); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLHdCQVFDO0FBRUQsa0NBK0ZDO0FBekhELHlCQUEwQjtBQUMxQixxQ0FBc0M7QUFDdEMsMkNBQWdFO0FBQ2hFLDJDQVdvQjtBQUViLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBWSxFQUFFLE1BQWdCO0lBQ3pELElBQUksTUFBTSxHQUFHLElBQUEsOEJBQWtCLEVBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzlDLElBQUksYUFBYSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxJQUFJLGdCQUFnQixHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDMUQsTUFBTSxFQUFFLFlBQVk7UUFDcEIsU0FBUyxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsSUFBQSx5QkFBYSxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLE1BQWM7SUFDeEMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwRCxJQUFJLFVBQVUsR0FBRyxJQUFBLDZCQUFnQixFQUMvQixhQUFhLEVBQ2IsVUFBVSxFQUNWLHlCQUFZLENBQUMsTUFBTSxFQUNuQixJQUFJLENBQ0wsQ0FBQztJQUVGLElBQUksWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzdDLElBQUksY0FBYyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQy9DLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDakQsSUFBSSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDbEQsSUFBSSxpQkFBaUIsR0FBRyxJ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LElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxJQUFZO0lBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUywrQkFBK0IsQ0FDdEMsSUFBWSxFQUNaLFdBQTBCO0lBRTFCLElBQUksVUFBVSxHQUFHLElBQUk7U0FDbEIsV0FBVyxFQUFFO1NBQ2IsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ25ELElBQUksRUFBRSxDQUFDO0lBQ1YsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5pbXBvcnQgcHJldHRpZXIgPSByZXF1aXJlKFwicHJldHRpZXJcIik7XG5pbXBvcnQgeyBzdHJpcEZpbGVFeHRlbnNpb24sIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiLi9pb19oZWxwZXJcIjtcbmltcG9ydCB7XG4gIEV4dGVybmFsTW9kdWxlUmVmZXJlbmNlLFxuICBJbXBvcnREZWNsYXJhdGlvbixcbiAgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24sXG4gIE5hbWVkSW1wb3J0cyxcbiAgTmFtZXNwYWNlSW1wb3J0LFxuICBOb2RlIGFzIFRzTm9kZSxcbiAgU2NyaXB0VGFyZ2V0LFxuICBTdHJpbmdMaXRlcmFsLFxuICBTeW50YXhLaW5kLFxuICBjcmVhdGVTb3VyY2VGaWxlLFxufSBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KGZpbGU6IHN0cmluZywgZHJ5UnVuPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgdHNGaWxlID0gc3RyaXBGaWxlRXh0ZW5zaW9uKGZpbGUpICsgXCIudHNcIjtcbiAgbGV0IHNvcnRlZENvbnRlbnQgPSBzb3J0SW1wb3J0cyh0c0ZpbGUpO1xuICBsZXQgZm9ybWF0dGVkQ29udGVudCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChzb3J0ZWRDb250ZW50LCB7XG4gICAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIixcbiAgICBlbmRPZkxpbmU6IFwibGZcIixcbiAgfSk7XG4gIHdyaXRlRmlsZVN5bmModHNGaWxlLCBmb3JtYXR0ZWRDb250ZW50LCBkcnlSdW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEltcG9ydHModHNGaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmF3Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0c0ZpbGUpLnRvU3RyaW5nKCk7XG4gIGxldCBzb3VyY2VGaWxlID0gY3JlYXRlU291cmNlRmlsZShcbiAgICBcInBsYWNlaG9sZGVyXCIsXG4gICAgcmF3Q29udGVudCxcbiAgICBTY3JpcHRUYXJnZXQuRVMyMDE1LFxuICAgIHRydWUsXG4gICk7XG5cbiAgbGV0IGVxdWFsSW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGxldCBkZWZhdWx0SW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgbGV0IG5hbWVkSW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHNpZGVFZmZlY3RJbXBvcnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGxldCBjb250ZW50TGlzdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgbGV0IGVuZFBvcyA9IDA7XG4gIGZvciAobGV0IG5vZGUgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5JbXBvcnRFcXVhbHNEZWNsYXJhdGlvbikge1xuICAgICAgbGV0IGltcG9ydE5vZGUgPSBub2RlIGFzIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uO1xuICAgICAgZXF1YWxJbXBvcnRzLnNldChcbiAgICAgICAgKFxuICAgICAgICAgIChpbXBvcnROb2RlLm1vZHVsZVJlZmVyZW5jZSBhcyBFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSlcbiAgICAgICAgICAgIC5leHByZXNzaW9uIGFzIFN0cmluZ0xpdGVyYWxcbiAgICAgICAgKS50ZXh0LFxuICAgICAgICBpbXBvcnROb2RlLm5hbWUudGV4dCxcbiAgICAgICk7XG4gICAgICB3cml0ZVVuY2FwdHVyZWRDb250ZW50SW5CZXR3ZWVuKG5vZGUsIGNvbnRlbnRMaXN0KTtcbiAgICAgIChlbmRQb3MgPSBnZXRFbmQobm9kZSkpLCBjb250ZW50TGlzdDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLkltcG9ydERlY2xhcmF0aW9uKSB7XG4gICAgICBsZXQgaW1wb3J0Tm9kZSA9IG5vZGUgYXMgSW1wb3J0RGVjbGFyYXRpb247XG4gICAgICBsZXQgaW1wb3J0UGF0aCA9IChpbXBvcnROb2RlLm1vZHVsZVNwZWNpZmllciBhcyBTdHJpbmdMaXRlcmFsKS50ZXh0O1xuICAgICAgaWYgKCFpbXBvcnROb2RlLmltcG9ydENsYXVzZSkge1xuICAgICAgICBzaWRlRWZmZWN0SW1wb3J0cy5hZGQoaW1wb3J0UGF0aCk7XG4gICAgICAgIHdyaXRlVW5jYXB0dXJlZENvbnRlbnRJbkJldHdlZW4obm9kZSwgY29udGVudExpc3QpO1xuICAgICAgICBlbmRQb3MgPSBnZXRFbmQobm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICghaW1wb3J0Tm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncykge1xuICAgICAgICBkZWZhdWx0SW1wb3J0cy5zZXQoaW1wb3J0UGF0aCwgaW1wb3J0Tm9kZS5pbXBvcnRDbGF1c2UubmFtZS50ZXh0KTtcbiAgICAgICAgd3JpdGVVbmNhcHR1cmVkQ29udGVudEluQmV0d2Vlbihub2RlLCBjb250ZW50TGlzdCk7XG4gICAgICAgIGVuZFBvcyA9IGdldEVuZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbXBvcnROb2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLmtpbmQgPT09XG4gICAgICAgIFN5bnRheEtpbmQuTmFtZXNwYWNlSW1wb3J0XG4gICAgICApIHtcbiAgICAgICAgbmFtZXNwYWNlSW1wb3J0cy5zZXQoXG4gICAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgICAoaW1wb3J0Tm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncyBhcyBOYW1lc3BhY2VJbXBvcnQpLm5hbWUudGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgd3JpdGVVbmNhcHR1cmVkQ29udGVudEluQmV0d2Vlbihub2RlLCBjb250ZW50TGlzdCk7XG4gICAgICAgIGVuZFBvcyA9IGdldEVuZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbXBvcnROb2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLmtpbmQgPT09IFN5bnRheEtpbmQuTmFtZWRJbXBvcnRzXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFuYW1lZEltcG9ydHMuaGFzKGltcG9ydFBhdGgpKSB7XG4gICAgICAgICAgbmFtZWRJbXBvcnRzLnNldChpbXBvcnRQYXRoLCBuZXcgU2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lcyA9IG5hbWVkSW1wb3J0cy5nZXQoaW1wb3J0UGF0aCk7XG4gICAgICAgIGZvciAobGV0IHNwZWNpZmllciBvZiAoXG4gICAgICAgICAgaW1wb3J0Tm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncyBhcyBOYW1lZEltcG9ydHNcbiAgICAgICAgKS5lbGVtZW50cykge1xuICAgICAgICAgIG5hbWVzLmFkZChzcGVjaWZpZXIuZ2V0VGV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZVVuY2FwdHVyZWRDb250ZW50SW5CZXR3ZWVuKG5vZGUsIGNvbnRlbnRMaXN0KTtcbiAgICAgICAgZW5kUG9zID0gZ2V0RW5kKG5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICBmb3IgKGxldCBwYXRoIG9mIHNpZGVFZmZlY3RJbXBvcnRzKSB7XG4gICAgY29udGVudExpc3QucHVzaChgaW1wb3J0ICcke3BhdGh9JztgKTtcbiAgfVxuICBmb3IgKGxldCBwYXRoIG9mIFsuLi5lcXVhbEltcG9ydHMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBsZXQgbmFtZSA9IGVxdWFsSW1wb3J0cy5nZXQocGF0aCk7XG4gICAgY29udGVudExpc3QucHVzaChgaW1wb3J0ICR7bmFtZX0gPSByZXF1aXJlKCcke3BhdGh9Jyk7YCk7XG4gIH1cbiAgZm9yIChsZXQgcGF0aCBvZiBbLi4uZGVmYXVsdEltcG9ydHMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBsZXQgbmFtZSA9IGRlZmF1bHRJbXBvcnRzLmdldChwYXRoKTtcbiAgICBjb250ZW50TGlzdC5wdXNoKGBpbXBvcnQgJHtuYW1lfSBmcm9tICcke3BhdGh9JztgKTtcbiAgfVxuICBmb3IgKGxldCBwYXRoIG9mIFsuLi5uYW1lc3BhY2VJbXBvcnRzLmtleXMoKV0uc29ydCgpKSB7XG4gICAgbGV0IG5hbWUgPSBuYW1lc3BhY2VJbXBvcnRzLmdldChwYXRoKTtcbiAgICBjb250ZW50TGlzdC5wdXNoKGBpbXBvcnQgKiBhcyAke25hbWV9IGZyb20gJyR7cGF0aH0nO2ApO1xuICB9XG4gIGZvciAobGV0IHBhdGggb2YgWy4uLm5hbWVkSW1wb3J0cy5rZXlzKCldLnNvcnQoKSkge1xuICAgIGxldCBuYW1lcyA9IG5hbWVkSW1wb3J0cy5nZXQocGF0aCk7XG4gICAgbGV0IHNvcnRlZE5hbWVzID0gWy4uLm5hbWVzXS5zb3J0KCk7XG4gICAgY29udGVudExpc3QucHVzaChgaW1wb3J0IHsgJHtzb3J0ZWROYW1lcy5qb2luKFwiLFwiKX0gfSBmcm9tICcke3BhdGh9JztgKTtcbiAgfVxuICByZXR1cm4gY29udGVudExpc3Quam9pbihcIlxcblwiKSArIHJhd0NvbnRlbnQuc3Vic3RyaW5nKGVuZFBvcyk7XG59XG5cbmZ1bmN0aW9uIGdldEVuZChub2RlOiBUc05vZGUpOiBudW1iZXIge1xuICByZXR1cm4gbm9kZS5nZXRTdGFydCgpICsgbm9kZS5nZXRXaWR0aCgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVVuY2FwdHVyZWRDb250ZW50SW5CZXR3ZWVuKFxuICBub2RlOiBUc05vZGUsXG4gIGNvbnRlbnRMaXN0OiBBcnJheTxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGxldCBuZXdDb250ZW50ID0gbm9kZVxuICAgIC5nZXRGdWxsVGV4dCgpXG4gICAgLnN1YnN0cmluZygwLCBub2RlLmdldFN0YXJ0KCkgLSBub2RlLmdldEZ1bGxTdGFydCgpKVxuICAgIC50cmltKCk7XG4gIGlmIChuZXdDb250ZW50KSB7XG4gICAgY29udGVudExpc3QucHVzaChuZXdDb250ZW50KTtcbiAgfVxufVxuIl19