sec-edgar-api
Version:
Fetch and parse SEC earnings reports and other filings. Useful for financial analysis.
139 lines (138 loc) • 6.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var HeaderParser = /** @class */ (function () {
function HeaderParser() {
}
HeaderParser.prototype.parse = function (xml) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
var header = xml.substring(xml.indexOf('<SEC-HEADER>'), xml.indexOf('</SEC-HEADER>') + 13);
var lines = header.split('\n').filter(function (line) { return line.trim().length > 0; });
var indexHead = lines.findIndex(function (line) { return line.startsWith('<SEC-HEADER>'); });
var indexAcceptanceDatetime = lines.findIndex(function (line) { return line.startsWith('<ACCEPTANCE-DATETIME>'); });
var filename = (_d = (_c = (_b = (_a = lines[indexHead]) === null || _a === void 0 ? void 0 : _a.split('<SEC-HEADER>')[1]) === null || _b === void 0 ? void 0 : _b.split(':')[0]) === null || _c === void 0 ? void 0 : _c.trim()) !== null && _d !== void 0 ? _d : '';
var acceptanceDatetime = (_g = (_f = (_e = lines[indexAcceptanceDatetime]) === null || _e === void 0 ? void 0 : _e.split('<ACCEPTANCE-DATETIME>')[1]) === null || _f === void 0 ? void 0 : _f.trim()) !== null && _g !== void 0 ? _g : '';
var object = {
'ACCESSION NUMBER': '',
'CONFORMED SUBMISSION TYPE': '',
'PUBLIC DOCUMENT COUNT': '',
'CONFORMED PERIOD OF REPORT': '',
'FILED AS OF DATE': '',
'DATE AS OF CHANGE': '',
// filer - companyData
'COMPANY CONFORMED NAME': '',
'CENTRAL INDEX KEY': '',
'STANDARD INDUSTRIAL CLASSIFICATION': '',
'IRS NUMBER': '',
'STATE OF INCORPORATION': '',
'FISCAL YEAR END': '',
// filer - filing values
'FORM TYPE': '',
'SEC ACT': '',
'SEC FILE NUMBER': '',
'FILM NUMBER': '',
// business address:
'BUSINESS ADDRESS': {
'STREET 1': '',
'STREET 2': '',
CITY: '',
STATE: '',
ZIP: '',
'BUSINESS PHONE': '',
},
'MAIL ADDRESS': {
'STREET 1': '',
'STREET 2': '',
CITY: '',
STATE: '',
ZIP: '',
},
'FORMER COMPANY': [],
};
var parentKey = null;
for (var i = 0; i < lines.length; i++) {
if (i === indexHead || i === indexAcceptanceDatetime) {
continue;
}
var _p = lines[i].split(':'), k = _p[0], v = _p[1];
var key = (_h = k === null || k === void 0 ? void 0 : k.trim()) !== null && _h !== void 0 ? _h : '';
var value = (_j = v === null || v === void 0 ? void 0 : v.trim()) !== null && _j !== void 0 ? _j : '';
if (key === '') {
parentKey = null;
}
// key === 'FORMER NAMES' || key === 'FILER'
if (key === 'BUSINESS ADDRESS' || key === 'MAIL ADDRESS') {
parentKey = key;
}
if (key === 'FORMER COMPANY') {
object[key].push({});
parentKey = 'FORMER COMPANY';
continue;
}
if (value === '' || key === '') {
continue;
}
if (parentKey === 'FORMER COMPANY') {
object[parentKey][object[parentKey].length - 1][key] = value;
}
else if (parentKey) {
object[parentKey][key] = value;
}
else {
object[key] = value;
}
}
var toDateStr = function (str) {
if (!str)
return '';
var year = str.slice(0, 4);
var month = str.slice(4, 6);
var day = str.slice(6, 8);
return "".concat(year, "-").concat(month, "-").concat(day);
};
var sicIndustryAndCode = object['STANDARD INDUSTRIAL CLASSIFICATION'];
return {
filename: filename,
acceptanceDatetime: acceptanceDatetime,
accessionNumber: object['ACCESSION NUMBER'],
submissionType: object['CONFORMED SUBMISSION TYPE'],
reportDate: toDateStr(object['CONFORMED PERIOD OF REPORT']),
filingDate: toDateStr(object['FILED AS OF DATE']),
form: object['FORM TYPE'],
dateAsOfChange: toDateStr(object['DATE AS OF CHANGE']),
companyName: object['COMPANY CONFORMED NAME'],
cik: Number(object['CENTRAL INDEX KEY']),
sic: ((_l = (_k = sicIndustryAndCode.split('[')[1]) === null || _k === void 0 ? void 0 : _k.split(']')[0]) !== null && _l !== void 0 ? _l : '0').trim(),
sicDescription: (_o = (_m = sicIndustryAndCode.split('[')[0]) === null || _m === void 0 ? void 0 : _m.trim()) !== null && _o !== void 0 ? _o : '',
irsNumber: object['IRS NUMBER'],
stateOfIncorporation: object['STATE OF INCORPORATION'],
fiscalYearEnd: object['FISCAL YEAR END'],
act: object['SEC ACT'],
fileNumber: object['SEC FILE NUMBER'],
filmNumber: object['FILM NUMBER'],
businessAddress: {
street1: object['BUSINESS ADDRESS']['STREET 1'],
street2: object['BUSINESS ADDRESS']['STREET 2'],
city: object['BUSINESS ADDRESS']['CITY'],
state: object['BUSINESS ADDRESS']['STATE'],
zip: object['BUSINESS ADDRESS']['ZIP'],
phone: object['BUSINESS ADDRESS']['BUSINESS PHONE'],
},
mailAddress: {
street1: object['MAIL ADDRESS']['STREET 1'],
street2: object['MAIL ADDRESS']['STREET 2'],
city: object['MAIL ADDRESS']['CITY'],
state: object['MAIL ADDRESS']['STATE'],
zip: object['MAIL ADDRESS']['ZIP'],
},
formerCompany: object['FORMER COMPANY'].map(function (data) {
var _a;
return ({
name: (_a = data['FORMER CONFORMED NAME']) !== null && _a !== void 0 ? _a : '',
dateOfNameChange: toDateStr(data['DATE OF NAME CHANGE']),
});
}),
};
};
return HeaderParser;
}());
exports.default = HeaderParser;