@academyjs/rover
Version:
Rover allows you to learn programming interactively.
137 lines • 4.83 kB
JavaScript
;
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.prototype.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 });
const base_1 = __importDefault(require("./base"));
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const errors_1 = require("../errors");
const utils = __importStar(require("../utils"));
const runner_1 = require("../runner");
const { EVENT_TEST_PASS, EVENT_TEST_PENDING, EVENT_TEST_FAIL, EVENT_TEST_END, EVENT_RUN_END, } = runner_1.constants;
/**
* Return a plain-object representation of `test`
* free of cyclic properties etc.
*/
const clean = (test) => {
let error = test.err || {};
if (error instanceof Error) {
error = errorJSON(error);
}
return {
title: test.title,
fullTitle: test.fullTitle(),
file: test.file,
duration: test.duration,
currentRetry: test.currentRetry(),
speed: test.speed,
err: cleanCycles(error),
};
};
/**
* Replaces any circular references inside `object` with '[object Object]'
*/
const cleanCycles = (object) => {
const cache = [];
return JSON.parse(JSON.stringify(object, (key, value) => {
if (typeof value === "object" && value !== null) {
if (cache.indexOf(value) !== -1) {
// Instead of going in a circle, we'll print [object Object]
return "" + value;
}
cache.push(value);
}
return value;
}));
};
/**
* Transform an Error object into a JSON object.
*/
const errorJSON = (error) => {
const result = {};
Object.getOwnPropertyNames(error).forEach((key) => {
result[key] = error[key];
}, error);
return result;
};
class JSONReporter extends base_1.default {
/**
* Constructs a new `JSON` reporter instance.
*
* @param runner - Instance triggers reporter actions.
* @param options - runner options
*/
constructor(runner, options = {}) {
super(runner, options);
const tests = [];
const pending = [];
const failures = [];
const passes = [];
let output;
if (options.reporterOption && options.reporterOption.output) {
if (utils.isBrowser()) {
throw (0, errors_1.createUnsupportedError)("file output not supported in browser");
}
output = options.reporterOption.output;
}
runner.on(EVENT_TEST_END, (test) => {
tests.push(test);
});
runner.on(EVENT_TEST_PASS, (test) => {
passes.push(test);
});
runner.on(EVENT_TEST_FAIL, (test) => {
failures.push(test);
});
runner.on(EVENT_TEST_PENDING, (test) => {
pending.push(test);
});
runner.once(EVENT_RUN_END, () => {
const object = {
stats: this.stats,
tests: tests.map(clean),
pending: pending.map(clean),
failures: failures.map(clean),
passes: passes.map(clean),
};
runner.testResults = object;
const json = JSON.stringify(object, null, 2);
if (output) {
try {
fs_1.default.mkdirSync(path_1.default.dirname(output), { recursive: true });
fs_1.default.writeFileSync(output, json);
}
catch (error) {
console.error(`${base_1.default.symbols.err} [mocha] writing output to "${output}" failed: ${error.message}\n`);
process.stdout.write(json);
}
}
else {
process.stdout.write(json);
}
});
}
}
JSONReporter.description = "single JSON object";
exports.default = JSONReporter;
//# sourceMappingURL=json.js.map