UNPKG

rest-chronicle

Version:
154 lines (153 loc) 4.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _fsExtra = _interopRequireDefault(require("fs-extra")); var _dotProp = _interopRequireDefault(require("dot-prop")); var _myrmidon = require("myrmidon"); var _jsYaml = _interopRequireDefault(require("js-yaml")); var _constants = require("../constants"); var _utils = require("./utils"); var _Base = _interopRequireDefault(require("./Base")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function dictionary(obj, prefix = []) { return (0, _myrmidon.flatten)(Object.entries(obj).map(([key, value]) => { if ((0, _myrmidon.isObject)(value)) return dictionary(value, [...prefix, key]); return { key: [...prefix, key], value }; })); } const types = { null: 'nil' }; class RamlReporter extends _Base.default { constructor(file, { hash } = {}) { super(file); _defineProperty(this, "mergeArray", true); if (hash) this.getHash = hash; } _build(actions) { const map = new Map(); const groups = {}; for (const a of actions) { const { path, method } = a.request; const resources = path.split('/').filter(Boolean).map(i => `/${i}`); const groupValues = [...resources, method.toLowerCase()]; _utils.findGroup.call(this, groups, groupValues, a.id); map.set(a.id, a); } return { groups, map }; } _renderHeaders(headers) { return Object.entries(headers) // eslint-disable-next-line unicorn/no-array-reduce .reduce((prev, [name, value]) => ({ ...prev, [name]: { example: value, type: (0, _utils.detectType)(value, types) } }), {}); } _renderBody(body) { const result = { type: (0, _utils.detectType)(body, types), example: (0, _myrmidon.isEmpty)(body) ? body : JSON.stringify(body, null, _constants.DEFAULT_JSON_OFFSET) }; if (body && result.type === 'object') { for (const [key, value] of Object.entries(body)) { _dotProp.default.set(result, `properties.${key}`, { type: (0, _utils.detectType)(value, types) }); } } return result; } _renderAction({ context: { group, title }, request, response }) { return { '(group)': group, description: title, headers: this._renderHeaders(request.headers), responses: { [response.status.code]: { body: { [response.info.type]: this._renderBody(response.body) } } } }; } _generate(groups, map, actions) { const dict = dictionary(groups); const hashed = []; for (const item of dict) { if (item.value.length === 1) { hashed.push({ key: item.key, value: item.value[0] }); continue; } const [original, ...dublicates] = item.value; hashed.push({ key: item.key, value: original }); for (const actionId of dublicates) { const action = map.get(actionId); const hash = this.getHash(action); const [method, lastPath, ...pathRev] = [...item.key].reverse(); hashed.push({ key: [...pathRev.reverse(), `${lastPath}#${hash}`, method], value: actionId }); } } const paths = {}; const origins = [...new Set(actions.map(a => a.request.origin))]; for (const item of hashed) { const action = map.get(item.value); _dotProp.default.set(paths, item.key.join('.'), this._renderAction(action)); } const content = { title: 'Raml report', baseUri: origins[0], version: '1.0.0', annotationTypes: { group: 'string' }, ...paths }; return `#%RAML 1.0\n${_jsYaml.default.dump(content)}`; } async write(actions) { const { groups, map } = this._build(actions); const content = this._generate(groups, map, actions); await _fsExtra.default.writeFile(this.file, content); } } exports.default = RamlReporter;