sec-edgar-api
Version:
Fetch and parse SEC earnings reports and other filings. Useful for financial analysis.
100 lines (99 loc) • 5.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var XMLParser_1 = require("../XMLParser");
var util_xbrl_1 = require("./util-xbrl");
var InstanceParser = /** @class */ (function () {
function InstanceParser() {
this.xmlParser = new XMLParser_1.default();
}
InstanceParser.prototype.parseContext = function (node) {
var _a, _b, _c, _d, _e, _f, _g;
var context = util_xbrl_1.default.toObject(node);
var id = util_xbrl_1.default.toString(context['@_id']);
var entity = util_xbrl_1.default.toObject((_a = context['xbrli:entity']) !== null && _a !== void 0 ? _a : context['entity']);
var entityIdentifier = util_xbrl_1.default.toObject((_b = entity['xbrli:identifier']) !== null && _b !== void 0 ? _b : entity['identifier']);
var entityIdentifierText = util_xbrl_1.default.toString(entityIdentifier['#text']);
var entityIdentifierScheme = util_xbrl_1.default.toString(entityIdentifier['@_scheme']);
var segment = util_xbrl_1.default.toObject((_c = entity['xbrli:segment']) !== null && _c !== void 0 ? _c : entity['segment']);
var segmentExplicitMembers = util_xbrl_1.default.toArray(segment['xbrldi:explicitMember']);
var segmentTypedMembers = util_xbrl_1.default.toArray(segment['xbrldi:typedMember']);
var segments = [];
segmentTypedMembers.forEach(function (member) {
var _a;
member = util_xbrl_1.default.toObject(member);
var dimension = (_a = member['@_dimension']) !== null && _a !== void 0 ? _a : '';
segments.push({
value: util_xbrl_1.default.toString(member["".concat(dimension, ".domain")]),
dimension: util_xbrl_1.default.toString(dimension),
});
});
segmentExplicitMembers.forEach(function (member) {
member = util_xbrl_1.default.toObject(member);
segments.push({
value: util_xbrl_1.default.toString(member['#text']),
dimension: util_xbrl_1.default.toString(member['@_dimension']),
});
});
var period = util_xbrl_1.default.toObject((_d = context['xbrli:period']) !== null && _d !== void 0 ? _d : context['period']);
var periodObj = {};
var startDate = (_e = period['xbrli:startDate']) !== null && _e !== void 0 ? _e : period['startDate'];
var endDate = (_f = period['xbrli:endDate']) !== null && _f !== void 0 ? _f : period['endDate'];
var instant = (_g = period['xbrli:instant']) !== null && _g !== void 0 ? _g : period['instant'];
if (startDate) {
periodObj.startDate = util_xbrl_1.default.toString(startDate);
}
if (endDate) {
periodObj.endDate = util_xbrl_1.default.toString(endDate);
}
if (instant) {
periodObj.instant = util_xbrl_1.default.toString(instant);
}
return {
id: id,
entity: {
identifier: {
value: entityIdentifierText,
scheme: entityIdentifierScheme,
},
segment: segments,
},
period: periodObj,
};
};
InstanceParser.prototype.parse = function (xml) {
var _this = this;
var _a, _b, _c, _d;
var xbrl = util_xbrl_1.default.extractXbrlObject(this.xmlParser.parse(xml));
var contexts = util_xbrl_1.default
.toArray((_c = (_b = (_a = xbrl === null || xbrl === void 0 ? void 0 : xbrl.context) !== null && _a !== void 0 ? _a : xbrl === null || xbrl === void 0 ? void 0 : xbrl['xbrli:context']) !== null && _b !== void 0 ? _b : xbrl === null || xbrl === void 0 ? void 0 : xbrl['xbrl:context']) !== null && _c !== void 0 ? _c : [])
.map(function (context) { return _this.parseContext(context); });
var units = util_xbrl_1.default.toArray((_d = xbrl === null || xbrl === void 0 ? void 0 : xbrl.unit) !== null && _d !== void 0 ? _d : []).map(function (unit) {
var _a, _b, _c, _d, _e, _f, _g;
return ({
id: (_a = unit['@_id']) !== null && _a !== void 0 ? _a : '',
measure: (_g = (_e = (_c = (_b = unit['xbrli:measure']) === null || _b === void 0 ? void 0 : _b['#text']) !== null && _c !== void 0 ? _c : (_d = unit['measure']) === null || _d === void 0 ? void 0 : _d['#text']) !== null && _e !== void 0 ? _e : (_f = unit['xbrl:measure']) === null || _f === void 0 ? void 0 : _f['#text']) !== null && _g !== void 0 ? _g : '',
});
});
var factElements = [];
for (var name_1 in xbrl) {
for (var _i = 0, _e = util_xbrl_1.default.toArray(xbrl[name_1]); _i < _e.length; _i++) {
var element = _e[_i];
if (!element['@_contextRef'])
continue;
var factElement = { name: name_1, id: '', contextRef: '' };
for (var key in element) {
if (key.startsWith('@_')) {
factElement[key.substring(2)] = element[key];
}
else if (key === '#text') {
factElement.text = element[key];
}
}
factElements.push(factElement);
}
}
return { factElements: factElements, contexts: contexts, units: units };
};
return InstanceParser;
}());
exports.default = InstanceParser;