UNPKG

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
"use strict"; 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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