UNPKG

jiq

Version:

Use existing javascript knowledge to query or modify data

131 lines (130 loc) 4.33 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.write = exports.read = exports.validTypes = void 0; const node_fetch_1 = __importDefault(require("node-fetch")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const path_2 = require("path"); const parser = __importStar(require("./parser")); const file_list_1 = __importDefault(require("./file-list")); const os_1 = require("os"); exports.validTypes = ["text", "txt", "json", "yaml", "yml", "csv", "xml", "html", "file", "env"]; const getFileType = (program, filename) => { switch (true) { case program.json: return "json"; case program.text: return "txt"; case program.yaml: return "yaml"; case program.csv: return "csv"; case program.html: return "html"; case program.file: return "file"; } if (!filename) { return "txt"; } const stats = fs_1.default.statSync(path_1.default.resolve(filename)); if (stats.isDirectory()) { return "file"; } if (filename.startsWith(".env")) { return "env"; } let ext = path_2.extname(filename); if (!ext) { return "txt"; } ext = ext.substr(1); return ext; }; const readStream = (cb) => { let data = ''; process.stdin.on("data", (txt) => { data += txt.toString(); }); process.stdin.on("end", () => { if (data.endsWith(os_1.EOL)) { data = data.slice(0, -1); } cb(data); }); process.stdin.on("error", (err) => { console.error(err.message); }); }; exports.read = (filename, program, callback) => { if (!filename) { const fileType = getFileType(program); return readStream((txt) => { callback(fileType, parser.parse(txt, fileType)); }); } if (isRemoteFile(filename)) { getRemoteData(filename).then((args) => callback(...args)); return; } const fileType = getFileType(program, filename); if (fileType === "file") { return callback(fileType, file_list_1.default.create(filename, program.recursive)); } return callback(fileType, parser.parse(readFile(filename), fileType)); }; const readFile = (filename) => { let contents = fs_1.default.readFileSync(filename, "utf-8"); if (contents.endsWith(os_1.EOL)) { contents = contents.slice(0, -1); } return contents; }; exports.write = (data, filename, fileType) => { const ext = path_2.extname(filename); if (ext) { fileType = ext.substr(1); } fs_1.default.writeFileSync(filename, parser.stringify(data, fileType)); }; const isRemoteFile = (filename) => { return /^https?\:\/\//.test(filename); }; const getRemoteData = async (url) => { const response = await node_fetch_1.default(url); const contentType = response.headers.get("Content-Type"); const fileType = getFileFromContentType(contentType); return [fileType, parser.parse(await response.text(), fileType)]; }; const getFileFromContentType = (contentType) => { if (!contentType) { return "txt"; } const ext = contentType.split(';')[0]; if (!ext) { return "txt"; } return ext.split("/")[1]; };