sec-edgar-api 0.2.1 → 0.2.2

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.
Files changed (73) hide show
  1. package/README.md +3 -5
  2. package/build/services/DocumentParser/HtmlTableExtractor.d.ts +41 -0
  3. package/build/services/DocumentParser/HtmlTableExtractor.js +408 -0
  4. package/build/services/DocumentParser/XMLParser.d.ts +20 -5
  5. package/build/services/DocumentParser/XMLParser.js +122 -118
  6. package/build/services/DocumentParser/parsers/index.d.ts +5 -3
  7. package/build/services/DocumentParser/parsers/index.js +5 -3
  8. package/build/services/DocumentParser/parsers/parse-current-filings.d.ts +3 -0
  9. package/build/services/DocumentParser/parsers/parse-current-filings.js +98 -0
  10. package/build/services/DocumentParser/parsers/parse-form-13f.d.ts +6 -0
  11. package/build/services/DocumentParser/parsers/parse-form-13f.js +91 -0
  12. package/build/services/DocumentParser/parsers/parse-form-13g.js +2 -2
  13. package/build/services/DocumentParser/parsers/parse-form-4.d.ts +6 -1
  14. package/build/services/DocumentParser/parsers/parse-form-4.js +134 -204
  15. package/build/services/DocumentParser/parsers/parse-form-def14a.d.ts +1 -2
  16. package/build/services/DocumentParser/parsers/parse-form-def14a.js +157 -106
  17. package/build/services/ReportBuilder/FactFiscalCalculator.d.ts +47 -0
  18. package/build/services/ReportBuilder/FactFiscalCalculator.js +228 -0
  19. package/build/services/ReportBuilder/FactPeriodResolver.d.ts +44 -0
  20. package/build/services/ReportBuilder/FactPeriodResolver.js +185 -0
  21. package/build/services/ReportBuilder/FactRecordBuilder.d.ts +7 -0
  22. package/build/services/ReportBuilder/FactRecordBuilder.js +49 -0
  23. package/build/services/ReportBuilder/FactSplitAdjuster.d.ts +39 -0
  24. package/build/services/ReportBuilder/FactSplitAdjuster.js +192 -0
  25. package/build/services/ReportBuilder/ReportBuilder.d.ts +37 -0
  26. package/build/services/ReportBuilder/ReportBuilder.js +180 -0
  27. package/build/services/ReportBuilder/ReportRawResolvable.d.ts +17 -0
  28. package/build/services/ReportBuilder/ReportRawResolvable.js +114 -0
  29. package/build/services/ReportBuilder/index.d.ts +2 -0
  30. package/build/services/ReportBuilder/index.js +4 -0
  31. package/build/services/ReportParser/FactItem.d.ts +66 -0
  32. package/build/services/ReportParser/FactItem.js +50 -0
  33. package/build/services/ReportParser/FactItemFactory.d.ts +22 -0
  34. package/build/services/ReportParser/FactItemFactory.js +150 -0
  35. package/build/services/ReportParser/FactSplitMap.d.ts +16 -0
  36. package/build/services/ReportParser/FactSplitMap.js +101 -0
  37. package/build/services/ReportParser/PropertyResolver.d.ts +1 -0
  38. package/build/services/ReportParser/PropertyResolver.js +1 -0
  39. package/build/services/ReportParser/ReportParser.d.ts +3 -10
  40. package/build/services/ReportParser/ReportParser.js +8 -23
  41. package/build/services/ReportParser/ReportRawParser.d.ts +5 -28
  42. package/build/services/ReportParser/ReportRawParser.js +29 -141
  43. package/build/services/ReportParser/ReportWrapper.js +2 -5
  44. package/build/services/ReportParser/resolvers/index.d.ts +2 -0
  45. package/build/services/ReportParser/resolvers/index.js +2 -0
  46. package/build/services/ReportParser/resolvers/resolve-cash-flow-capex.js +4 -3
  47. package/build/services/ReportParser/resolvers/resolve-cash-flow-operating.js +1 -1
  48. package/build/services/ReportParser/resolvers/resolve-cash-flow-working-capital-non-cash.js +1 -1
  49. package/build/services/ReportParser/resolvers/resolve-expense-depreciation.js +1 -1
  50. package/build/services/ReportParser/resolvers/resolve-fiscal-year-cumulative-properties.js +28 -14
  51. package/build/services/ReportParser/resolvers/resolve-q4-fiscal-year-matching-properties.js +32 -4
  52. package/build/services/ReportParser/resolvers/resolve-split-ratio.d.ts +2 -0
  53. package/build/services/ReportParser/resolvers/resolve-split-ratio.js +37 -0
  54. package/build/services/SecEdgarApi/SecEdgarApi.d.ts +85 -47
  55. package/build/services/SecEdgarApi/SecEdgarApi.js +246 -108
  56. package/build/types/current-filings-xml.type.d.ts +74 -0
  57. package/build/types/current-filings-xml.type.js +6 -0
  58. package/build/types/current-filings.type.d.ts +44 -0
  59. package/build/types/current-filings.type.js +2 -0
  60. package/build/types/form-13f-xml.type.d.ts +105 -0
  61. package/build/types/form-13f-xml.type.js +2 -0
  62. package/build/types/form-4-xml.type.d.ts +132 -0
  63. package/build/types/form-4-xml.type.js +2 -0
  64. package/build/types/index.d.ts +2 -2
  65. package/build/types/index.js +2 -2
  66. package/build/types/parsed-filings.type.d.ts +144 -5
  67. package/build/types/report-raw.type.d.ts +4 -7
  68. package/build/types/report-translated.type.d.ts +1 -2
  69. package/build/types/submission.type.d.ts +3 -2
  70. package/build/util/calculation-map-by-ns.d.ts +6 -0
  71. package/build/util/calculation-map-by-ns.js +9 -0
  72. package/build/util/key-translations.js +1 -2
  73. package/package.json +5 -2
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var ReportRawResolvable_1 = require("./ReportRawResolvable");
4
+ var FactPeriodResolver = /** @class */ (function () {
5
+ function FactPeriodResolver(args) {
6
+ /** Values for each quarter [numQ1, numQ2, numQ3, numQ4] */
7
+ this.valueByQuarterByPropertyByYear = new Map();
8
+ /** Same as by quarter but string values */
9
+ this.valueByQuarterByPropertyByYearString = new Map();
10
+ /** Value sums (each includes sum of previous quarter). last el used for annual report. [sumQ1, sumQ2, sumQ3, sumFY] */
11
+ this.sumByQuarterByPropertyByYear = new Map();
12
+ /** Which properties have a range that need to be resolved to get quarterly value */
13
+ this.propertiesResolvableByYear = new Map();
14
+ /** all properties present for each year */
15
+ this.propertiesByYear = new Map();
16
+ /** prevent values from being added multiple times */
17
+ this.resolvedValues = new Set();
18
+ this.unresolvedReports = new Map();
19
+ var cik = args.cik;
20
+ this.cik = cik;
21
+ }
22
+ FactPeriodResolver.prototype.getOrSetBucketArr = function (map, year, propertyName) {
23
+ var _a, _b;
24
+ var propertyMap = (_a = map.get(year)) !== null && _a !== void 0 ? _a : map.set(year, new Map()).get(year);
25
+ return (_b = propertyMap.get(propertyName)) !== null && _b !== void 0 ? _b : propertyMap.set(propertyName, new Map()).get(propertyName);
26
+ };
27
+ FactPeriodResolver.prototype.addPropertyByYear = function (bucket, year, propertyName) {
28
+ var _a;
29
+ var properties = (_a = bucket.get(year)) !== null && _a !== void 0 ? _a : bucket.set(year, new Set()).get(year);
30
+ properties.add(propertyName);
31
+ };
32
+ FactPeriodResolver.prototype.resolveValues = function (propertyName, year) {
33
+ var _a, _b, _c;
34
+ var keyResolved = "".concat(year, "_").concat(propertyName);
35
+ var isResolved = this.resolvedValues.has(keyResolved);
36
+ var isResolvable = Boolean((_a = this.propertiesResolvableByYear.get(year)) === null || _a === void 0 ? void 0 : _a.has(propertyName));
37
+ if (!isResolvable || isResolved)
38
+ return;
39
+ var _d = this.getPropertyBuckets(year, propertyName), bucketQuarter = _d.bucketQuarter, bucketSum = _d.bucketSum;
40
+ if (bucketQuarter.size === 4 && bucketSum.has(3))
41
+ return;
42
+ for (var i = 0; i < 4; i++) {
43
+ var quarterValue = bucketQuarter.get(i);
44
+ var reportKey = "".concat(year, "_").concat(i + 1);
45
+ var unresolvedReport = this.unresolvedReports.get(reportKey);
46
+ var unresolvedReportPrev = this.unresolvedReports.get("".concat(year, "_").concat(i));
47
+ var sumValue = (_b = unresolvedReport === null || unresolvedReport === void 0 ? void 0 : unresolvedReport.getNumber(propertyName)) !== null && _b !== void 0 ? _b : 0;
48
+ var prevSum = (_c = unresolvedReportPrev === null || unresolvedReportPrev === void 0 ? void 0 : unresolvedReportPrev.getNumber(propertyName)) !== null && _c !== void 0 ? _c : 0;
49
+ if (quarterValue === undefined) {
50
+ var bucketQuarter_1 = this.getOrSetBucketArr(this.valueByQuarterByPropertyByYear, year, propertyName);
51
+ bucketQuarter_1.set(i, (Number(sumValue) || 0) - (Number(prevSum) || 0));
52
+ }
53
+ if (quarterValue !== undefined && sumValue === undefined) {
54
+ var bucketSum_1 = this.getOrSetBucketArr(this.sumByQuarterByPropertyByYear, year, propertyName);
55
+ bucketSum_1.set(i, quarterValue + prevSum);
56
+ }
57
+ }
58
+ this.resolvedValues.add(keyResolved);
59
+ };
60
+ FactPeriodResolver.prototype.get = function (propertyName, year, fiscalPeriod) {
61
+ var _a, _b;
62
+ this.resolveValues(propertyName, year);
63
+ var index = (_a = { Q1: 0, Q2: 1, Q3: 2, Q4: 3, FY: 3 }[fiscalPeriod]) !== null && _a !== void 0 ? _a : 4;
64
+ var isAnnual = fiscalPeriod === 'FY';
65
+ var bucket = isAnnual
66
+ ? this.sumByQuarterByPropertyByYear.get(year)
67
+ : this.valueByQuarterByPropertyByYear.get(year);
68
+ return (_b = bucket === null || bucket === void 0 ? void 0 : bucket.get(propertyName)) === null || _b === void 0 ? void 0 : _b.get(index);
69
+ };
70
+ FactPeriodResolver.prototype.getPropertyBuckets = function (year, propertyName) {
71
+ var _a, _b, _c, _d, _e, _f, _g;
72
+ var isInstant = !((_a = this.propertiesResolvableByYear.get(year)) === null || _a === void 0 ? void 0 : _a.has(propertyName));
73
+ var bucketQuarter = (_c = (_b = this.valueByQuarterByPropertyByYear.get(year)) === null || _b === void 0 ? void 0 : _b.get(propertyName)) !== null && _c !== void 0 ? _c : new Map();
74
+ var bucketSum = isInstant
75
+ ? bucketQuarter
76
+ : (_e = (_d = this.sumByQuarterByPropertyByYear.get(year)) === null || _d === void 0 ? void 0 : _d.get(propertyName)) !== null && _e !== void 0 ? _e : new Map();
77
+ var bucketString = (_g = (_f = this.valueByQuarterByPropertyByYearString.get(year)) === null || _f === void 0 ? void 0 : _f.get(propertyName)) !== null && _g !== void 0 ? _g : new Map();
78
+ return { bucketQuarter: bucketQuarter, bucketSum: bucketSum, bucketString: bucketString };
79
+ };
80
+ FactPeriodResolver.prototype.getPeriod = function (params) {
81
+ var start = params.start, end = params.end;
82
+ if (!start || start === end)
83
+ return 0;
84
+ var differenceMS = new Date(end).getTime() - new Date(start).getTime();
85
+ var differenceDays = differenceMS / 86400000;
86
+ if (differenceDays < 135)
87
+ return 3;
88
+ if (differenceDays < 225)
89
+ return 6;
90
+ if (differenceDays < 315)
91
+ return 9;
92
+ return 12;
93
+ };
94
+ FactPeriodResolver.prototype.getOrSetReport = function (params) {
95
+ var _a;
96
+ var year = params.year, quarter = params.quarter;
97
+ var key = "".concat(year, "_").concat(quarter);
98
+ var report = (_a = this.unresolvedReports.get(key)) !== null && _a !== void 0 ? _a : new ReportRawResolvable_1.default({
99
+ cik: this.cik,
100
+ fiscalYear: year,
101
+ fiscalPeriod: quarter === 4 ? 'FY' : "Q".concat(quarter),
102
+ dateReport: '',
103
+ dateFiled: '',
104
+ url: null,
105
+ splitDate: null,
106
+ splitRatio: null,
107
+ });
108
+ if (!this.unresolvedReports.has(key)) {
109
+ this.unresolvedReports.set(key, report);
110
+ }
111
+ return report;
112
+ };
113
+ FactPeriodResolver.prototype.add = function (params) {
114
+ var year = params.year, value = params.value, propertyName = params.name, quarter = params.quarter, start = params.start, end = params.end, dateReport = params.dateReport, dateFiled = params.dateFiled;
115
+ var period = this.getPeriod({ start: start, end: end });
116
+ this.addPropertyByYear(this.propertiesByYear, year, propertyName);
117
+ if (typeof value === 'string') {
118
+ var bucket = this.getOrSetBucketArr(this.valueByQuarterByPropertyByYearString, year, propertyName);
119
+ bucket.set(quarter - 1, value);
120
+ return;
121
+ }
122
+ if (period === 0) {
123
+ var bucket = this.getOrSetBucketArr(this.valueByQuarterByPropertyByYear, year, propertyName);
124
+ var bucketSum = this.getOrSetBucketArr(this.sumByQuarterByPropertyByYear, year, propertyName);
125
+ bucket.set(quarter - 1, value);
126
+ bucketSum.set(quarter - 1, value);
127
+ return;
128
+ }
129
+ if (period === 3) {
130
+ var bucket = this.getOrSetBucketArr(this.valueByQuarterByPropertyByYear, year, propertyName);
131
+ bucket.set(quarter - 1, value);
132
+ }
133
+ if (quarter === 1 || period > 3) {
134
+ var bucket = this.getOrSetBucketArr(this.sumByQuarterByPropertyByYear, year, propertyName);
135
+ bucket.set(quarter - 1, value);
136
+ }
137
+ this.addPropertyByYear(this.propertiesResolvableByYear, year, propertyName);
138
+ };
139
+ FactPeriodResolver.prototype.buildUnresolvedReports = function () {
140
+ var _this = this;
141
+ this.propertiesByYear.forEach(function (properties, year) {
142
+ properties.forEach(function (propertyName) {
143
+ var _a, _b;
144
+ for (var i = 0; i < 4; i++) {
145
+ var bucketSum = (_a = _this.sumByQuarterByPropertyByYear.get(year)) === null || _a === void 0 ? void 0 : _a.get(propertyName);
146
+ var bucketQuarter = _this.getOrSetBucketArr(_this.valueByQuarterByPropertyByYear, year, propertyName);
147
+ if (bucketSum && !bucketSum.has(i)) {
148
+ var prevSum = 0;
149
+ var quarterSum = 0;
150
+ for (var j = 0; j < i; j++) {
151
+ prevSum = quarterSum;
152
+ quarterSum = (_b = bucketSum.get(j)) !== null && _b !== void 0 ? _b : quarterSum;
153
+ }
154
+ bucketSum.set(i, quarterSum);
155
+ bucketQuarter.set(i, quarterSum - prevSum);
156
+ }
157
+ var value = bucketSum === null || bucketSum === void 0 ? void 0 : bucketSum.get(i);
158
+ if (value === undefined)
159
+ continue;
160
+ var report = _this.getOrSetReport({ year: year, quarter: i + 1 });
161
+ report.report[propertyName] = value;
162
+ }
163
+ });
164
+ });
165
+ };
166
+ FactPeriodResolver.prototype.forEach = function (callback) {
167
+ var _this = this;
168
+ this.buildUnresolvedReports();
169
+ this.propertiesByYear.forEach(function (properties, year) {
170
+ properties.forEach(function (propertyName) {
171
+ var _a;
172
+ _this.resolveValues(propertyName, year);
173
+ for (var i = 0; i < 5; i++) {
174
+ var isAnnual = i === 4;
175
+ var _b = _this.getPropertyBuckets(year, propertyName), bucketQuarter = _b.bucketQuarter, bucketSum = _b.bucketSum, bucketString = _b.bucketString;
176
+ var value = (_a = (isAnnual ? bucketSum.get(3) : bucketQuarter.get(i))) !== null && _a !== void 0 ? _a : bucketString.get(i);
177
+ var fiscalPeriod = isAnnual ? 'FY' : "Q".concat(i + 1);
178
+ callback({ year: year, fiscalPeriod: fiscalPeriod, propertyName: propertyName, value: value });
179
+ }
180
+ });
181
+ });
182
+ };
183
+ return FactPeriodResolver;
184
+ }());
185
+ exports.default = FactPeriodResolver;
@@ -0,0 +1,7 @@
1
+ import { FactItem } from './ReportBuilder';
2
+ import { CompanyFactListData } from '../../types';
3
+ export default class FactRecordBuilder {
4
+ createFacts(data: CompanyFactListData): {
5
+ facts: FactItem[];
6
+ };
7
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var FactRecordBuilder = /** @class */ (function () {
4
+ function FactRecordBuilder() {
5
+ }
6
+ FactRecordBuilder.prototype.createFacts = function (data) {
7
+ var facts = data.facts, cik = data.cik;
8
+ var factItems = [];
9
+ for (var prefix in facts) {
10
+ var factByPropertyName = facts[prefix];
11
+ for (var propertyName in factByPropertyName) {
12
+ var units = factByPropertyName[propertyName].units;
13
+ for (var unit in units) {
14
+ var factValues = units[unit];
15
+ for (var _i = 0, factValues_1 = factValues; _i < factValues_1.length; _i++) {
16
+ var factValue = factValues_1[_i];
17
+ var end = factValue.end, start = factValue.start, val = factValue.val, filed = factValue.filed, accn = factValue.accn, form = factValue.form, fp = factValue.fp, frame = factValue.frame, fy = factValue.fy;
18
+ var name_1 = "".concat(prefix, ":").concat(propertyName);
19
+ var item = {
20
+ cik: cik,
21
+ end: end,
22
+ filed: filed,
23
+ name: name_1,
24
+ unit: unit,
25
+ value: val,
26
+ accn: accn,
27
+ };
28
+ if (start)
29
+ item.start = start;
30
+ if (accn)
31
+ item.accn = accn;
32
+ if (form)
33
+ item.form = form;
34
+ if (fp)
35
+ item.fp = fp;
36
+ if (frame)
37
+ item.frame = frame;
38
+ if (fy)
39
+ item.fy = fy;
40
+ factItems.push(item);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return { facts: factItems };
46
+ };
47
+ return FactRecordBuilder;
48
+ }());
49
+ exports.default = FactRecordBuilder;
@@ -0,0 +1,39 @@
1
+ import { FiscalPeriod } from '../../types/report-raw.type';
2
+ import { FactItemWithFiscals } from './ReportBuilder';
3
+ interface SplitData {
4
+ end: string;
5
+ filed: string;
6
+ value: number;
7
+ firstFiled: string;
8
+ fiscalYear: number;
9
+ }
10
+ type FactItemWithFiscalsNumeric = Omit<FactItemWithFiscals, 'cik' | 'value'> & {
11
+ value: number;
12
+ };
13
+ export default class FactSplitAdjuster {
14
+ private readonly splitKey;
15
+ private readonly splitByFiscalYearAmount;
16
+ private readonly factsByYearQuarterByPropertyName;
17
+ private readonly factsAnnaulByYearByPropertyName;
18
+ private readonly resolvedProperties;
19
+ private sortedSplits;
20
+ private getMap;
21
+ add(fact: FactItemWithFiscalsNumeric): void;
22
+ getSplitsAsc(): SplitData[];
23
+ isSplitProperty(propertyName: string): boolean;
24
+ addSplitData(data: Omit<SplitData, 'firstFiled'>): void;
25
+ private didApplySplit;
26
+ isSplitAdjustableUnit(unit: string): boolean;
27
+ isShareRatioUnit(unit: string): boolean;
28
+ private getSortedFacts;
29
+ resolveProperty(propertyName: string): void;
30
+ get(propertyName: string, year: number, fiscalPeriod: FiscalPeriod): number | undefined;
31
+ forEach(callback: (params: {
32
+ propertyName: string;
33
+ year: number;
34
+ fiscalPeriod: FiscalPeriod;
35
+ value: number;
36
+ }) => void): void;
37
+ private adjustValuesForSplits;
38
+ }
39
+ export {};
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ var FactSplitAdjuster = /** @class */ (function () {
15
+ function FactSplitAdjuster() {
16
+ this.splitKey = 'StockholdersEquityNoteStockSplitConversionRatio1';
17
+ this.splitByFiscalYearAmount = new Map();
18
+ this.factsByYearQuarterByPropertyName = new Map();
19
+ this.factsAnnaulByYearByPropertyName = new Map();
20
+ this.resolvedProperties = new Set();
21
+ this.sortedSplits = null;
22
+ }
23
+ FactSplitAdjuster.prototype.getMap = function (map, propertyName) {
24
+ var _a;
25
+ return (_a = map.get(propertyName)) !== null && _a !== void 0 ? _a : map.set(propertyName, new Map()).get(propertyName);
26
+ };
27
+ FactSplitAdjuster.prototype.add = function (fact) {
28
+ var propertyName = fact.name, year = fact.year, fiscalPeriod = fact.fiscalPeriod, unit = fact.unit, filed = fact.filed, value = fact.value, end = fact.end;
29
+ if (this.isSplitProperty(propertyName)) {
30
+ this.addSplitData({ end: end, filed: filed, fiscalYear: year, value: Number(value) });
31
+ return;
32
+ }
33
+ if (!this.isSplitAdjustableUnit(unit))
34
+ return;
35
+ if (this.resolvedProperties.has(propertyName)) {
36
+ throw new Error("Property ".concat(propertyName, " has already been resolved"));
37
+ }
38
+ var isAnnual = fiscalPeriod === 'FY';
39
+ var map = isAnnual
40
+ ? this.getMap(this.factsAnnaulByYearByPropertyName, propertyName)
41
+ : this.getMap(this.factsByYearQuarterByPropertyName, propertyName);
42
+ var key = "".concat(year, "_").concat(fiscalPeriod);
43
+ map.set(key, fact);
44
+ };
45
+ FactSplitAdjuster.prototype.getSplitsAsc = function () {
46
+ if (this.sortedSplits)
47
+ return this.sortedSplits;
48
+ var sortedSplits = Array.from(this.splitByFiscalYearAmount.values()).sort(function (a, b) {
49
+ return a.filed < b.filed ? -1 : 1;
50
+ });
51
+ this.sortedSplits = sortedSplits;
52
+ return sortedSplits;
53
+ };
54
+ FactSplitAdjuster.prototype.isSplitProperty = function (propertyName) {
55
+ return propertyName === this.splitKey;
56
+ };
57
+ FactSplitAdjuster.prototype.addSplitData = function (data) {
58
+ var end = data.end, filed = data.filed, fiscalYear = data.fiscalYear, value = data.value;
59
+ var split = value;
60
+ var key = "".concat(fiscalYear, "-").concat(split);
61
+ var prevSplit = this.splitByFiscalYearAmount.get(key);
62
+ if (!prevSplit) {
63
+ this.splitByFiscalYearAmount.set(key, __assign(__assign({}, data), { firstFiled: filed }));
64
+ this.sortedSplits = null;
65
+ return;
66
+ }
67
+ var curEnd = end;
68
+ var curFiled = filed;
69
+ var prevEnd = prevSplit.end;
70
+ var prevFiled = prevSplit.filed;
71
+ var shouldUpdateFactItem = !prevSplit || prevEnd < curEnd || (prevEnd === curEnd && prevFiled > curFiled);
72
+ var shouldUpdateFirstFiled = prevFiled > curFiled;
73
+ if (shouldUpdateFactItem) {
74
+ var curData = this.splitByFiscalYearAmount.get(key);
75
+ curData.end = end;
76
+ curData.filed = filed;
77
+ curData.value = value;
78
+ curData.fiscalYear = fiscalYear;
79
+ this.sortedSplits = null;
80
+ }
81
+ if (shouldUpdateFirstFiled) {
82
+ var curData = this.splitByFiscalYearAmount.get(key);
83
+ curData.firstFiled = curFiled;
84
+ this.sortedSplits = null;
85
+ }
86
+ };
87
+ FactSplitAdjuster.prototype.didApplySplit = function (params) {
88
+ var nextValue = params.nextValue, prevValue = params.prevValue, split = params.split, isShareRatio = params.isShareRatio, value = params.value, filed = params.filed;
89
+ if (filed > split.filed) {
90
+ return true;
91
+ }
92
+ if (filed < split.firstFiled) {
93
+ return false;
94
+ }
95
+ var valWithSplit = isShareRatio ? value / split.value : value * split.value;
96
+ if (nextValue !== null) {
97
+ var difference = Math.abs(nextValue - value);
98
+ var differenceSplit = Math.abs(nextValue - valWithSplit);
99
+ return difference < differenceSplit;
100
+ }
101
+ if (prevValue !== null) {
102
+ var difference = Math.abs(prevValue - value);
103
+ var differenceSplit = Math.abs(prevValue - valWithSplit);
104
+ return difference < differenceSplit;
105
+ }
106
+ return false;
107
+ };
108
+ FactSplitAdjuster.prototype.isSplitAdjustableUnit = function (unit) {
109
+ return unit.toLowerCase().includes('share');
110
+ };
111
+ FactSplitAdjuster.prototype.isShareRatioUnit = function (unit) {
112
+ var unitLower = unit.toLowerCase();
113
+ return unitLower !== 'shares' && unitLower.includes('share'); // ex: USD/shares or USD-per-share
114
+ };
115
+ FactSplitAdjuster.prototype.getSortedFacts = function (propertyName, isAnnual) {
116
+ var _a, _b, _c;
117
+ var bucket = isAnnual ? this.factsAnnaulByYearByPropertyName : this.factsByYearQuarterByPropertyName;
118
+ var facts = Array.from((_b = (_a = bucket.get(propertyName)) === null || _a === void 0 ? void 0 : _a.values()) !== null && _b !== void 0 ? _b : []);
119
+ return (_c = facts.sort(function (a, b) { return (a.filed < b.filed ? -1 : 1); })) !== null && _c !== void 0 ? _c : [];
120
+ };
121
+ FactSplitAdjuster.prototype.resolveProperty = function (propertyName) {
122
+ if (this.resolvedProperties.has(propertyName))
123
+ return;
124
+ var factsAscQuarter = this.getSortedFacts(propertyName, false);
125
+ var factsAscAnnual = this.getSortedFacts(propertyName, true);
126
+ this.adjustValuesForSplits({ facts: factsAscQuarter });
127
+ this.adjustValuesForSplits({ facts: factsAscAnnual });
128
+ this.resolvedProperties.add(propertyName);
129
+ };
130
+ FactSplitAdjuster.prototype.get = function (propertyName, year, fiscalPeriod) {
131
+ var _a;
132
+ this.resolveProperty(propertyName);
133
+ var key = "".concat(year, "_").concat(fiscalPeriod);
134
+ var isAnnual = fiscalPeriod === 'FY';
135
+ var bucket = isAnnual ? this.factsAnnaulByYearByPropertyName : this.factsByYearQuarterByPropertyName;
136
+ var fact = (_a = bucket.get(propertyName)) === null || _a === void 0 ? void 0 : _a.get(key);
137
+ return fact === null || fact === void 0 ? void 0 : fact.value;
138
+ };
139
+ FactSplitAdjuster.prototype.forEach = function (callback) {
140
+ var _this = this;
141
+ this.factsByYearQuarterByPropertyName.forEach(function (factsByYearQuarter, propertyName) {
142
+ _this.resolveProperty(propertyName);
143
+ factsByYearQuarter.forEach(function (fact, key) {
144
+ var _a = key.split('_'), year = _a[0], fiscalPeriod = _a[1];
145
+ callback({ propertyName: propertyName, year: Number(year), fiscalPeriod: fiscalPeriod, value: Number(fact.value) });
146
+ });
147
+ });
148
+ this.factsAnnaulByYearByPropertyName.forEach(function (factsByYear, propertyName) {
149
+ _this.resolveProperty(propertyName);
150
+ factsByYear.forEach(function (fact, key) {
151
+ var _a = key.split('_'), year = _a[0], fiscalPeriod = _a[1];
152
+ callback({ propertyName: propertyName, year: Number(year), fiscalPeriod: fiscalPeriod, value: Number(fact.value) });
153
+ });
154
+ });
155
+ };
156
+ FactSplitAdjuster.prototype.adjustValuesForSplits = function (params) {
157
+ var _a, _b, _c, _d;
158
+ var facts = params.facts;
159
+ var splits = this.getSplitsAsc();
160
+ if (facts.length === 0 || splits.length === 0)
161
+ return;
162
+ var isShareRatio = this.isShareRatioUnit(facts[0].unit);
163
+ for (var splitIndex = splits.length - 1; splitIndex >= 0; splitIndex--) {
164
+ var split = splits[splitIndex];
165
+ for (var factIndex = facts.length - 1; factIndex >= 0; factIndex--) {
166
+ var fact = facts[factIndex];
167
+ var value = fact.value, filed = fact.filed;
168
+ var nextValue = (_b = (_a = facts[factIndex + 1]) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;
169
+ var prevValue = (_d = (_c = facts[factIndex - 1]) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;
170
+ var didApplySplit = this.didApplySplit({
171
+ filed: filed,
172
+ isShareRatio: isShareRatio,
173
+ nextValue: nextValue,
174
+ prevValue: prevValue,
175
+ split: split,
176
+ value: value,
177
+ });
178
+ if (didApplySplit) {
179
+ continue;
180
+ }
181
+ if (isShareRatio) {
182
+ fact.value /= split.value;
183
+ }
184
+ else {
185
+ fact.value *= split.value;
186
+ }
187
+ }
188
+ }
189
+ };
190
+ return FactSplitAdjuster;
191
+ }());
192
+ exports.default = FactSplitAdjuster;
@@ -0,0 +1,37 @@
1
+ import { CompanyFactListData, FiscalPeriod, ReportRaw } from '../../types';
2
+ import { SetReportDatesParams } from './FactFiscalCalculator';
3
+ export interface FactItem {
4
+ cik: number | string;
5
+ end: string;
6
+ filed: string;
7
+ name: string;
8
+ unit: string;
9
+ value: number | string;
10
+ start?: string;
11
+ hasSegments?: boolean;
12
+ accn?: string;
13
+ form?: string;
14
+ fp?: string;
15
+ frame?: string;
16
+ fy?: number;
17
+ /** For XBRL reports only */
18
+ segments?: {
19
+ value: string;
20
+ dimension: string;
21
+ }[];
22
+ uuid?: string;
23
+ }
24
+ export interface FactItemWithFiscals extends FactItem {
25
+ fiscalPeriod: FiscalPeriod;
26
+ year: number;
27
+ }
28
+ export default class ReportBuilder {
29
+ private readonly factRecordBuilder;
30
+ createFacts(companyFacts: CompanyFactListData): {
31
+ facts: FactItem[];
32
+ };
33
+ buildReports(params: {
34
+ facts: FactItem[];
35
+ reportDates?: SetReportDatesParams[];
36
+ }): ReportRaw[];
37
+ }