UNPKG

fakeit-facet

Version:

Command-line utility that generates fake data which can be output as JSON, YAML, CSON, or CSV formats based on models defined in YAML.

656 lines (535 loc) 26.4 kB
"use strict"; var _typeof3 = require("@babel/runtime-corejs3/helpers/typeof"); var _mapInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/map"); var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); var _Array$isArray2 = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map"); var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"); var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); _Object$defineProperty(exports, "__esModule", { value: true }); exports.findFiles = findFiles; exports.objectSearch = objectSearch; exports.parsers = void 0; exports.pool = pool; exports.readFiles = readFiles; var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator")); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof")); var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array")); var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes")); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _trim = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/trim")); var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify")); var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int")); var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map")); var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter")); var _path = _interopRequireDefault(require("path")); var _globby = _interopRequireDefault(require("globby")); var _asyncArrayMethods = require("async-array-methods"); var _toJs = _interopRequireWildcard(require("to-js")); var _admZip = _interopRequireDefault(require("adm-zip")); var _es6Promisify = require("es6-promisify"); var _fsExtraPromisify = _interopRequireDefault(require("fs-extra-promisify")); var _es6PromisePool = _interopRequireDefault(require("es6-promise-pool")); var _yamljs = _interopRequireDefault(require("yamljs")); var _cson = _interopRequireDefault(require("cson")); var _csvParse = _interopRequireDefault(require("csv-parse")); var _csvStringify = _interopRequireDefault(require("csv-stringify")); function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray2(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { var _context13; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context13 = Object.prototype.toString.call(o)).call(_context13, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } /// @name objectSearch /// @description Recursively looks through objects and finds the pattern provided /// @arg {object, array} data - The data to search through /// @arg {regex,string} pattern - The pattern used to match a path /// @arg {string} current_path - The current part of the path. This is used as apart of the recursion and you shouldn't pass anyting to it manually. /// @arg {array} paths - The paths that have been match. This is used as apart of the recursion and you shouldn't pass anyting to it manually. /// @returns {array} - With the paths that have been matched function objectSearch(data, pattern, current_path) { var paths = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; function appendPath(opath, index) { var _context; opath = opath ? (0, _concat["default"])(_context = "".concat(opath, ".")).call(_context, index) : "".concat(index); opath = opath.replace(/^\.|\.$|\.{2,}/, ''); return opath; } if ((0, _isArray["default"])(data)) { for (var i = 0; i < data.length; i++) { var test_path = appendPath(current_path, i); if (test_path.match(pattern) && !(0, _includes["default"])(paths).call(paths, test_path)) { paths.push(test_path); } objectSearch(data[i], pattern, test_path, paths); } } else if ((0, _typeof2["default"])(data) === 'object' && data !== null) { for (var key in data) { if (data.hasOwnProperty(key)) { var _test_path = appendPath(current_path, key); if (_test_path.match(pattern) && !(0, _includes["default"])(paths).call(paths, _test_path)) { paths.push(_test_path); } objectSearch(data[key], pattern, _test_path, paths); } } } return paths; } /// @name findFiles /// @description /// This is a very efficient way to to recursively read a directory and get all the files. /// @arg {string, array} globs - The glob(s) or dir(s) you want to get all the files from /// @returns {array} All the files in the paths(s) that were passed /// @async function findFiles(_x) { return _findFiles.apply(this, arguments); } /// @name readFiles /// @description /// This will read all the files that have been passed to it and return them in an array of objects. /// @arg {string, array} files - The files to read. This can be any file including `zip`. /// @returns {array} An `array` of files where each object will have the following information /// /// ```js /// { /// path: '', // the full path of the file /// content: '', // the contents of the file as a string /// // the rest of the keys are the same as what you would get from running `path.parse` /// root: '', /// dir: '', /// base: '', /// ext: '', /// name: '', /// } /// ``` /// @async function _findFiles() { _findFiles = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(globs) { var files, sort, find; return _regenerator["default"].wrap(function _callee5$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: // all the files after files = []; sort = function sort(list) { var to_search = []; list = _toJs["default"].flatten(list); var _iterator = _createForOfIteratorHelper(list), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var item = _step.value; if (_path["default"].extname(item)) { files.push(item); } else { to_search.push(item); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return to_search; }; find = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(items) { return _regenerator["default"].wrap(function _callee4$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.t0 = sort; _context6.next = 3; return (0, _mapInstanceProperty2(_asyncArrayMethods))(items, /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(item) { return _regenerator["default"].wrap(function _callee3$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (!_globby["default"].hasMagic(item)) { _context5.next = 4; break; } _context5.next = 3; return (0, _globby["default"])(item); case 3: return _context5.abrupt("return", _context5.sent); case 4: if (!_path["default"].extname(item)) { _context5.next = 6; break; } return _context5.abrupt("return", item); case 6: _context5.next = 8; return (0, _globby["default"])(item); case 8: return _context5.abrupt("return", _context5.sent); case 9: case "end": return _context5.stop(); } } }, _callee3); })); return function (_x6) { return _ref2.apply(this, arguments); }; }()); case 3: _context6.t1 = _context6.sent; items = (0, _context6.t0)(_context6.t1); if (!items.length) { _context6.next = 7; break; } return _context6.abrupt("return", find(items)); case 7: case "end": return _context6.stop(); } } }, _callee4); })); return function find(_x5) { return _ref.apply(this, arguments); }; }(); _context7.next = 5; return find(_toJs["default"].array(globs)); case 5: return _context7.abrupt("return", files); case 6: case "end": return _context7.stop(); } } }, _callee5); })); return _findFiles.apply(this, arguments); } function readFiles(_x2) { return _readFiles.apply(this, arguments); } /// @name pool /// @description /// This is very similar to the `Array.prototype.map` except that /// it's used to limit the number of functions running at a time. /// @arg {array} items - The array to loop over /// @arg {function} fn - The function to run on each of the items. It has the same arguments the map function does /// @arg {number} limit [100] - The number of promises that can run at any given item. /// @returns {array} of the items that were returned by the fn. /// @async function _readFiles() { _readFiles = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(files) { var _context10; return _regenerator["default"].wrap(function _callee8$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: if (files) { _context11.next = 2; break; } return _context11.abrupt("return"); case 2: files = _toJs["default"].array(files); _context11.next = 5; return (0, _mapInstanceProperty2(_asyncArrayMethods))(files, /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(file) { var info, zip; return _regenerator["default"].wrap(function _callee7$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: file = _path["default"].resolve(file); // resolve the full path // resolve the full path info = _path["default"].parse(file); // parse the full path to get the name and extension if (!(info.ext === '.zip')) { _context9.next = 5; break; } zip = new _admZip["default"](file); return _context9.abrupt("return", (0, _mapInstanceProperty2(_asyncArrayMethods))(zip.getEntries(), /*#__PURE__*/function () { var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(entry) { var file_info; return _regenerator["default"].wrap(function _callee6$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: if (!(!entry.isDirectory && !entry.entryName.match(/^(\.|__MACOSX)/))) { _context8.next = 7; break; } file_info = _path["default"].parse(entry.entryName); // eslint-disable-line // eslint-disable-line file_info.path = entry.entryName; _context8.next = 5; return zip.readAsText(entry.entryName); case 5: file_info.content = _context8.sent; return _context8.abrupt("return", file_info); case 7: case "end": return _context8.stop(); } } }, _callee6); })); return function (_x8) { return _ref4.apply(this, arguments); }; }())); case 5: info.path = file; _context9.t0 = _toJs["default"]; _context9.next = 9; return _fsExtraPromisify["default"].readFile(file); case 9: _context9.t1 = _context9.sent; info.content = _context9.t0.string.call(_context9.t0, _context9.t1); return _context9.abrupt("return", info); case 12: case "end": return _context9.stop(); } } }, _callee7); })); return function (_x7) { return _ref3.apply(this, arguments); }; }()); case 5: files = _context11.sent; return _context11.abrupt("return", (0, _filter["default"])(_context10 = _toJs["default"].flatten(files)).call(_context10, Boolean)); case 7: case "end": return _context11.stop(); } } }, _callee8); })); return _readFiles.apply(this, arguments); } function pool(_x3, _x4) { return _pool.apply(this, arguments); } /// @name parsers /// @description /// This holds all the parsers that this project uses and normalizes /// them to all function the same way. /// Each parser in this object has 2 functions `parse`, and `stringify`. /// @type {object} function _pool() { _pool = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(items, fn) { var limit, i, results, length, producer, runner, _args9 = arguments; return _regenerator["default"].wrap(function _callee9$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: limit = _args9.length > 2 && _args9[2] !== undefined ? _args9[2] : 100; i = 0; results = []; if (typeof items === 'number') { length = items; items = []; } else { length = items.length; } producer = function producer() { if (i < length) { var index = i; return fn(items[index] || i, i++, items).then(function (result) { results[index] = result; }); } return null; }; runner = new _es6PromisePool["default"](producer, limit); _context12.next = 8; return runner.start(); case 8: return _context12.abrupt("return", results); case 9: case "end": return _context12.stop(); } } }, _callee9); })); return _pool.apply(this, arguments); } var parsers = {}; exports.parsers = parsers; var csv = { parse: (0, _es6Promisify.promisify)(_csvParse["default"]), stringify: (0, _es6Promisify.promisify)(_csvStringify["default"]) }; /// # @name parsers.yaml /// # @alias parsers.yml /// # @type {object} parsers.yaml = parsers.yml = { /// # @name parsers.yaml.parse /// # @alias parsers.yml.parse /// # @arg {string, object} obj /// # @returns {object} - The javascript object /// # @async parse: function parse(obj) { return _promise["default"].resolve(_yamljs["default"].parse(obj)); }, /// # @name parsers.yaml.stringify /// # @alias parsers.yml.stringify /// # @arg {object} obj /// # @arg {number} indent [2] The indent level /// # @returns {string} - The yaml string /// # @async stringify: function stringify(obj) { var _context2; var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; return _promise["default"].resolve((0, _trim["default"])(_context2 = _yamljs["default"].stringify(obj, null, indent)).call(_context2)); } }; /// # @name parsers.json /// # @type {object} parsers.json = { /// # @name parsers.json.parse /// # @arg {string, object} obj /// # @returns {object} - The javascript object /// # @async parse: function parse(obj) { return _promise["default"].resolve(JSON.parse(obj)); }, /// # @name parsers.json.stringify /// # @arg {object} obj /// # @arg {number} indent [2] The indent level /// # @returns {string} - The yaml string /// # @async stringify: function stringify(obj) { var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; return _promise["default"].resolve((0, _stringify["default"])(obj, null, !(0, _parseInt2["default"])(indent) ? null : indent)); } }; /// # @name parsers.cson /// # @type {object} parsers.cson = { /// # @name parsers.cson.parse /// # @arg {string, object} obj /// # @returns {object} - The javascript object /// # @async parse: function parse(obj) { return new _promise["default"](function (resolve, reject) { _cson["default"].parse(obj, {}, function (err, result) { /* istanbul ignore next */ if (err) { return reject(err); } resolve(result); }); }); }, /// # @name parsers.cson.stringify /// # @arg {object} obj /// # @arg {number} indent [2] The indent level /// # @returns {string} - The yaml string /// # @async stringify: function stringify(obj) { var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; return _promise["default"].resolve(_cson["default"].stringify(obj, null, indent)); } }; /// # @name parsers.csv /// # @type {object} parsers.csv = { /// # @name parsers.csv.parse /// # @arg {string, object} /// # @returns {array} - The javascript object /// # @async parse: function parse(obj) { return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var result, fix; return _regenerator["default"].wrap(function _callee$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: fix = function _fix(a, b) { /* istanbul ignore if : too hard to create a test case for it */ if (!a || !b) { return a; } for (var k in b) { // eslint-disable-line if (b.hasOwnProperty(k)) { /* istanbul ignore if : too hard to create a test case for it */ if (_toJs.is.plainObject(b[k])) { a[k] = _toJs.is.plainObject(a[k]) ? fix(a[k], b[k]) : b[k]; } else if (_toJs.is.string(b[k]) && /^[0-9]+$/.test(b[k])) { // convert string into a number a[k] = _toJs["default"].number(b[k]); } else if (_toJs.is.string(b[k]) && b[k][0] === '{') { // convert string into an object a[k] = fix({}, _toJs["default"].object(b[k])); } else { a[k] = b[k]; } } } return a; }; _context3.next = 3; return csv.parse(obj, { columns: true }); case 3: result = _context3.sent; return _context3.abrupt("return", (0, _map["default"])(result).call(result, function (item) { return fix({}, item); })); case 5: case "end": return _context3.stop(); } } }, _callee); }))(); }, /// # @name parsers.csv.stringify /// # @arg {object} obj /// # @arg {object} options [{ header: true, quotedString: true }] The csv options /// # @returns {string} - The yaml string /// # @async stringify: function stringify(obj, options) { return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { var result; return _regenerator["default"].wrap(function _callee2$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if ((0, _typeof2["default"])(options) !== 'object') { options = {}; } options = _toJs["default"].extend({ header: true, quotedString: true }, options); _context4.next = 4; return csv.stringify(_toJs["default"].array(obj), options); case 4: result = _context4.sent; return _context4.abrupt("return", (0, _trim["default"])(result).call(result)); case 6: case "end": return _context4.stop(); } } }, _callee2); }))(); } };