budgie-cli
Version:
Node CLI for Budgie.
106 lines • 4.68 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const os_1 = require("os");
const ts_budgie_1 = require("ts-budgie");
const ts = require("typescript");
const extensions_1 = require("../../utils/extensions");
const values_1 = require("../../utils/values");
const budgieConverter_1 = require("../budgieConverter");
const converter_1 = require("../converter");
/**
* Extension for TypeScript files.
*/
exports.tsExtension = ".ts";
/**
* Creates TS source files for each file name.
*
* @param existingFileContents Writable cache of contents of file paths, keyed by unique file name.
* @param scriptTarget Specified TypeScript language output target.
* @returns TypeScript source files, keyed by unique file path.
*/
const createSourceFilesMap = (existingFileContents, scriptTarget) => {
const map = new Map();
existingFileContents.forEach((fileContents, fileName) => {
map.set(fileName, ts.createSourceFile(fileName, fileContents, scriptTarget, true, ts.ScriptKind.TS));
});
return map;
};
/**
* @todo Use this once ts-budgie supports emitting a summary of unsupported syntax.
*/
exports.complainForTransformation = (sourceFile, complaint) => {
const { text } = sourceFile;
const { start } = complaint.range;
const line = text.substring(0, start).split(/\r\n|\r|\n/g).length;
return `Line ${line + 1}: Unsupported syntax: ${complaint.line.args[0]}`;
};
/**
* Converts TypeScript files to their Budgie outputs.
*/
class TypeScriptConverter {
/**
* Initializes a new instance of the TypeScriptConverter class.
*
* @param dependencies Dependencies used for initialization.
* @param options Options for converting files.
*/
constructor(dependencies) {
this.dependencies = dependencies;
this.sourceFiles = createSourceFilesMap(dependencies.existingFileContents, values_1.defaultValue(dependencies.tsconfigOptions.compilerOptions.target, () => ts.ScriptTarget.Latest));
this.transformer = ts_budgie_1.createTransformer({
baseDirectory: dependencies.baseDirectory,
outputNamespace: dependencies.outputNamespace,
sourceFiles: Array.from(this.sourceFiles.values()),
});
}
/**
* Converts a TypeScript file to its Budgie output.
*
* @param sourcePath Original Budgie file path.
* @returns The file's Budgie output.
*/
convertFile(sourcePath) {
return __awaiter(this, void 0, void 0, function* () {
if (this.dependencies.metadata !== undefined && sourcePath === "src/index.ts") {
return {
sourcePath,
status: converter_1.ConversionStatus.Succeeded,
};
}
const sourceFile = this.sourceFiles.get(sourcePath);
if (sourceFile === undefined) {
throw new Error(`Unknown source file: '${sourcePath}'.`);
}
const outputPath = extensions_1.replaceFileExtension(sourcePath, exports.tsExtension, budgieConverter_1.budgieExtension);
let transformationResults;
try {
transformationResults = this.transformer.transformSourceFile(sourceFile);
}
catch (error) {
return {
error,
outputPath,
sourcePath,
status: converter_1.ConversionStatus.Failed,
};
}
yield this.dependencies.fileSystem.writeFile(outputPath, transformationResults.printed.join(os_1.EOL));
return {
outputPath,
sourcePath,
status: converter_1.ConversionStatus.Succeeded,
};
});
}
}
exports.TypeScriptConverter = TypeScriptConverter;
//# sourceMappingURL=typescriptConverter.js.map