UNPKG

sec-edgar-api

Version:

Fetch and parse SEC earnings reports and other filings. Useful for financial analysis.

139 lines (138 loc) 6.45 kB
"use strict"; 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;