sec-edgar-api 0.0.5 → 0.0.7
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.
- package/README.md +9 -45
- package/build/index.d.ts +2 -7
- package/build/index.js +16 -8
- package/build/services/DocumentParser/DocumentParser.d.ts +16 -0
- package/build/services/DocumentParser/DocumentParser.js +22 -0
- package/build/services/DocumentParser/XMLNode/ColNode.d.ts +18 -0
- package/build/services/DocumentParser/XMLNode/ColNode.js +74 -0
- package/build/services/DocumentParser/XMLNode/DocumentNode.d.ts +3 -0
- package/build/services/DocumentParser/XMLNode/DocumentNode.js +27 -0
- package/build/services/DocumentParser/XMLNode/HRNode.d.ts +3 -0
- package/build/services/DocumentParser/XMLNode/HRNode.js +27 -0
- package/build/services/DocumentParser/XMLNode/NonTableNode.d.ts +3 -0
- package/build/services/DocumentParser/XMLNode/NonTableNode.js +27 -0
- package/build/services/DocumentParser/XMLNode/RowNode.d.ts +30 -0
- package/build/services/DocumentParser/XMLNode/RowNode.js +177 -0
- package/build/services/DocumentParser/XMLNode/TableNode.d.ts +20 -0
- package/build/services/DocumentParser/XMLNode/TableNode.js +132 -0
- package/build/services/DocumentParser/XMLNode/XMLNode.d.ts +37 -0
- package/build/services/DocumentParser/XMLNode/XMLNode.js +154 -0
- package/build/services/DocumentParser/XMLParser.d.ts +40 -0
- package/build/services/DocumentParser/XMLParser.js +306 -0
- package/build/services/DocumentParser/index.d.ts +2 -0
- package/build/services/DocumentParser/index.js +4 -0
- package/build/services/DocumentParser/parsers/index.d.ts +9 -0
- package/build/services/DocumentParser/parsers/index.js +11 -0
- package/build/services/DocumentParser/parsers/parse-form-10k.d.ts +3 -0
- package/build/services/DocumentParser/parsers/parse-form-10k.js +78 -0
- package/build/services/DocumentParser/parsers/parse-form-13g.d.ts +8 -0
- package/build/services/DocumentParser/parsers/parse-form-13g.js +88 -0
- package/build/services/DocumentParser/parsers/parse-form-4.d.ts +8 -0
- package/build/services/DocumentParser/parsers/parse-form-4.js +220 -0
- package/build/services/ReportParser/ReportParser.d.ts +2 -2
- package/build/services/ReportParser/ReportParser.js +8 -4
- package/build/services/SecEdgarApi/RequestWrapper.d.ts +37 -0
- package/build/services/SecEdgarApi/RequestWrapper.js +147 -0
- package/build/services/SecEdgarApi/SecEdgarApi.d.ts +156 -22
- package/build/services/SecEdgarApi/SecEdgarApi.js +314 -32
- package/build/types/common.type.d.ts +12 -0
- package/build/types/common.type.js +2 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.js +2 -0
- package/build/types/parsed-filings.type.d.ts +66 -0
- package/build/types/parsed-filings.type.js +2 -0
- package/build/types/submission.type.d.ts +19 -1
- package/package.json +1 -5
- package/build/.DS_Store +0 -0
- package/build/downloader.d.ts +0 -6
- package/build/downloader.js +0 -9
- package/build/services/FactFileReader/FactFileReader.d.ts +0 -30
- package/build/services/FactFileReader/FactFileReader.js +0 -36
- package/build/services/FactFileReader/index.d.ts +0 -2
- package/build/services/FactFileReader/index.js +0 -4
- package/build/services/FactsDownloader/Downloader.d.ts +0 -26
- package/build/services/FactsDownloader/Downloader.js +0 -102
- package/build/services/FactsDownloader/FactsDownloader.d.ts +0 -37
- package/build/services/FactsDownloader/FactsDownloader.js +0 -131
- package/build/services/FactsDownloader/Unzipper.d.ts +0 -40
- package/build/services/FactsDownloader/Unzipper.js +0 -40
- package/build/services/FactsDownloader/index.d.ts +0 -2
- package/build/services/FactsDownloader/index.js +0 -4
- package/build/services/SecEdgarApi/Client.d.ts +0 -44
- package/build/services/SecEdgarApi/Client.js +0 -104
- package/build/services/SecEdgarApi/Downloader.d.ts +0 -26
- package/build/services/SecEdgarApi/Downloader.js +0 -102
- package/build/services/SecEdgarApi/FactsDownloader.d.ts +0 -30
- package/build/services/SecEdgarApi/FactsDownloader.js +0 -124
- package/build/services/SecEdgarApi/SecConnector.d.ts +0 -47
- package/build/services/SecEdgarApi/SecConnector.js +0 -143
- package/build/services/SecEdgarApi/Unzipper.d.ts +0 -40
- package/build/services/SecEdgarApi/Unzipper.js +0 -40
package/build/types/index.d.ts
CHANGED
package/build/types/index.js
CHANGED
|
@@ -18,3 +18,5 @@ __exportStar(require("./company-facts.type"), exports);
|
|
|
18
18
|
__exportStar(require("./report-raw.type"), exports);
|
|
19
19
|
__exportStar(require("./report-translated.type"), exports);
|
|
20
20
|
__exportStar(require("./submission.type"), exports);
|
|
21
|
+
__exportStar(require("./parsed-filings.type"), exports);
|
|
22
|
+
__exportStar(require("./common.type"), exports);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
interface TransactionDescriptionByCode {
|
|
2
|
+
S: 'Sale';
|
|
3
|
+
V: 'Voluntary Reporting';
|
|
4
|
+
A: 'Grant';
|
|
5
|
+
D: 'Sale to Issuer';
|
|
6
|
+
F: 'Payment of Exercise Price';
|
|
7
|
+
I: 'Discretionary Transaction';
|
|
8
|
+
M: 'Conversion of Derivative Exempt';
|
|
9
|
+
C: 'Conversion of Derivative';
|
|
10
|
+
E: 'Expiration of Short Derivative Position';
|
|
11
|
+
H: 'Expiration of Long Derivative Position';
|
|
12
|
+
O: 'Exercise of out-of-the-money Derivative';
|
|
13
|
+
X: 'Exercise of in-the-money Derivative';
|
|
14
|
+
G: 'Gift';
|
|
15
|
+
L: 'Small Acquisition';
|
|
16
|
+
W: 'Acquisition or Disposition By Will or Laws';
|
|
17
|
+
Z: 'Voting Trust Deposit or Withdrawal';
|
|
18
|
+
J: 'Other Acquisition or Disposition';
|
|
19
|
+
K: 'Equity Swap';
|
|
20
|
+
U: 'Disposition Change in Control';
|
|
21
|
+
}
|
|
22
|
+
export type TransactionType = 'Acquire' | 'Dispose';
|
|
23
|
+
export type TransactionCode = keyof TransactionDescriptionByCode;
|
|
24
|
+
export type TransactionDescription = TransactionDescriptionByCode[TransactionCode];
|
|
25
|
+
export interface InsiderTransaction {
|
|
26
|
+
filerName: string;
|
|
27
|
+
filerPosition: string;
|
|
28
|
+
filerPositionTypes: string[];
|
|
29
|
+
securityType: string;
|
|
30
|
+
securityTypeUnderlying: string | null;
|
|
31
|
+
category: 'Derivative' | 'Non-Derivative';
|
|
32
|
+
date: string;
|
|
33
|
+
dateExecuted: string | null;
|
|
34
|
+
dateExpiration: string | null;
|
|
35
|
+
dateExercisable: string | null;
|
|
36
|
+
transactionDescription: string | null;
|
|
37
|
+
transactionCode: TransactionCode | null;
|
|
38
|
+
transactionType: TransactionType | null;
|
|
39
|
+
sharesEnding: number | null;
|
|
40
|
+
shares: number | null;
|
|
41
|
+
sharesUnderlying: number | null;
|
|
42
|
+
price: number | null;
|
|
43
|
+
priceExcercised: number | null;
|
|
44
|
+
ownership: string;
|
|
45
|
+
explainationByKey: Partial<Record<keyof InsiderTransaction, string>>;
|
|
46
|
+
}
|
|
47
|
+
export interface Holder {
|
|
48
|
+
name: string;
|
|
49
|
+
origin: string;
|
|
50
|
+
shares: number;
|
|
51
|
+
percentOfClass: string;
|
|
52
|
+
votingPowerSole: string | null;
|
|
53
|
+
votingPowerShared: string | null;
|
|
54
|
+
dispositivePowerSole: string | null;
|
|
55
|
+
dispositivePowerShared: string | null;
|
|
56
|
+
typeOfReportingPerson: string | null;
|
|
57
|
+
}
|
|
58
|
+
export interface TableData {
|
|
59
|
+
title: string;
|
|
60
|
+
textBefore: string | null;
|
|
61
|
+
textAfter: string | null;
|
|
62
|
+
hasHeader: boolean;
|
|
63
|
+
sectionIndex: number;
|
|
64
|
+
rows: (string | number | null)[][];
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
@@ -21,7 +21,7 @@ interface FileData {
|
|
|
21
21
|
filingFrom: string;
|
|
22
22
|
filingTo: string;
|
|
23
23
|
}
|
|
24
|
-
interface FilingListDetails {
|
|
24
|
+
export interface FilingListDetails {
|
|
25
25
|
accessionNumber: string[];
|
|
26
26
|
filingDate: string[];
|
|
27
27
|
reportDate: string[];
|
|
@@ -37,9 +37,27 @@ interface FilingListDetails {
|
|
|
37
37
|
primaryDocument: string[];
|
|
38
38
|
primaryDocDescription: string[];
|
|
39
39
|
}
|
|
40
|
+
export interface FilingListItemTranslated {
|
|
41
|
+
accessionNumber: string;
|
|
42
|
+
filingDate: string;
|
|
43
|
+
reportDate: string;
|
|
44
|
+
acceptanceDateTime: string;
|
|
45
|
+
act: string;
|
|
46
|
+
form: string;
|
|
47
|
+
fileNumber: string;
|
|
48
|
+
filmNumber: string;
|
|
49
|
+
items: string;
|
|
50
|
+
size: number;
|
|
51
|
+
isXBRL: number;
|
|
52
|
+
isInlineXBRL: number;
|
|
53
|
+
primaryDocument: string;
|
|
54
|
+
primaryDocDescription: string;
|
|
55
|
+
url: string;
|
|
56
|
+
}
|
|
40
57
|
interface FilingList {
|
|
41
58
|
recent: FilingListDetails;
|
|
42
59
|
files: FileData[];
|
|
60
|
+
recentTranslated?: FilingListItemTranslated[];
|
|
43
61
|
}
|
|
44
62
|
export interface SubmissionList {
|
|
45
63
|
cik: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sec-edgar-api",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
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)",
|
|
@@ -25,12 +25,8 @@
|
|
|
25
25
|
"earnings",
|
|
26
26
|
"reports"
|
|
27
27
|
],
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"unzipper": "^0.10.14"
|
|
30
|
-
},
|
|
31
28
|
"devDependencies": {
|
|
32
29
|
"@types/jest": "^29.5.2",
|
|
33
|
-
"@types/unzipper": "^0.10.6",
|
|
34
30
|
"jest": "^29.5.0",
|
|
35
31
|
"prettier": "^2.8.8",
|
|
36
32
|
"ts-jest": "^29.1.0",
|
package/build/.DS_Store
DELETED
|
Binary file
|
package/build/downloader.d.ts
DELETED
package/build/downloader.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.factsDownloader = void 0;
|
|
4
|
-
var FactsDownloader_1 = require("./services/FactsDownloader");
|
|
5
|
-
/**
|
|
6
|
-
* Downloads companyfacts.zip from sec.gov and extracts the directory
|
|
7
|
-
*/
|
|
8
|
-
var factsDownloader = new FactsDownloader_1.default();
|
|
9
|
-
exports.factsDownloader = factsDownloader;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { CompanyFactListData } from '../../types/company-facts.type';
|
|
2
|
-
interface FileManager {
|
|
3
|
-
readFileSync(path: string, encoding: string | object): string;
|
|
4
|
-
}
|
|
5
|
-
interface FactFileReaderArgs {
|
|
6
|
-
companyFactsDirname?: string;
|
|
7
|
-
cikBySymbol?: Record<string, number>;
|
|
8
|
-
fileManager?: FileManager;
|
|
9
|
-
}
|
|
10
|
-
interface ReadFactFileParams {
|
|
11
|
-
symbol: string;
|
|
12
|
-
companyFactsDirname: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Reads files from companyfacts folder from sec
|
|
16
|
-
*/
|
|
17
|
-
export default class FactFileReader {
|
|
18
|
-
private readonly fileManager;
|
|
19
|
-
private readonly cikBySymbol;
|
|
20
|
-
constructor(args?: FactFileReaderArgs);
|
|
21
|
-
getCikBySymbol(): Record<string, number>;
|
|
22
|
-
/**
|
|
23
|
-
* opens fact file from companyfacts directory
|
|
24
|
-
*
|
|
25
|
-
* @param symbol ex: AAPL
|
|
26
|
-
* @param companyFactsDirname ex: path.resolve(__dirname, './downloads/companyfacts')
|
|
27
|
-
*/
|
|
28
|
-
readFactFile(params: ReadFactFileParams): CompanyFactListData;
|
|
29
|
-
}
|
|
30
|
-
export {};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var fs = require("fs");
|
|
4
|
-
var cik_by_symbol_1 = require("../../util/cik-by-symbol");
|
|
5
|
-
/**
|
|
6
|
-
* Reads files from companyfacts folder from sec
|
|
7
|
-
*/
|
|
8
|
-
var FactFileReader = /** @class */ (function () {
|
|
9
|
-
function FactFileReader(args) {
|
|
10
|
-
var _a = args !== null && args !== void 0 ? args : {}, _b = _a.fileManager, fileManager = _b === void 0 ? fs : _b, _c = _a.cikBySymbol, cikBySymbol = _c === void 0 ? cik_by_symbol_1.default : _c;
|
|
11
|
-
this.fileManager = fileManager;
|
|
12
|
-
this.cikBySymbol = cikBySymbol;
|
|
13
|
-
}
|
|
14
|
-
FactFileReader.prototype.getCikBySymbol = function () {
|
|
15
|
-
return this.cikBySymbol;
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* opens fact file from companyfacts directory
|
|
19
|
-
*
|
|
20
|
-
* @param symbol ex: AAPL
|
|
21
|
-
* @param companyFactsDirname ex: path.resolve(__dirname, './downloads/companyfacts')
|
|
22
|
-
*/
|
|
23
|
-
FactFileReader.prototype.readFactFile = function (params) {
|
|
24
|
-
var _a;
|
|
25
|
-
var companyFactsDirname = params.companyFactsDirname, symbol = params.symbol;
|
|
26
|
-
var cik = (_a = this.cikBySymbol[symbol]) !== null && _a !== void 0 ? _a : null;
|
|
27
|
-
if (!cik) {
|
|
28
|
-
throw new Error("No cik found for symbol ".concat(symbol));
|
|
29
|
-
}
|
|
30
|
-
var cikStr = cik.toString().padStart(10, '0');
|
|
31
|
-
var result = this.fileManager.readFileSync("".concat(companyFactsDirname, "/CIK").concat(cikStr, ".json"), 'utf-8');
|
|
32
|
-
return JSON.parse(result);
|
|
33
|
-
};
|
|
34
|
-
return FactFileReader;
|
|
35
|
-
}());
|
|
36
|
-
exports.default = FactFileReader;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { WriteStream } from 'fs';
|
|
3
|
-
import { IClient, RequestParams } from '../Client';
|
|
4
|
-
export interface DownloadParams extends RequestParams {
|
|
5
|
-
filename: string;
|
|
6
|
-
createDirIfNotExists?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface IDownloader {
|
|
9
|
-
download(params: DownloadParams): Promise<boolean>;
|
|
10
|
-
}
|
|
11
|
-
interface FileManager {
|
|
12
|
-
createWriteStream(path: string): WriteStream;
|
|
13
|
-
existsSync(path: string): boolean;
|
|
14
|
-
mkdirSync(path: string): void;
|
|
15
|
-
}
|
|
16
|
-
interface DownloaderArgs {
|
|
17
|
-
client: IClient;
|
|
18
|
-
fileManager: FileManager;
|
|
19
|
-
}
|
|
20
|
-
export default class Downlaoder implements IDownloader {
|
|
21
|
-
private readonly client;
|
|
22
|
-
private readonly fileManager;
|
|
23
|
-
constructor(args?: DownloaderArgs);
|
|
24
|
-
download(params: DownloadParams): Promise<boolean>;
|
|
25
|
-
}
|
|
26
|
-
export {};
|
|
@@ -1,102 +0,0 @@
|
|
|
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
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
50
|
-
var t = {};
|
|
51
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
52
|
-
t[p] = s[p];
|
|
53
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
54
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
55
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
56
|
-
t[p[i]] = s[p[i]];
|
|
57
|
-
}
|
|
58
|
-
return t;
|
|
59
|
-
};
|
|
60
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
-
var fs = require("fs");
|
|
62
|
-
var Client_1 = require("../Client");
|
|
63
|
-
var Downlaoder = /** @class */ (function () {
|
|
64
|
-
function Downlaoder(args) {
|
|
65
|
-
if (args === void 0) { args = { client: new Client_1.default(), fileManager: fs }; }
|
|
66
|
-
var client = args.client, fileManager = args.fileManager;
|
|
67
|
-
this.client = client;
|
|
68
|
-
this.fileManager = fileManager;
|
|
69
|
-
}
|
|
70
|
-
Downlaoder.prototype.download = function (params) {
|
|
71
|
-
var _this = this;
|
|
72
|
-
var filename = params.filename, onSuccess = params.onSuccess, onError = params.onError, _a = params.createDirIfNotExists, createDirIfNotExists = _a === void 0 ? false : _a, rest = __rest(params, ["filename", "onSuccess", "onError", "createDirIfNotExists"]);
|
|
73
|
-
return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
74
|
-
var dir, file;
|
|
75
|
-
return __generator(this, function (_a) {
|
|
76
|
-
dir = filename.substring(0, filename.lastIndexOf('/'));
|
|
77
|
-
if (dir.length > 0 && createDirIfNotExists && !this.fileManager.existsSync(dir)) {
|
|
78
|
-
this.fileManager.mkdirSync(dir);
|
|
79
|
-
}
|
|
80
|
-
file = this.fileManager.createWriteStream(filename);
|
|
81
|
-
file.on('close', function () { return resolve(true); });
|
|
82
|
-
file.on('finish', function () { return file.close(); });
|
|
83
|
-
file.on('error', function (err) {
|
|
84
|
-
file.destroy();
|
|
85
|
-
onError === null || onError === void 0 ? void 0 : onError(err);
|
|
86
|
-
reject(false);
|
|
87
|
-
});
|
|
88
|
-
this.client
|
|
89
|
-
.request(__assign(__assign({ onError: onError }, rest), { onResponse: function (res) {
|
|
90
|
-
var _a;
|
|
91
|
-
res.pipe(file);
|
|
92
|
-
(_a = rest.onResponse) === null || _a === void 0 ? void 0 : _a.call(rest, res);
|
|
93
|
-
} }))
|
|
94
|
-
.then(function (res) { return onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(res); })
|
|
95
|
-
.catch(function () { return reject(false); });
|
|
96
|
-
return [2 /*return*/];
|
|
97
|
-
});
|
|
98
|
-
}); });
|
|
99
|
-
};
|
|
100
|
-
return Downlaoder;
|
|
101
|
-
}());
|
|
102
|
-
exports.default = Downlaoder;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { IDownloader } from './Downloader';
|
|
3
|
-
import Unzipper from './Unzipper';
|
|
4
|
-
interface FactsDownloaderArgs {
|
|
5
|
-
downloader: IDownloader;
|
|
6
|
-
unzipper: Unzipper;
|
|
7
|
-
}
|
|
8
|
-
interface OnChunkData {
|
|
9
|
-
percentComplete: number;
|
|
10
|
-
chunk: Buffer;
|
|
11
|
-
stage: 'download' | 'unzip';
|
|
12
|
-
}
|
|
13
|
-
export interface DownloadCompanyFactsDirectoryParams {
|
|
14
|
-
outputDirname: string;
|
|
15
|
-
unzip?: boolean;
|
|
16
|
-
onChunk?: (data: OnChunkData) => void;
|
|
17
|
-
onDownloadComplete?: () => void;
|
|
18
|
-
onComplete?: () => void;
|
|
19
|
-
onError?: (err: Error) => void;
|
|
20
|
-
}
|
|
21
|
-
export interface IFactsDownloader {
|
|
22
|
-
downloadCompanyFactsDirectory(params: DownloadCompanyFactsDirectoryParams): Promise<boolean>;
|
|
23
|
-
}
|
|
24
|
-
export default class FactsDownloader implements IFactsDownloader {
|
|
25
|
-
private readonly unzipper;
|
|
26
|
-
private readonly downloader;
|
|
27
|
-
constructor(args?: FactsDownloaderArgs);
|
|
28
|
-
/**
|
|
29
|
-
* Downloads the companyfacts.zip file and extracts the directory containing all company
|
|
30
|
-
* reports available from sec.gov. After downloading, you can use factFileReader and reportParser
|
|
31
|
-
* to get and read reports.
|
|
32
|
-
*
|
|
33
|
-
* Note: Over 15GB of data is downloaded and extracted.
|
|
34
|
-
*/
|
|
35
|
-
downloadCompanyFactsDirectory(params: DownloadCompanyFactsDirectoryParams): Promise<boolean>;
|
|
36
|
-
}
|
|
37
|
-
export {};
|
|
@@ -1,131 +0,0 @@
|
|
|
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
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
var Downloader_1 = require("./Downloader");
|
|
51
|
-
var Unzipper_1 = require("./Unzipper");
|
|
52
|
-
var FactsDownloader = /** @class */ (function () {
|
|
53
|
-
function FactsDownloader(args) {
|
|
54
|
-
if (args === void 0) { args = {
|
|
55
|
-
downloader: new Downloader_1.default(),
|
|
56
|
-
unzipper: new Unzipper_1.default(),
|
|
57
|
-
}; }
|
|
58
|
-
var unzipper = args.unzipper, downloader = args.downloader;
|
|
59
|
-
this.unzipper = unzipper;
|
|
60
|
-
this.downloader = downloader;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Downloads the companyfacts.zip file and extracts the directory containing all company
|
|
64
|
-
* reports available from sec.gov. After downloading, you can use factFileReader and reportParser
|
|
65
|
-
* to get and read reports.
|
|
66
|
-
*
|
|
67
|
-
* Note: Over 15GB of data is downloaded and extracted.
|
|
68
|
-
*/
|
|
69
|
-
FactsDownloader.prototype.downloadCompanyFactsDirectory = function (params) {
|
|
70
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
71
|
-
var outputDirname, onChunk, onDownloadComplete, onError, onComplete, _a, unzip;
|
|
72
|
-
var _this = this;
|
|
73
|
-
return __generator(this, function (_b) {
|
|
74
|
-
outputDirname = params.outputDirname, onChunk = params.onChunk, onDownloadComplete = params.onDownloadComplete, onError = params.onError, onComplete = params.onComplete, _a = params.unzip, unzip = _a === void 0 ? true : _a;
|
|
75
|
-
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
76
|
-
var filename, e_1;
|
|
77
|
-
return __generator(this, function (_a) {
|
|
78
|
-
switch (_a.label) {
|
|
79
|
-
case 0:
|
|
80
|
-
filename = "".concat(outputDirname, ".zip");
|
|
81
|
-
_a.label = 1;
|
|
82
|
-
case 1:
|
|
83
|
-
_a.trys.push([1, 5, , 6]);
|
|
84
|
-
// download from sec
|
|
85
|
-
return [4 /*yield*/, this.downloader.download({
|
|
86
|
-
url: 'https://www.sec.gov/Archives/edgar/daily-index/xbrl/companyfacts.zip',
|
|
87
|
-
filename: filename,
|
|
88
|
-
createDirIfNotExists: true,
|
|
89
|
-
resolveData: false,
|
|
90
|
-
headers: {
|
|
91
|
-
'Accept-Encoding': 'gzip, deflate',
|
|
92
|
-
},
|
|
93
|
-
onError: function (err) { return reject(err); },
|
|
94
|
-
onChunk: onChunk ? function (data) { return onChunk === null || onChunk === void 0 ? void 0 : onChunk(__assign(__assign({}, data), { stage: 'download' })); } : undefined,
|
|
95
|
-
})];
|
|
96
|
-
case 2:
|
|
97
|
-
// download from sec
|
|
98
|
-
_a.sent();
|
|
99
|
-
onDownloadComplete === null || onDownloadComplete === void 0 ? void 0 : onDownloadComplete();
|
|
100
|
-
if (!unzip) return [3 /*break*/, 4];
|
|
101
|
-
// unzip companyfacts.zip
|
|
102
|
-
return [4 /*yield*/, this.unzipper.unzip({
|
|
103
|
-
inputFilename: filename,
|
|
104
|
-
outputDirname: outputDirname,
|
|
105
|
-
deleteOriginal: true,
|
|
106
|
-
onError: function (err) { return reject(err); },
|
|
107
|
-
onChunk: onChunk ? function (data) { return onChunk === null || onChunk === void 0 ? void 0 : onChunk(__assign(__assign({}, data), { stage: 'unzip' })); } : undefined,
|
|
108
|
-
})];
|
|
109
|
-
case 3:
|
|
110
|
-
// unzip companyfacts.zip
|
|
111
|
-
_a.sent();
|
|
112
|
-
_a.label = 4;
|
|
113
|
-
case 4:
|
|
114
|
-
onComplete === null || onComplete === void 0 ? void 0 : onComplete();
|
|
115
|
-
resolve(true);
|
|
116
|
-
return [3 /*break*/, 6];
|
|
117
|
-
case 5:
|
|
118
|
-
e_1 = _a.sent();
|
|
119
|
-
onError === null || onError === void 0 ? void 0 : onError(e_1);
|
|
120
|
-
reject(e_1);
|
|
121
|
-
return [3 /*break*/, 6];
|
|
122
|
-
case 6: return [2 /*return*/];
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}); })];
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
return FactsDownloader;
|
|
130
|
-
}());
|
|
131
|
-
exports.default = FactsDownloader;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import { ReadStream } from 'fs';
|
|
5
|
-
import { ParseStream } from 'unzipper';
|
|
6
|
-
interface IFileManager {
|
|
7
|
-
createReadStream(path: string): ReadStream;
|
|
8
|
-
unlinkSync(path: string): void;
|
|
9
|
-
statSync(path: string): fs.Stats;
|
|
10
|
-
}
|
|
11
|
-
interface IFileUnzipper {
|
|
12
|
-
Extract(options: {
|
|
13
|
-
path: string;
|
|
14
|
-
}): ParseStream;
|
|
15
|
-
}
|
|
16
|
-
interface UnzipperArgs {
|
|
17
|
-
unzipper: IFileUnzipper;
|
|
18
|
-
fileManager: IFileManager;
|
|
19
|
-
}
|
|
20
|
-
interface OnChunkData {
|
|
21
|
-
percentComplete: number;
|
|
22
|
-
chunk: Buffer;
|
|
23
|
-
}
|
|
24
|
-
interface UnzipParams {
|
|
25
|
-
inputFilename: string;
|
|
26
|
-
outputDirname: string;
|
|
27
|
-
onChunk?: (data: OnChunkData) => void;
|
|
28
|
-
onError?: (err: Error) => void;
|
|
29
|
-
deleteOriginal?: boolean;
|
|
30
|
-
}
|
|
31
|
-
export interface IUnzipper {
|
|
32
|
-
unzip(params: UnzipParams): Promise<any>;
|
|
33
|
-
}
|
|
34
|
-
export default class Unzipper implements IUnzipper {
|
|
35
|
-
private readonly fileManager;
|
|
36
|
-
private readonly unzipper;
|
|
37
|
-
constructor(args?: UnzipperArgs);
|
|
38
|
-
unzip(params: UnzipParams): Promise<unknown>;
|
|
39
|
-
}
|
|
40
|
-
export {};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var fs = require("fs");
|
|
4
|
-
var _unzipper = require("unzipper");
|
|
5
|
-
var Unzipper = /** @class */ (function () {
|
|
6
|
-
function Unzipper(args) {
|
|
7
|
-
if (args === void 0) { args = { fileManager: fs, unzipper: _unzipper }; }
|
|
8
|
-
var fileManager = args.fileManager, unzipper = args.unzipper;
|
|
9
|
-
this.fileManager = fileManager;
|
|
10
|
-
this.unzipper = unzipper;
|
|
11
|
-
}
|
|
12
|
-
Unzipper.prototype.unzip = function (params) {
|
|
13
|
-
var _this = this;
|
|
14
|
-
var inputFilename = params.inputFilename, outputDirname = params.outputDirname, onChunk = params.onChunk, onError = params.onError, _a = params.deleteOriginal, deleteOriginal = _a === void 0 ? false : _a;
|
|
15
|
-
return new Promise(function (resolve, reject) {
|
|
16
|
-
var file = _this.fileManager.createReadStream(inputFilename);
|
|
17
|
-
var filesize = _this.fileManager.statSync(inputFilename).size;
|
|
18
|
-
var unzipped = _this.unzipper.Extract({ path: outputDirname });
|
|
19
|
-
var lengthCurrent = 0;
|
|
20
|
-
file.on('data', function (chunk) {
|
|
21
|
-
lengthCurrent += chunk.length;
|
|
22
|
-
var percentComplete = lengthCurrent / filesize;
|
|
23
|
-
onChunk === null || onChunk === void 0 ? void 0 : onChunk({ percentComplete: percentComplete, chunk: chunk });
|
|
24
|
-
});
|
|
25
|
-
file.pipe(unzipped);
|
|
26
|
-
file.on('end', function () {
|
|
27
|
-
if (deleteOriginal) {
|
|
28
|
-
_this.fileManager.unlinkSync(inputFilename);
|
|
29
|
-
}
|
|
30
|
-
resolve(true);
|
|
31
|
-
});
|
|
32
|
-
file.on('error', function (err) {
|
|
33
|
-
onError === null || onError === void 0 ? void 0 : onError(err);
|
|
34
|
-
reject(false);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
return Unzipper;
|
|
39
|
-
}());
|
|
40
|
-
exports.default = Unzipper;
|