UNPKG

@creditkarma/thrift-parser

Version:

A parser for Thrift written in TypeScript

94 lines 3.78 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = exports.parseFiles = exports.defaultOptions = exports.createParser = exports.createScanner = void 0; const fs = require("fs"); const path = require("path"); const debugger_1 = require("./debugger"); const organizer_1 = require("./organizer"); const parser_1 = require("./parser"); const scanner_1 = require("./scanner"); const types_1 = require("./types"); __exportStar(require("./types"), exports); __exportStar(require("./factory"), exports); var scanner_2 = require("./scanner"); Object.defineProperty(exports, "createScanner", { enumerable: true, get: function () { return scanner_2.createScanner; } }); var parser_2 = require("./parser"); Object.defineProperty(exports, "createParser", { enumerable: true, get: function () { return parser_2.createParser; } }); exports.defaultOptions = { fastFail: false, rootDir: '.', outDir: '.', files: [], organize: true, }; function parseFiles(options = {}) { const mergedOptions = Object.assign(Object.assign({}, exports.defaultOptions), options); return mergedOptions.files.map((file) => { const filePath = path.resolve(process.cwd(), mergedOptions.rootDir, file); const content = fs.readFileSync(filePath, 'utf-8'); return parse(content, mergedOptions); }); } exports.parseFiles = parseFiles; function parse(source, options = {}) { const mergedOptions = Object.assign(Object.assign({}, exports.defaultOptions), options); const debug = (0, debugger_1.createDebugger)(source); const scanner = (0, scanner_1.createScanner)(source, handleError); const tokens = scanner.scan(); const parser = (0, parser_1.createParser)(tokens, handleError); const intermediate = parser.parse(); const thrift = mergedOptions.organize ? (0, organizer_1.organize)(intermediate) : intermediate; /** * This is a safe handler for errors that allows the parser and scanner to recover to a * reasonable state after an error and continue with the parse. If an error occurs we will * not return any output, but using this allows us to catch more errors and report them to * the user at once instead of the work flow of find error -> fix error, find error -> fix error. * * @param err */ function handleError(err) { debug.report(err); if (mergedOptions.fastFail) { debug.print(); throw new Error(err.message); } else { switch (err.type) { case types_1.ErrorType.ParseError: parser.synchronize(); break; case types_1.ErrorType.ScanError: scanner.syncronize(); break; } } } if (debug.hasError()) { debug.print(); return { type: types_1.SyntaxType.ThriftErrors, errors: debug.getErrors(), }; } else { return thrift; } } exports.parse = parse; //# sourceMappingURL=index.js.map