earningscall
Version:
The EarningsCall JavaScript library provides convenient access to the EarningsCall API. It includes a pre-defined set of classes for API resources that initialize themselves dynamically from API responses.
266 lines • 20.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Company = void 0;
exports.getCompany = getCompany;
exports.lookupCompany = lookupCompany;
exports.getAllCompaniesInfos = getAllCompaniesInfos;
exports.getAllCompanies = getAllCompanies;
exports.getSP500Companies = getSP500Companies;
const api_1 = require("./api");
const camel_case_1 = require("./camel-case");
const errors_1 = require("./errors");
const symbols_1 = require("./symbols");
class Company {
companyInfo;
name;
events_;
constructor(companyInfo) {
this.companyInfo = companyInfo;
this.name = companyInfo.name;
this.events_ = undefined;
}
toString() {
return String(this.name);
}
/**
* Get the events for the company. Useful for getting the earnings events for a company.
*
* @returns A promise that resolves to an array of EarningsEvent objects.
*/
async getEvents() {
const rawResponse = await (0, api_1.getEvents)(this.companyInfo.exchange, this.companyInfo.symbol);
const responseAsRecord = rawResponse;
const camelCasedObject = (0, camel_case_1.camelCaseKeys)(responseAsRecord, { deep: true });
const eventsResponse = camelCasedObject;
this.events_ = eventsResponse.events;
return this.events_;
}
async events() {
return await this.getEvents();
}
validateTranscriptOptions(options) {
const { year, quarter } = options;
if (year === undefined || quarter === undefined) {
throw new Error('Must specify either event or year and quarter');
}
if (year < 1990 || year > 2030) {
throw new Error('Invalid year. Must be between 1990 and 2030');
}
if (![1, 2, 3, 4].includes(quarter)) {
throw new Error('Invalid quarter. Must be one of: {1,2,3,4}');
}
}
getOptions(options) {
if (options.event !== undefined) {
const event = options.event;
const { year, quarter } = event;
return { year, quarter };
}
const { year, quarter } = options;
return { year, quarter };
}
/**
* Retrieve a single transcript for this company. This is the basic transcript with no speaker groups.
*
* @param options - The options for getting a transcript.
* @returns A promise that resolves to a Transcript object or undefined if not found.
*/
async getBasicTranscript(options) {
const transcriptOptions = this.getOptions(options);
this.validateTranscriptOptions(transcriptOptions);
const { year, quarter } = transcriptOptions;
try {
const response = await (0, api_1.getTranscript)(this.companyInfo.exchange, this.companyInfo.symbol, year, quarter, 1);
const responseAsRecord = response;
const camelCasedObject = (0, camel_case_1.camelCaseKeys)(responseAsRecord, { deep: true });
const transcript = camelCasedObject;
return transcript;
}
catch (error) {
if (error instanceof errors_1.NotFoundError) {
return undefined; // Transcript not found
}
throw error;
}
}
handleEnhancedTranscriptDataError(error) {
if (error instanceof errors_1.InsufficientApiAccessError) {
const planName = error.response.headers.get('X-Plan-Name');
throw new errors_1.InsufficientApiAccessError(`Your plan (${planName}) does not include Enhanced Transcript Data. Upgrade your plan here: https://earningscall.biz/api-pricing`, error.response);
}
}
/**
* Retrieve a single transcript for this company with speaker groups.
*
* Requires an Enhanced Transcript Data plan.
*
* @param options - The options for getting a transcript.
* @returns A promise that resolves to a Transcript object or undefined if not found.
*/
async getSpeakerGroups(options) {
const transcriptOptions = this.getOptions(options);
this.validateTranscriptOptions(transcriptOptions);
const { year, quarter } = transcriptOptions;
try {
const response = await (0, api_1.getTranscript)(this.companyInfo.exchange, this.companyInfo.symbol, year, quarter, 2);
const responseAsRecord = response;
const camelCasedObject = (0, camel_case_1.camelCaseKeys)(responseAsRecord, { deep: true });
const transcript = camelCasedObject;
if (transcript.speakerNameMapV2) {
for (const speaker of transcript.speakers) {
const speakerLabel = speaker.speaker;
if (transcript.speakerNameMapV2[speakerLabel]) {
speaker.speakerInfo = transcript.speakerNameMapV2[speakerLabel];
}
}
}
return transcript;
}
catch (error) {
if (error instanceof errors_1.NotFoundError) {
return undefined; // Transcript not found
}
this.handleEnhancedTranscriptDataError(error);
throw error;
}
}
/**
* Retrieve a single transcript for this company with word level timestamps.
*
* Requires an Enhanced Transcript Data plan.
*
* @param options - The options for getting a transcript.
* @returns A promise that resolves to a TranscriptV3 object or undefined if not found.
*/
async getWordLevelTimestamps(options) {
const transcriptOptions = this.getOptions(options);
this.validateTranscriptOptions(transcriptOptions);
const { year, quarter } = transcriptOptions;
try {
const response = await (0, api_1.getTranscript)(this.companyInfo.exchange, this.companyInfo.symbol, year, quarter, 3);
const responseAsRecord = response;
const camelCasedObject = (0, camel_case_1.camelCaseKeys)(responseAsRecord, { deep: true });
const transcript = camelCasedObject;
return transcript;
}
catch (error) {
if (error instanceof errors_1.NotFoundError) {
return undefined; // Transcript not found
}
this.handleEnhancedTranscriptDataError(error);
throw error;
}
}
/**
* Retrieve a single transcript for this company with question and answer transcripts.
*
* Requires an Enhanced Transcript Data plan.
*
* @param options - The options for getting a transcript.
* @returns A promise that resolves to a TranscriptV4 object or undefined if not found.
*/
async getQuestionAndAnswerTranscript(options) {
const transcriptOptions = this.getOptions(options);
this.validateTranscriptOptions(transcriptOptions);
const { year, quarter } = transcriptOptions;
try {
const response = await (0, api_1.getTranscript)(this.companyInfo.exchange, this.companyInfo.symbol, year, quarter, 4);
const responseAsRecord = response;
const camelCasedObject = (0, camel_case_1.camelCaseKeys)(responseAsRecord, { deep: true });
const transcript = camelCasedObject;
return transcript;
}
catch (error) {
if (error instanceof errors_1.NotFoundError) {
return undefined; // Transcript not found
}
this.handleEnhancedTranscriptDataError(error);
throw error;
}
}
/**
* Downloads a single audio file for this company to disk.
*
* @param options - The options for getting an audio file.
* @returns A promise that resolves to a GetAudioFileResponse object.
*/
async downloadAudioFile(options) {
const { year, quarter, outputFilePath } = options;
try {
const response = await (0, api_1.downloadAudioFile)(this.companyInfo.exchange, this.companyInfo.symbol, year, quarter, outputFilePath);
return response;
}
catch (error) {
if (error instanceof errors_1.NotFoundError) {
return undefined;
}
throw error;
}
}
}
exports.Company = Company;
/**
* Get a company by symbol and optionally, exchange.
*
* @param options - The options for getting a company.
* @returns A promise that resolves to a Company object.
*/
async function getCompany(options) {
const companyInfo = await lookupCompany(options);
if (!companyInfo) {
throw new Error(`Symbol not found: ${options.symbol}`);
}
return new Company(companyInfo);
}
async function lookupCompany(options) {
const { exchange, symbol } = options;
const symbols = await (0, symbols_1.getSymbols)();
if (exchange) {
return symbols.get(exchange.toUpperCase(), symbol.toUpperCase());
}
for (const exchange of symbols_1.EXCHANGES_IN_ORDER) {
const info = symbols.get(exchange, symbol.toUpperCase());
if (info) {
return info;
}
}
if ((0, api_1.isDemoAccount)()) {
throw new errors_1.MissingApiKeyError(`"${symbol}" requires an API Key for access. To get your API Key, ` +
'see: https://earningscall.biz/api-pricing');
}
return undefined;
}
async function getAllCompaniesInfos() {
const symbols = await (0, symbols_1.getSymbols)();
return Array.from(symbols.getAll());
}
/**
* Get all companies.
*
* @returns A promise that resolves to an array of Company objects.
*/
async function getAllCompanies() {
const infos = await getAllCompaniesInfos();
return infos.map((info) => new Company(info));
}
/**
* Get all S&P 500 companies.
*
* @returns A promise that resolves to an array of Company objects.
*/
async function getSP500Companies() {
const sp500CompaniesTxtFile = await (0, api_1.getSp500CompaniesTxtFile)();
const symbols = sp500CompaniesTxtFile.split('\n').map((line) => line.trim());
const companyPromises = symbols.map(async (symbol) => {
try {
return await getCompany({ symbol });
}
catch (error) {
return null;
}
});
const results = await Promise.all(companyPromises);
// Filter out null values and explicitly type as Company[]
return results.filter((company) => company !== null);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFueS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29tcGFueS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErUkEsZ0NBTUM7QUFFRCxzQ0F3QkM7QUFFRCxvREFHQztBQU9ELDBDQUdDO0FBT0QsOENBYUM7QUFuVkQsK0JBTWU7QUFDZiw2Q0FBNkM7QUFDN0MscUNBSWtCO0FBRWxCLHVDQUEyRDtBQUUzRCxNQUFhLE9BQU87SUFDVCxXQUFXLENBQWM7SUFDekIsSUFBSSxDQUFVO0lBQ2YsT0FBTyxDQUFtQjtJQUVsQyxZQUFZLFdBQXdCO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxTQUFTO1FBQ3JCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxlQUFTLEVBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBc0MsQ0FBQztRQUNoRSxNQUFNLGdCQUFnQixHQUFHLElBQUEsMEJBQWEsRUFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sY0FBYyxHQUFHLGdCQUFrQyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFN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