sec-edgar-api 0.5.8 → 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import type { FactItemExtended, ReportRaw, XMLParams } from '../../../types';
1
+ import type { FactItemExtended, FiscalPeriod, ReportRaw, XMLParams } from '../../../types';
2
2
  import { GetDocumentXbrlParams } from '../../SecEdgarApi';
3
3
  import { XbrlParseResult } from '../XBRLParser/XBRLParser';
4
4
  interface ReportWithPeriod extends ReportRaw {
@@ -9,6 +9,8 @@ interface ReportWithPeriod extends ReportRaw {
9
9
  }
10
10
  export interface DocumentXbrlResult extends XbrlParseResult {
11
11
  report: ReportRaw | null;
12
+ fiscalYear: number;
13
+ fiscalPeriod: FiscalPeriod;
12
14
  facts: FactItemExtended[];
13
15
  xml: string;
14
16
  /** Facts grouped into reports by their start and end dates */
@@ -106,10 +106,12 @@ function buildReportsFromFacts(params) {
106
106
  var el = fact;
107
107
  var scale = Number((_q = el.scale) !== null && _q !== void 0 ? _q : 0) || 0;
108
108
  var decimals = Number((_r = el.decimals) !== null && _r !== void 0 ? _r : 0) || 0;
109
- var suffix = (_s = fact === null || fact === void 0 ? void 0 : fact.segments) === null || _s === void 0 ? void 0 : _s.map(function (_a) {
110
- var dimension = _a.dimension, value = _a.value;
111
- return "".concat(dimension).concat(pathSeparator).concat(value);
112
- }).join(pathSeparator);
109
+ var suffix = fact.name.includes(pathSeparator)
110
+ ? null
111
+ : (_s = fact === null || fact === void 0 ? void 0 : fact.segments) === null || _s === void 0 ? void 0 : _s.map(function (_a) {
112
+ var dimension = _a.dimension, value = _a.value;
113
+ return "".concat(dimension).concat(pathSeparator).concat(value);
114
+ }).join(pathSeparator);
113
115
  var nameKey = suffix ? "".concat(fact.name).concat(pathSeparator).concat(suffix) : fact.name;
114
116
  var roundPlaces = scale + decimals;
115
117
  var prevFactKey = "".concat(nameKey, "-").concat(dateKey);
@@ -148,11 +150,11 @@ function buildReportsFromFacts(params) {
148
150
  return { reportFocus: reportFocus, reportByDateRange: reportByDateRange, factsFiltered: Array.from(factByName.values()) };
149
151
  }
150
152
  function parseXbrl(params) {
151
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
153
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
152
154
  var parser = new XBRLParser_1.default();
153
- var xml = params.xml, _k = params.includeReport, includeReport = _k === void 0 ? true : _k, options = __rest(params, ["xml", "includeReport"]);
155
+ var xml = params.xml, _o = params.includeReport, includeReport = _o === void 0 ? true : _o, options = __rest(params, ["xml", "includeReport"]);
154
156
  var response = parser.parse(xml, options);
155
- var _l = (_b = (_a = response.instance) === null || _a === void 0 ? void 0 : _a.xbrl) !== null && _b !== void 0 ? _b : {}, _m = _l.contexts, contexts = _m === void 0 ? [] : _m, _o = _l.factElements, factElements = _o === void 0 ? [] : _o;
157
+ var _p = (_b = (_a = response.instance) === null || _a === void 0 ? void 0 : _a.xbrl) !== null && _b !== void 0 ? _b : {}, _q = _p.contexts, contexts = _q === void 0 ? [] : _q, _r = _p.factElements, factElements = _r === void 0 ? [] : _r;
156
158
  var contextById = new Map();
157
159
  contexts.forEach(function (context) { return contextById.set(context.id, context); });
158
160
  var cik = response.header.cik;
@@ -184,12 +186,31 @@ function parseXbrl(params) {
184
186
  }
185
187
  facts.push(factParsed);
186
188
  }
189
+ var fiscalPeriodFact = facts.find(function (f) { return f.name === 'dei:DocumentFiscalPeriodFocus'; });
190
+ var fiscalYearFact = facts.find(function (f) { return f.name === 'dei:DocumentFiscalYearFocus'; });
191
+ var fiscalYear = fiscalYearFact ? Number(fiscalYearFact.value) : 0;
192
+ var fiscalPeriod = fiscalPeriodFact ? fiscalPeriodFact.value : 'FY';
193
+ if (!fiscalPeriodFact || !fiscalYearFact) {
194
+ var fiscalCalculator = new FactFiscalCalculator_1.default({
195
+ fiscalYearEnd: {
196
+ day: Number(response.header.fiscalYearEnd.substring(2)),
197
+ month: Number(response.header.fiscalYearEnd.substring(0, 2)),
198
+ },
199
+ });
200
+ var reportDate = (_g = response.header.reportDate) !== null && _g !== void 0 ? _g : (_j = (_h = response.instance) === null || _h === void 0 ? void 0 : _h.xbrl.factElements.find(function (f) { return f.name === 'dei:DocumentPeriodEndDate'; })) === null || _j === void 0 ? void 0 : _j.text;
201
+ if (!reportDate) {
202
+ throw new Error("Report date not found. Unable to determine fiscal year and period. accn: ".concat(accessionNumber));
203
+ }
204
+ var _s = fiscalCalculator.getFiscalYearQuarter({ dateStr: reportDate !== null && reportDate !== void 0 ? reportDate : '' }), quarter = _s.quarter, year = _s.year;
205
+ fiscalYear = year;
206
+ fiscalPeriod = (quarter === 4 ? 'FY' : "Q".concat(quarter));
207
+ }
187
208
  var factsForBuilder = includeReport ? facts : [];
188
- var _p = buildReportsFromFacts({
209
+ var _t = buildReportsFromFacts({
189
210
  facts: factsForBuilder,
190
211
  pathSeparator: '>',
191
- fiscalPeriod: (_g = factsForBuilder.find(function (f) { return f.name === 'dei:DocumentFiscalPeriodFocus'; })) === null || _g === void 0 ? void 0 : _g.value,
192
- fiscalYear: Number((_j = (_h = factsForBuilder.find(function (f) { return f.name === 'dei:DocumentFiscalYearFocus'; })) === null || _h === void 0 ? void 0 : _h.value) !== null && _j !== void 0 ? _j : 0),
212
+ fiscalPeriod: (_k = factsForBuilder.find(function (f) { return f.name === 'dei:DocumentFiscalPeriodFocus'; })) === null || _k === void 0 ? void 0 : _k.value,
213
+ fiscalYear: Number((_m = (_l = factsForBuilder.find(function (f) { return f.name === 'dei:DocumentFiscalYearFocus'; })) === null || _l === void 0 ? void 0 : _l.value) !== null && _m !== void 0 ? _m : 0),
193
214
  cik: response.header.cik,
194
215
  filing: {
195
216
  acceptanceDateTime: response.header.acceptanceDatetime,
@@ -209,7 +230,7 @@ function parseXbrl(params) {
209
230
  url: "https://www.sec.gov/Archives/edgar/data/".concat(cik, "/").concat(accessionNumberNoHyphens, "/").concat(accessionNumber, ".txt"),
210
231
  urlPrimaryDocument: '',
211
232
  },
212
- }), factsFiltered = _p.factsFiltered, reportFocus = _p.reportFocus, reportByDateRange = _p.reportByDateRange;
213
- return __assign(__assign({}, response), { facts: factsFiltered, report: factsFiltered.length > 0 ? reportFocus : null, xml: xml, periodReports: Object.values(reportByDateRange) });
233
+ }), factsFiltered = _t.factsFiltered, reportFocus = _t.reportFocus, reportByDateRange = _t.reportByDateRange;
234
+ return __assign(__assign({}, response), { fiscalYear: fiscalYear, fiscalPeriod: fiscalPeriod, facts: factsFiltered, report: factsFiltered.length > 0 ? reportFocus : null, xml: xml, periodReports: Object.values(reportByDateRange) });
214
235
  }
215
236
  exports.parseXbrl = parseXbrl;
@@ -239,6 +239,9 @@ var FactFiscalCalculator = /** @class */ (function () {
239
239
  var _a;
240
240
  var dateStr = params.dateStr, endDateByYearProp = params.endDateByYear, fiscalYearEnd = params.fiscalYearEnd;
241
241
  var endDateByYear = endDateByYearProp !== null && endDateByYearProp !== void 0 ? endDateByYearProp : new Map();
242
+ if (!dateStr) {
243
+ throw new Error('No date provided, cannot determine fiscal year and quarter');
244
+ }
242
245
  if (fiscalYearEnd) {
243
246
  var month = fiscalYearEnd.month, day = fiscalYearEnd.day;
244
247
  var year = new Date().getFullYear();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sec-edgar-api",
3
- "version": "0.5.8",
3
+ "version": "0.5.10",
4
4
  "description": "Fetch and parse SEC earnings reports and other filings. Useful for financial analysis.",
5
5
  "main": "build/index.js",
6
6
  "author": "Andrew Evers (https://github.com/andyevers)",