sec-edgar-api
Version:
Fetch and parse SEC earnings reports and other filings. Useful for financial analysis.
89 lines (88 loc) • 3.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseForm13g = void 0;
var XMLParserLegacy_1 = require("../XMLParserLegacy");
/**
* Form SC 13G - Institutional Holders
*
* example at https://www.sec.gov/Archives/edgar/data/320193/000119312523038262/d382361dsc13ga.htm
*/
function parseForm13g(params, xmlParser) {
var _a, _b, _c, _d;
if (xmlParser === void 0) { xmlParser = new XMLParserLegacy_1.default(); }
var xml = params.xml;
var textMap = xmlParser.getTableTextMap({ xml: xml });
var holders = [];
var getKey = function (text) {
var keyMap = {
'name of reporting': 'name',
'names of reporting': 'name',
'citizenship or place': 'origin',
'sole voting power': 'votingPowerSole',
'shared voting power': 'votingPowerShared',
'sole dispositive power': 'dispositivePowerSole',
'shared dispositive power': 'dispositivePowerShared',
'aggregate amount beneficially owned': 'shares',
'percent of class': 'percentOfClass',
'type of reporting person': 'typeOfReportingPerson',
};
var textLower = text.toLowerCase();
for (var key in keyMap) {
if (textLower.includes(key))
return keyMap[key];
}
return null;
};
var _loop_1 = function (text) {
var colName = getKey(text);
var isNewHolder = colName === 'name';
if (isNewHolder) {
if (((_a = holders[holders.length - 1]) === null || _a === void 0 ? void 0 : _a.name) === '') {
holders.pop();
}
holders.push({
name: '',
origin: '',
shares: 0,
percentOfClass: '',
votingPowerSole: null,
votingPowerShared: null,
dispositivePowerSole: null,
dispositivePowerShared: null,
typeOfReportingPerson: null,
});
}
var holder = holders[holders.length - 1];
// continue if no colName or if the value is already set
if (colName === null || ![0, '', null].includes(holder[colName]))
return "continue";
var textParts = text.split(' ').filter(function (t) { return t.trim() !== ''; });
var colNameIndex = textParts.findIndex(function (t) { return getKey(t) === colName; });
var value = (_c = (_b = textParts[colNameIndex + 1]) === null || _b === void 0 ? void 0 : _b.trim()) !== null && _c !== void 0 ? _c : '';
switch (colName) {
case 'shares':
holder.shares = Number(value.replace(/[^0-9]/g, '')) || 0;
break;
case 'typeOfReportingPerson':
holder[colName] = value === '' ? null : value;
break;
case 'votingPowerSole':
case 'votingPowerShared':
case 'dispositivePowerSole':
case 'dispositivePowerShared':
holder[colName] = value.toLowerCase() === 'none' ? null : value;
break;
default:
holder[colName] = value;
}
};
for (var _i = 0, _e = Array.from(textMap.values()); _i < _e.length; _i++) {
var text = _e[_i];
_loop_1(text);
}
if (((_d = holders[holders.length - 1]) === null || _d === void 0 ? void 0 : _d.name) === '') {
holders.pop();
}
return { holders: holders };
}
exports.parseForm13g = parseForm13g;