UNPKG

curl_transcode

Version:

Transcode cURL query to various programming languages

90 lines (80 loc) 2.21 kB
import assert from "assert"; import * as path from "path"; import * as fs from "fs"; import json5 from "json5"; import Ajv from "ajv"; import { ConfigError } from "./error.ts"; const DEFAULT_RAW_CONFIG = { replace: [] }; class InternalError extends Error { constructor(message: string) { super(message); this.name = InternalError.name; } } export class Config { private static ajv = new Ajv(); private static validate = Config.ajv.compile({ type: "object", additionalProperties: false, properties: { replace: { type: "array", items: { type: "string" } } } }); replace: Array<string>; constructor(replace: Array<string> = []) { this.replace = replace; } static fromDefaultFile(): Config { let filePath = path.join(".", ".curl_transcode.json"); if (!fs.existsSync(filePath)) { return new Config(); } try { let rawString = Config.readConfigurationFile(filePath); let rawConfig = Config.parseConfigJson(rawString); if (!this.validate(rawConfig)) { throw new InternalError(Config.getAjvErrorMessage()); } rawConfig = Object.assign(DEFAULT_RAW_CONFIG, rawConfig); return new Config((rawConfig as any).replace); } catch (error) { if (error instanceof InternalError) { throw new ConfigError(filePath, error.message); } throw error; } } private static readConfigurationFile(filePath: string): string { try { return fs.readFileSync(filePath, "utf-8"); } catch { throw new InternalError("can not read"); } } private static parseConfigJson(text: string): any { try { return json5.parse(text); } catch { throw new InternalError("invalid JSON format"); } } private static getAjvErrorMessage(): string { if (!Config.validate.errors || Config.validate.errors.length === 0) { throw new Error("no errors from Ajv"); } let { instancePath, message } = Config.validate.errors[0]; assert(message, "no error message from Ajv"); if (instancePath) { return `property ${instancePath}: ${message}`; } else { return message; } } }