@chadwin/sdk 0.3.0 → 0.5.0
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/dist/index.cjs +26 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +188 -63
- package/dist/index.d.ts +188 -63
- package/dist/index.js +26 -31
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -355,7 +355,7 @@ var InstitutionalFilingFeed = class {
|
|
|
355
355
|
}
|
|
356
356
|
#request(filters, mode) {
|
|
357
357
|
return this.transport.request({
|
|
358
|
-
path: ["v1", "institutional-
|
|
358
|
+
path: ["v1", "institutional-filings", "feed"],
|
|
359
359
|
query: {
|
|
360
360
|
...mode,
|
|
361
361
|
forms: filters.forms?.join(","),
|
|
@@ -411,6 +411,24 @@ var CompanyReports = class {
|
|
|
411
411
|
]
|
|
412
412
|
});
|
|
413
413
|
}
|
|
414
|
+
getByFiscalPeriod({
|
|
415
|
+
ticker,
|
|
416
|
+
fiscalYear,
|
|
417
|
+
fiscalPeriod
|
|
418
|
+
}) {
|
|
419
|
+
return this.transport.request({
|
|
420
|
+
path: [
|
|
421
|
+
"v1",
|
|
422
|
+
"companies",
|
|
423
|
+
"US",
|
|
424
|
+
ticker,
|
|
425
|
+
"reports",
|
|
426
|
+
"quarterly",
|
|
427
|
+
String(fiscalYear),
|
|
428
|
+
fiscalPeriod
|
|
429
|
+
]
|
|
430
|
+
});
|
|
431
|
+
}
|
|
414
432
|
getHtml({
|
|
415
433
|
accessionNumber
|
|
416
434
|
}) {
|
|
@@ -509,7 +527,7 @@ var ProposedSales = class {
|
|
|
509
527
|
accessionNumber
|
|
510
528
|
}) {
|
|
511
529
|
return this.transport.request({
|
|
512
|
-
path: ["v1", "sec", "proposed-
|
|
530
|
+
path: ["v1", "sec", "proposed-sale-filings", accessionNumber]
|
|
513
531
|
});
|
|
514
532
|
}
|
|
515
533
|
};
|
|
@@ -566,7 +584,7 @@ var InstitutionalManagers = class {
|
|
|
566
584
|
query
|
|
567
585
|
}) {
|
|
568
586
|
return this.transport.request({
|
|
569
|
-
path: ["v1", "institutional-
|
|
587
|
+
path: ["v1", "institutional-managers", "search"],
|
|
570
588
|
query: { query }
|
|
571
589
|
});
|
|
572
590
|
}
|
|
@@ -577,7 +595,7 @@ var InstitutionalManagers = class {
|
|
|
577
595
|
limit
|
|
578
596
|
} = {}) {
|
|
579
597
|
return this.transport.request({
|
|
580
|
-
path: ["v1", "institutional-
|
|
598
|
+
path: ["v1", "institutional-managers"],
|
|
581
599
|
query: {
|
|
582
600
|
cik,
|
|
583
601
|
cursor,
|
|
@@ -590,25 +608,14 @@ var InstitutionalManagers = class {
|
|
|
590
608
|
form13fFileNumber
|
|
591
609
|
}) {
|
|
592
610
|
return this.transport.request({
|
|
593
|
-
path: [
|
|
594
|
-
"v1",
|
|
595
|
-
"institutional-holdings",
|
|
596
|
-
"managers",
|
|
597
|
-
form13fFileNumber
|
|
598
|
-
]
|
|
611
|
+
path: ["v1", "institutional-managers", form13fFileNumber]
|
|
599
612
|
});
|
|
600
613
|
}
|
|
601
614
|
listPeriods({
|
|
602
615
|
form13fFileNumber
|
|
603
616
|
}) {
|
|
604
617
|
return this.transport.request({
|
|
605
|
-
path: [
|
|
606
|
-
"v1",
|
|
607
|
-
"institutional-holdings",
|
|
608
|
-
"managers",
|
|
609
|
-
form13fFileNumber,
|
|
610
|
-
"periods"
|
|
611
|
-
]
|
|
618
|
+
path: ["v1", "institutional-managers", form13fFileNumber, "periods"]
|
|
612
619
|
});
|
|
613
620
|
}
|
|
614
621
|
listHoldings({
|
|
@@ -618,13 +625,7 @@ var InstitutionalManagers = class {
|
|
|
618
625
|
limit
|
|
619
626
|
}) {
|
|
620
627
|
return this.transport.request({
|
|
621
|
-
path: [
|
|
622
|
-
"v1",
|
|
623
|
-
"institutional-holdings",
|
|
624
|
-
"managers",
|
|
625
|
-
form13fFileNumber,
|
|
626
|
-
"holdings"
|
|
627
|
-
],
|
|
628
|
+
path: ["v1", "institutional-managers", form13fFileNumber, "holdings"],
|
|
628
629
|
query: { cursor, limit, period }
|
|
629
630
|
});
|
|
630
631
|
}
|
|
@@ -635,13 +636,7 @@ var InstitutionalManagers = class {
|
|
|
635
636
|
limit
|
|
636
637
|
}) {
|
|
637
638
|
return this.transport.request({
|
|
638
|
-
path: [
|
|
639
|
-
"v1",
|
|
640
|
-
"institutional-holdings",
|
|
641
|
-
"managers",
|
|
642
|
-
form13fFileNumber,
|
|
643
|
-
"positions"
|
|
644
|
-
],
|
|
639
|
+
path: ["v1", "institutional-managers", form13fFileNumber, "positions"],
|
|
645
640
|
query: { cursor, limit, period }
|
|
646
641
|
});
|
|
647
642
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/error.ts","../src/promise.ts","../src/internal/transport.ts","../src/resources/feeds.ts","../src/resources/products.ts","../src/client.ts"],"sourcesContent":["export { Chadwin, type ClientOptions } from \"./client\";\nexport { APIError } from \"./error\";\nexport type { PromiseWithResponse } from \"./promise\";\nexport type {\n CompanyReportFeedFilters,\n CompanyReportForm,\n InsiderActivityFeedFilters,\n InsiderActivityForm,\n InsiderTransactionCode,\n InsiderTransactionFeedFilters,\n InstitutionalFilingFeedFilters,\n InstitutionalFilingForm,\n InstitutionalHolding,\n InstitutionalManager,\n InstitutionalPosition,\n} from \"./types\";\n","export interface APIErrorOptions {\n status?: number;\n code?: string;\n headers?: Headers;\n}\n\nexport class APIError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly headers: Headers | undefined;\n\n constructor(message: string, options: APIErrorOptions = {}) {\n super(message);\n this.name = \"APIError\";\n this.status = options.status;\n this.code = options.code;\n this.headers = options.headers;\n }\n}\n","export interface PromiseWithResponse<T> extends Promise<T> {\n withResponse(): Promise<{ data: T; response: Response }>;\n}\n\nexport function createPromiseWithResponse<T>(\n response: Promise<{ data: T; response: Response }>,\n): PromiseWithResponse<T> {\n const promise = response.then(({ data }) => data) as PromiseWithResponse<T>;\n\n Object.defineProperty(promise, \"withResponse\", {\n value: () => response,\n });\n\n // A caller may consume only withResponse(). Mark this branch as handled while\n // preserving the original rejection for ordinary await and Promise chaining.\n void promise.catch(() => undefined);\n return promise;\n}\n","import { APIError } from \"../error\";\nimport {\n createPromiseWithResponse,\n type PromiseWithResponse,\n} from \"../promise\";\n\nexport const ATTEMPT_TIMEOUT_MS = 30_000;\nexport const MAX_RETRIES = 2;\nexport const BASE_RETRY_DELAY_MS = 250;\nexport const MAX_RETRY_DELAY_MS = 30_000;\n\nconst PRODUCTION_BASE_URL = \"https://api.chadwin.co\";\nconst INVALID_BASE_URL_MESSAGE =\n \"baseURL must be an HTTP or HTTPS URL without credentials, a query, or a fragment\";\nconst SAFE_ERROR_CODE = /^[a-z][a-z0-9_]{0,63}$/;\n\ntype QueryScalar = boolean | number | string;\n\nexport type QueryValue =\n | QueryScalar\n | readonly QueryScalar[]\n | null\n | undefined;\n\nexport interface TransportRequest {\n path: readonly string[];\n query?: Readonly<Record<string, QueryValue>>;\n responseType?: \"json\" | \"text\";\n}\n\ninterface HttpTransportOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n}\n\ninterface AttemptErrorResponse {\n code: string | undefined;\n response: Response;\n}\n\nclass AttemptFailure extends Error {\n constructor(readonly timedOut: boolean) {\n super(timedOut ? \"Request timed out\" : \"Network request failed\");\n }\n}\n\nexport class HttpTransport {\n readonly #apiKey: string;\n readonly #fetch: typeof fetch;\n readonly #baseURL: URL;\n\n constructor(options: HttpTransportOptions) {\n this.#apiKey = options.apiKey;\n this.#baseURL = normalizeBaseURL(options.baseURL ?? PRODUCTION_BASE_URL);\n this.#fetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n\n request<T>(request: TransportRequest): PromiseWithResponse<T> {\n return createPromiseWithResponse(this.#performRequest<T>(request));\n }\n\n async #performRequest<T>(\n request: TransportRequest,\n ): Promise<{ data: T; response: Response }> {\n const url = buildUrl(this.#baseURL, request);\n let lastFailureWasTimeout = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n let result: { data: T; response: Response } | AttemptErrorResponse;\n try {\n result = await this.#attempt<T>(url, request.responseType ?? \"json\");\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n if (!(error instanceof AttemptFailure)) {\n throw new APIError(\"API request failed\");\n }\n lastFailureWasTimeout = error.timedOut;\n if (attempt === MAX_RETRIES) {\n throw new APIError(\n lastFailureWasTimeout\n ? \"API request timed out\"\n : \"API request failed\",\n );\n }\n await wait(backoffDelay(attempt));\n continue;\n }\n\n if (\"data\" in result) {\n return result;\n }\n\n if (shouldRetry(result.response.status, result.code) && attempt < MAX_RETRIES) {\n await wait(retryDelay(result.response, attempt));\n continue;\n }\n\n throw errorFromResponse(result.response, result.code, this.#apiKey);\n }\n\n throw new APIError(\n lastFailureWasTimeout ? \"API request timed out\" : \"API request failed\",\n );\n }\n\n async #attempt<T>(\n url: URL,\n responseType: \"json\" | \"text\",\n ): Promise<{ data: T; response: Response } | AttemptErrorResponse> {\n const controller = new AbortController();\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, ATTEMPT_TIMEOUT_MS);\n\n try {\n let response: Response;\n try {\n response = await this.#fetch(url, {\n headers: {\n authorization: `Bearer ${this.#apiKey}`,\n },\n method: \"GET\",\n signal: controller.signal,\n });\n } catch {\n throw new AttemptFailure(timedOut);\n }\n\n if (!response.ok) {\n return {\n code: await readErrorCode(response, this.#apiKey),\n response,\n };\n }\n\n try {\n const data =\n responseType === \"text\"\n ? await response.text()\n : await response.json();\n return { data: data as T, response };\n } catch (error) {\n if (responseType === \"json\" && error instanceof SyntaxError) {\n throw new APIError(\"API returned an invalid JSON response\", {\n headers: safeErrorHeaders(response.headers, this.#apiKey),\n status: response.status,\n });\n }\n throw new APIError(\"API returned an invalid response body\", {\n headers: safeErrorHeaders(response.headers, this.#apiKey),\n status: response.status,\n });\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction normalizeBaseURL(value: string) {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new TypeError(INVALID_BASE_URL_MESSAGE);\n }\n if (\n (url.protocol !== \"http:\" && url.protocol !== \"https:\") ||\n url.username ||\n url.password ||\n url.href !== `${url.origin}${url.pathname}`\n ) {\n throw new TypeError(INVALID_BASE_URL_MESSAGE);\n }\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\")}/`;\n return url;\n}\n\nfunction buildUrl(baseURL: URL, request: TransportRequest) {\n const path = request.path.map((segment) => encodeURIComponent(segment)).join(\"/\");\n const url = new URL(path, baseURL);\n for (const [key, value] of Object.entries(request.query ?? {})) {\n if (value === undefined || value === null) continue;\n const values = Array.isArray(value) ? value : [value];\n for (const entry of values) {\n url.searchParams.append(key, String(entry));\n }\n }\n return url;\n}\n\nasync function readErrorCode(response: Response, apiKey: string) {\n try {\n const body: unknown = await response.json();\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof body.error === \"string\" &&\n body.error !== apiKey &&\n SAFE_ERROR_CODE.test(body.error)\n ) {\n return body.error;\n }\n } catch {\n // A missing or malformed error body falls back to the HTTP status.\n }\n return undefined;\n}\n\nfunction shouldRetry(status: number, code: string | undefined) {\n if (code === \"billing_period_quota_exceeded\") return false;\n return (\n code === \"rate_limited\" ||\n status === 502 ||\n status === 503 ||\n status === 504\n );\n}\n\nfunction retryDelay(response: Response, retry: number) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter === null) return backoffDelay(retry);\n\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1_000, MAX_RETRY_DELAY_MS);\n }\n\n const date = Date.parse(retryAfter);\n if (!Number.isNaN(date)) {\n return Math.min(Math.max(0, date - Date.now()), MAX_RETRY_DELAY_MS);\n }\n\n return backoffDelay(retry);\n}\n\nfunction backoffDelay(retry: number) {\n return Math.min(BASE_RETRY_DELAY_MS * 2 ** retry, MAX_RETRY_DELAY_MS);\n}\n\nfunction wait(milliseconds: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nfunction errorFromResponse(\n response: Response,\n code: string | undefined,\n apiKey: string,\n) {\n const suffix = code ? ` (${code})` : \"\";\n return new APIError(\n `API request failed with status ${response.status}${suffix}`,\n {\n ...(code === undefined ? {} : { code }),\n headers: safeErrorHeaders(response.headers, apiKey),\n status: response.status,\n },\n );\n}\n\nfunction safeErrorHeaders(headers: Headers, apiKey: string) {\n const safe = new Headers();\n for (const [name, value] of headers) {\n const normalizedName = name.toLowerCase();\n if (\n normalizedName === \"authorization\" ||\n normalizedName === \"cookie\" ||\n normalizedName === \"proxy-authorization\" ||\n normalizedName === \"set-cookie\" ||\n value.includes(apiKey)\n ) {\n continue;\n }\n safe.append(name, value);\n }\n return safe;\n}\n","import type { PromiseWithResponse } from \"../promise\";\nimport type {\n CompanyReportFeedFilters,\n InsiderActivityFeedFilters,\n InsiderTransactionFeedFilters,\n InstitutionalFilingFeedFilters,\n} from \"../types\";\nimport type { JsonResponse } from \"../internal/operations\";\nimport type { HttpTransport } from \"../internal/transport\";\n\nexport class Feeds {\n readonly companyReports: CompanyReportFeed;\n readonly insiderActivity: InsiderActivityFeed;\n readonly insiderTransactions: InsiderTransactionFeed;\n readonly institutionalFilings: InstitutionalFilingFeed;\n\n constructor(transport: HttpTransport) {\n this.companyReports = new CompanyReportFeed(transport);\n this.insiderActivity = new InsiderActivityFeed(transport);\n this.insiderTransactions = new InsiderTransactionFeed(transport);\n this.institutionalFilings = new InstitutionalFilingFeed(transport);\n }\n}\n\nclass CompanyReportFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: CompanyReportFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: CompanyReportFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: CompanyReportFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: CompanyReportFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"company-reports\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n\nclass InsiderActivityFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InsiderActivityFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InsiderActivityFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InsiderActivityFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InsiderActivityFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-activity\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n\nclass InsiderTransactionFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InsiderTransactionFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InsiderTransactionFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InsiderTransactionFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InsiderTransactionFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-transactions\", \"feed\"],\n query: {\n ...mode,\n limit: filters.limit,\n transaction_codes: filters.transactionCodes?.join(\",\"),\n },\n });\n }\n}\n\nclass InstitutionalFilingFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InstitutionalFilingFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InstitutionalFilingFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InstitutionalFilingFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InstitutionalFilingFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-holdings\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n","import type { PromiseWithResponse } from \"../promise\";\nimport type {\n InsiderTransactionCode,\n InstitutionalHolding,\n InstitutionalManager,\n InstitutionalPosition,\n} from \"../types\";\nimport type { JsonResponse, TextResponse } from \"../internal/operations\";\nimport type { HttpTransport } from \"../internal/transport\";\n\nexport class Companies {\n constructor(private readonly transport: HttpTransport) {}\n\n search({ query }: { query: string }): PromiseWithResponse<JsonResponse<\"searchCompanies\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", \"search\"],\n query: { query },\n });\n }\n\n get({ ticker }: { ticker: string }): PromiseWithResponse<JsonResponse<\"getCompany\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker],\n });\n }\n}\n\nexport class CompanyReports {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecCompanyReport\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"company-reports\", accessionNumber],\n });\n }\n\n getByFiscalYear({\n ticker,\n fiscalYear,\n }: {\n ticker: string;\n fiscalYear: number;\n }): PromiseWithResponse<JsonResponse<\"getCompanyReport\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"companies\",\n \"US\",\n ticker,\n \"reports\",\n \"annual\",\n String(fiscalYear),\n ],\n });\n }\n\n getHtml({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<TextResponse<\"getSecCompanyReportContent\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"sec\",\n \"company-reports\",\n accessionNumber,\n \"content.html\",\n ],\n responseType: \"text\",\n });\n }\n}\n\nexport class InsiderTransactions {\n constructor(private readonly transport: HttpTransport) {}\n\n list({\n from,\n until,\n tickers,\n transactionCodes,\n }: {\n from: string;\n until?: string;\n tickers?: string[];\n transactionCodes?: InsiderTransactionCode[];\n }): PromiseWithResponse<JsonResponse<\"listInsiderTransactions\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-transactions\"],\n query: {\n from,\n tickers: commaSeparated(tickers),\n transaction_codes: commaSeparated(transactionCodes),\n until,\n },\n });\n }\n\n listForCompany({\n ticker,\n from,\n until,\n transactionCodes,\n }: {\n ticker: string;\n from: string;\n until?: string;\n transactionCodes?: InsiderTransactionCode[];\n }): PromiseWithResponse<JsonResponse<\"listCompanyInsiderTransactions\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker, \"insider-transactions\"],\n query: {\n from,\n transaction_codes: commaSeparated(transactionCodes),\n until,\n },\n });\n }\n}\n\nexport class InsiderFilings {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecInsiderFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"insider-filings\", accessionNumber],\n });\n }\n}\n\nexport class ProposedSales {\n constructor(private readonly transport: HttpTransport) {}\n\n list({\n from,\n until,\n tickers,\n }: {\n from: string;\n until?: string;\n tickers?: string[];\n }): PromiseWithResponse<JsonResponse<\"listProposedSales\">> {\n return this.transport.request({\n path: [\"v1\", \"proposed-sales\"],\n query: {\n from,\n tickers: commaSeparated(tickers),\n until,\n },\n });\n }\n\n listForCompany({\n ticker,\n from,\n until,\n }: {\n ticker: string;\n from: string;\n until?: string;\n }): PromiseWithResponse<JsonResponse<\"listCompanyProposedSales\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker, \"proposed-sales\"],\n query: { from, until },\n });\n }\n\n getFiling({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecProposedSaleFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"proposed-sales\", accessionNumber],\n });\n }\n}\n\nexport class InstitutionalFilings {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecInstitutionalFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"institutional-filings\", accessionNumber],\n });\n }\n\n listHoldings({\n accessionNumber,\n cursor,\n limit,\n }: {\n accessionNumber: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listSecInstitutionalFilingHoldings\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"sec\",\n \"institutional-filings\",\n accessionNumber,\n \"holdings\",\n ],\n query: { cursor, limit },\n });\n }\n\n async *iterateHoldings({\n accessionNumber,\n limit,\n }: {\n accessionNumber: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalHolding> {\n let cursor: string | undefined;\n do {\n const page = await this.listHoldings({\n accessionNumber,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.holdings;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n}\n\nexport class InstitutionalManagers {\n constructor(private readonly transport: HttpTransport) {}\n\n search({\n query,\n }: {\n query: string;\n }): PromiseWithResponse<JsonResponse<\"searchInstitutionalHoldingManagers\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-holdings\", \"managers\", \"search\"],\n query: { query },\n });\n }\n\n list({\n cik,\n form13fFileNumber,\n cursor,\n limit,\n }: {\n cik?: string;\n form13fFileNumber?: string;\n cursor?: string;\n limit?: number;\n } = {}): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingManagers\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-holdings\", \"managers\"],\n query: {\n cik,\n cursor,\n form_13f_file_number: form13fFileNumber,\n limit,\n },\n });\n }\n\n get({\n form13fFileNumber,\n }: {\n form13fFileNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getInstitutionalHoldingManager\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"institutional-holdings\",\n \"managers\",\n form13fFileNumber,\n ],\n });\n }\n\n listPeriods({\n form13fFileNumber,\n }: {\n form13fFileNumber: string;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingManagerPeriods\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"institutional-holdings\",\n \"managers\",\n form13fFileNumber,\n \"periods\",\n ],\n });\n }\n\n listHoldings({\n form13fFileNumber,\n period,\n cursor,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingManagerHoldings\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"institutional-holdings\",\n \"managers\",\n form13fFileNumber,\n \"holdings\",\n ],\n query: { cursor, limit, period },\n });\n }\n\n listPositions({\n form13fFileNumber,\n period,\n cursor,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalHoldingManagerPositions\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"institutional-holdings\",\n \"managers\",\n form13fFileNumber,\n \"positions\",\n ],\n query: { cursor, limit, period },\n });\n }\n\n async *iterateManagers({\n cik,\n form13fFileNumber,\n limit,\n }: {\n cik?: string;\n form13fFileNumber?: string;\n limit?: number;\n } = {}): AsyncGenerator<InstitutionalManager> {\n let cursor: string | undefined;\n do {\n const page = await this.list({\n ...(cik === undefined ? {} : { cik }),\n ...(cursor === undefined ? {} : { cursor }),\n ...(form13fFileNumber === undefined ? {} : { form13fFileNumber }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.managers;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n\n async *iterateHoldings({\n form13fFileNumber,\n period,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalHolding> {\n let cursor: string | undefined;\n do {\n const page = await this.listHoldings({\n form13fFileNumber,\n period,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.holdings;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n\n async *iteratePositions({\n form13fFileNumber,\n period,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalPosition> {\n let cursor: string | undefined;\n do {\n const page = await this.listPositions({\n form13fFileNumber,\n period,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.positions;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n}\n\nfunction commaSeparated(values: readonly string[] | undefined) {\n return values?.join(\",\");\n}\n","import { HttpTransport } from \"./internal/transport\";\nimport { Feeds } from \"./resources/feeds\";\nimport {\n Companies,\n CompanyReports,\n InsiderFilings,\n InsiderTransactions,\n InstitutionalFilings,\n InstitutionalManagers,\n ProposedSales,\n} from \"./resources/products\";\n\nexport interface ClientOptions {\n apiKey: string;\n baseURL?: string;\n}\n\nexport class Chadwin {\n readonly companies: Companies;\n readonly companyReports: CompanyReports;\n readonly feeds: Feeds;\n readonly insiderFilings: InsiderFilings;\n readonly insiderTransactions: InsiderTransactions;\n readonly institutionalFilings: InstitutionalFilings;\n readonly institutionalManagers: InstitutionalManagers;\n readonly proposedSales: ProposedSales;\n\n constructor(options: ClientOptions) {\n if (\n !options ||\n typeof options.apiKey !== \"string\" ||\n options.apiKey.trim().length === 0\n ) {\n throw new TypeError(\"A non-empty Chadwin API key is required\");\n }\n\n const transport = new HttpTransport({\n apiKey: options.apiKey,\n ...(options.baseURL === undefined ? {} : { baseURL: options.baseURL }),\n });\n this.companies = new Companies(transport);\n this.companyReports = new CompanyReports(transport);\n this.feeds = new Feeds(transport);\n this.insiderFilings = new InsiderFilings(transport);\n this.insiderTransactions = new InsiderTransactions(transport);\n this.institutionalFilings = new InstitutionalFilings(transport);\n this.institutionalManagers = new InstitutionalManagers(transport);\n this.proposedSales = new ProposedSales(transport);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/error.ts","../src/promise.ts","../src/internal/transport.ts","../src/resources/feeds.ts","../src/resources/products.ts","../src/client.ts"],"sourcesContent":["export { Chadwin, type ClientOptions } from \"./client\";\nexport { APIError } from \"./error\";\nexport type { PromiseWithResponse } from \"./promise\";\nexport type {\n CompanyReportFeedFilters,\n CompanyReportFiscalPeriod,\n CompanyReportForm,\n InsiderActivityFeedFilters,\n InsiderActivityForm,\n InsiderTransactionCode,\n InsiderTransactionFeedFilters,\n InstitutionalFilingFeedFilters,\n InstitutionalFilingForm,\n InstitutionalHolding,\n InstitutionalManager,\n InstitutionalPosition,\n} from \"./types\";\n","export interface APIErrorOptions {\n status?: number;\n code?: string;\n headers?: Headers;\n}\n\nexport class APIError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly headers: Headers | undefined;\n\n constructor(message: string, options: APIErrorOptions = {}) {\n super(message);\n this.name = \"APIError\";\n this.status = options.status;\n this.code = options.code;\n this.headers = options.headers;\n }\n}\n","export interface PromiseWithResponse<T> extends Promise<T> {\n withResponse(): Promise<{ data: T; response: Response }>;\n}\n\nexport function createPromiseWithResponse<T>(\n response: Promise<{ data: T; response: Response }>,\n): PromiseWithResponse<T> {\n const promise = response.then(({ data }) => data) as PromiseWithResponse<T>;\n\n Object.defineProperty(promise, \"withResponse\", {\n value: () => response,\n });\n\n // A caller may consume only withResponse(). Mark this branch as handled while\n // preserving the original rejection for ordinary await and Promise chaining.\n void promise.catch(() => undefined);\n return promise;\n}\n","import { APIError } from \"../error\";\nimport {\n createPromiseWithResponse,\n type PromiseWithResponse,\n} from \"../promise\";\n\nexport const ATTEMPT_TIMEOUT_MS = 30_000;\nexport const MAX_RETRIES = 2;\nexport const BASE_RETRY_DELAY_MS = 250;\nexport const MAX_RETRY_DELAY_MS = 30_000;\n\nconst PRODUCTION_BASE_URL = \"https://api.chadwin.co\";\nconst INVALID_BASE_URL_MESSAGE =\n \"baseURL must be an HTTP or HTTPS URL without credentials, a query, or a fragment\";\nconst SAFE_ERROR_CODE = /^[a-z][a-z0-9_]{0,63}$/;\n\ntype QueryScalar = boolean | number | string;\n\nexport type QueryValue =\n | QueryScalar\n | readonly QueryScalar[]\n | null\n | undefined;\n\nexport interface TransportRequest {\n path: readonly string[];\n query?: Readonly<Record<string, QueryValue>>;\n responseType?: \"json\" | \"text\";\n}\n\ninterface HttpTransportOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n}\n\ninterface AttemptErrorResponse {\n code: string | undefined;\n response: Response;\n}\n\nclass AttemptFailure extends Error {\n constructor(readonly timedOut: boolean) {\n super(timedOut ? \"Request timed out\" : \"Network request failed\");\n }\n}\n\nexport class HttpTransport {\n readonly #apiKey: string;\n readonly #fetch: typeof fetch;\n readonly #baseURL: URL;\n\n constructor(options: HttpTransportOptions) {\n this.#apiKey = options.apiKey;\n this.#baseURL = normalizeBaseURL(options.baseURL ?? PRODUCTION_BASE_URL);\n this.#fetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n\n request<T>(request: TransportRequest): PromiseWithResponse<T> {\n return createPromiseWithResponse(this.#performRequest<T>(request));\n }\n\n async #performRequest<T>(\n request: TransportRequest,\n ): Promise<{ data: T; response: Response }> {\n const url = buildUrl(this.#baseURL, request);\n let lastFailureWasTimeout = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n let result: { data: T; response: Response } | AttemptErrorResponse;\n try {\n result = await this.#attempt<T>(url, request.responseType ?? \"json\");\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n if (!(error instanceof AttemptFailure)) {\n throw new APIError(\"API request failed\");\n }\n lastFailureWasTimeout = error.timedOut;\n if (attempt === MAX_RETRIES) {\n throw new APIError(\n lastFailureWasTimeout\n ? \"API request timed out\"\n : \"API request failed\",\n );\n }\n await wait(backoffDelay(attempt));\n continue;\n }\n\n if (\"data\" in result) {\n return result;\n }\n\n if (shouldRetry(result.response.status, result.code) && attempt < MAX_RETRIES) {\n await wait(retryDelay(result.response, attempt));\n continue;\n }\n\n throw errorFromResponse(result.response, result.code, this.#apiKey);\n }\n\n throw new APIError(\n lastFailureWasTimeout ? \"API request timed out\" : \"API request failed\",\n );\n }\n\n async #attempt<T>(\n url: URL,\n responseType: \"json\" | \"text\",\n ): Promise<{ data: T; response: Response } | AttemptErrorResponse> {\n const controller = new AbortController();\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, ATTEMPT_TIMEOUT_MS);\n\n try {\n let response: Response;\n try {\n response = await this.#fetch(url, {\n headers: {\n authorization: `Bearer ${this.#apiKey}`,\n },\n method: \"GET\",\n signal: controller.signal,\n });\n } catch {\n throw new AttemptFailure(timedOut);\n }\n\n if (!response.ok) {\n return {\n code: await readErrorCode(response, this.#apiKey),\n response,\n };\n }\n\n try {\n const data =\n responseType === \"text\"\n ? await response.text()\n : await response.json();\n return { data: data as T, response };\n } catch (error) {\n if (responseType === \"json\" && error instanceof SyntaxError) {\n throw new APIError(\"API returned an invalid JSON response\", {\n headers: safeErrorHeaders(response.headers, this.#apiKey),\n status: response.status,\n });\n }\n throw new APIError(\"API returned an invalid response body\", {\n headers: safeErrorHeaders(response.headers, this.#apiKey),\n status: response.status,\n });\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction normalizeBaseURL(value: string) {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new TypeError(INVALID_BASE_URL_MESSAGE);\n }\n if (\n (url.protocol !== \"http:\" && url.protocol !== \"https:\") ||\n url.username ||\n url.password ||\n url.href !== `${url.origin}${url.pathname}`\n ) {\n throw new TypeError(INVALID_BASE_URL_MESSAGE);\n }\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\")}/`;\n return url;\n}\n\nfunction buildUrl(baseURL: URL, request: TransportRequest) {\n const path = request.path.map((segment) => encodeURIComponent(segment)).join(\"/\");\n const url = new URL(path, baseURL);\n for (const [key, value] of Object.entries(request.query ?? {})) {\n if (value === undefined || value === null) continue;\n const values = Array.isArray(value) ? value : [value];\n for (const entry of values) {\n url.searchParams.append(key, String(entry));\n }\n }\n return url;\n}\n\nasync function readErrorCode(response: Response, apiKey: string) {\n try {\n const body: unknown = await response.json();\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof body.error === \"string\" &&\n body.error !== apiKey &&\n SAFE_ERROR_CODE.test(body.error)\n ) {\n return body.error;\n }\n } catch {\n // A missing or malformed error body falls back to the HTTP status.\n }\n return undefined;\n}\n\nfunction shouldRetry(status: number, code: string | undefined) {\n if (code === \"billing_period_quota_exceeded\") return false;\n return (\n code === \"rate_limited\" ||\n status === 502 ||\n status === 503 ||\n status === 504\n );\n}\n\nfunction retryDelay(response: Response, retry: number) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter === null) return backoffDelay(retry);\n\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1_000, MAX_RETRY_DELAY_MS);\n }\n\n const date = Date.parse(retryAfter);\n if (!Number.isNaN(date)) {\n return Math.min(Math.max(0, date - Date.now()), MAX_RETRY_DELAY_MS);\n }\n\n return backoffDelay(retry);\n}\n\nfunction backoffDelay(retry: number) {\n return Math.min(BASE_RETRY_DELAY_MS * 2 ** retry, MAX_RETRY_DELAY_MS);\n}\n\nfunction wait(milliseconds: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nfunction errorFromResponse(\n response: Response,\n code: string | undefined,\n apiKey: string,\n) {\n const suffix = code ? ` (${code})` : \"\";\n return new APIError(\n `API request failed with status ${response.status}${suffix}`,\n {\n ...(code === undefined ? {} : { code }),\n headers: safeErrorHeaders(response.headers, apiKey),\n status: response.status,\n },\n );\n}\n\nfunction safeErrorHeaders(headers: Headers, apiKey: string) {\n const safe = new Headers();\n for (const [name, value] of headers) {\n const normalizedName = name.toLowerCase();\n if (\n normalizedName === \"authorization\" ||\n normalizedName === \"cookie\" ||\n normalizedName === \"proxy-authorization\" ||\n normalizedName === \"set-cookie\" ||\n value.includes(apiKey)\n ) {\n continue;\n }\n safe.append(name, value);\n }\n return safe;\n}\n","import type { PromiseWithResponse } from \"../promise\";\nimport type {\n CompanyReportFeedFilters,\n InsiderActivityFeedFilters,\n InsiderTransactionFeedFilters,\n InstitutionalFilingFeedFilters,\n} from \"../types\";\nimport type { JsonResponse } from \"../internal/operations\";\nimport type { HttpTransport } from \"../internal/transport\";\n\nexport class Feeds {\n readonly companyReports: CompanyReportFeed;\n readonly insiderActivity: InsiderActivityFeed;\n readonly insiderTransactions: InsiderTransactionFeed;\n readonly institutionalFilings: InstitutionalFilingFeed;\n\n constructor(transport: HttpTransport) {\n this.companyReports = new CompanyReportFeed(transport);\n this.insiderActivity = new InsiderActivityFeed(transport);\n this.insiderTransactions = new InsiderTransactionFeed(transport);\n this.institutionalFilings = new InstitutionalFilingFeed(transport);\n }\n}\n\nclass CompanyReportFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: CompanyReportFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: CompanyReportFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: CompanyReportFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: CompanyReportFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listCompanyReportFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"company-reports\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n\nclass InsiderActivityFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InsiderActivityFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InsiderActivityFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InsiderActivityFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InsiderActivityFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInsiderActivityFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-activity\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n\nclass InsiderTransactionFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InsiderTransactionFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InsiderTransactionFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InsiderTransactionFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InsiderTransactionFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInsiderTransactionFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-transactions\", \"feed\"],\n query: {\n ...mode,\n limit: filters.limit,\n transaction_codes: filters.transactionCodes?.join(\",\"),\n },\n });\n }\n}\n\nclass InstitutionalFilingFeed {\n constructor(private readonly transport: HttpTransport) {}\n\n listLatest(\n filters: InstitutionalFilingFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalFilingFeed\">> {\n return this.#request(filters, {});\n }\n\n listAfter({\n cursor,\n ...filters\n }: InstitutionalFilingFeedFilters & {\n cursor: string;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalFilingFeed\">> {\n return this.#request(filters, { cursor });\n }\n\n startFromNow(\n filters: InstitutionalFilingFeedFilters = {},\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalFilingFeed\">> {\n return this.#request(filters, { start: \"now\" });\n }\n\n #request(\n filters: InstitutionalFilingFeedFilters,\n mode: { cursor?: string; start?: \"now\" },\n ): PromiseWithResponse<JsonResponse<\"listInstitutionalFilingFeed\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-filings\", \"feed\"],\n query: {\n ...mode,\n forms: filters.forms?.join(\",\"),\n limit: filters.limit,\n },\n });\n }\n}\n","import type { PromiseWithResponse } from \"../promise\";\nimport type {\n CompanyReportFiscalPeriod,\n InsiderTransactionCode,\n InstitutionalHolding,\n InstitutionalManager,\n InstitutionalPosition,\n} from \"../types\";\nimport type { JsonResponse, TextResponse } from \"../internal/operations\";\nimport type { HttpTransport } from \"../internal/transport\";\n\nexport class Companies {\n constructor(private readonly transport: HttpTransport) {}\n\n search({ query }: { query: string }): PromiseWithResponse<JsonResponse<\"searchCompanies\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", \"search\"],\n query: { query },\n });\n }\n\n get({ ticker }: { ticker: string }): PromiseWithResponse<JsonResponse<\"getCompany\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker],\n });\n }\n}\n\nexport class CompanyReports {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecCompanyReport\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"company-reports\", accessionNumber],\n });\n }\n\n getByFiscalYear({\n ticker,\n fiscalYear,\n }: {\n ticker: string;\n fiscalYear: number;\n }): PromiseWithResponse<JsonResponse<\"getCompanyReport\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"companies\",\n \"US\",\n ticker,\n \"reports\",\n \"annual\",\n String(fiscalYear),\n ],\n });\n }\n\n getByFiscalPeriod({\n ticker,\n fiscalYear,\n fiscalPeriod,\n }: {\n ticker: string;\n fiscalYear: number;\n fiscalPeriod: CompanyReportFiscalPeriod;\n }): PromiseWithResponse<JsonResponse<\"getCompanyReportForFiscalPeriod\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"companies\",\n \"US\",\n ticker,\n \"reports\",\n \"quarterly\",\n String(fiscalYear),\n fiscalPeriod,\n ],\n });\n }\n\n getHtml({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<TextResponse<\"getSecCompanyReportContent\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"sec\",\n \"company-reports\",\n accessionNumber,\n \"content.html\",\n ],\n responseType: \"text\",\n });\n }\n}\n\nexport class InsiderTransactions {\n constructor(private readonly transport: HttpTransport) {}\n\n list({\n from,\n until,\n tickers,\n transactionCodes,\n }: {\n from: string;\n until?: string;\n tickers?: string[];\n transactionCodes?: InsiderTransactionCode[];\n }): PromiseWithResponse<JsonResponse<\"listInsiderTransactions\">> {\n return this.transport.request({\n path: [\"v1\", \"insider-transactions\"],\n query: {\n from,\n tickers: commaSeparated(tickers),\n transaction_codes: commaSeparated(transactionCodes),\n until,\n },\n });\n }\n\n listForCompany({\n ticker,\n from,\n until,\n transactionCodes,\n }: {\n ticker: string;\n from: string;\n until?: string;\n transactionCodes?: InsiderTransactionCode[];\n }): PromiseWithResponse<JsonResponse<\"listCompanyInsiderTransactions\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker, \"insider-transactions\"],\n query: {\n from,\n transaction_codes: commaSeparated(transactionCodes),\n until,\n },\n });\n }\n}\n\nexport class InsiderFilings {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecInsiderFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"insider-filings\", accessionNumber],\n });\n }\n}\n\nexport class ProposedSales {\n constructor(private readonly transport: HttpTransport) {}\n\n list({\n from,\n until,\n tickers,\n }: {\n from: string;\n until?: string;\n tickers?: string[];\n }): PromiseWithResponse<JsonResponse<\"listProposedSales\">> {\n return this.transport.request({\n path: [\"v1\", \"proposed-sales\"],\n query: {\n from,\n tickers: commaSeparated(tickers),\n until,\n },\n });\n }\n\n listForCompany({\n ticker,\n from,\n until,\n }: {\n ticker: string;\n from: string;\n until?: string;\n }): PromiseWithResponse<JsonResponse<\"listCompanyProposedSales\">> {\n return this.transport.request({\n path: [\"v1\", \"companies\", \"US\", ticker, \"proposed-sales\"],\n query: { from, until },\n });\n }\n\n getFiling({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecProposedSaleFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"proposed-sale-filings\", accessionNumber],\n });\n }\n}\n\nexport class InstitutionalFilings {\n constructor(private readonly transport: HttpTransport) {}\n\n get({\n accessionNumber,\n }: {\n accessionNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getSecInstitutionalFiling\">> {\n return this.transport.request({\n path: [\"v1\", \"sec\", \"institutional-filings\", accessionNumber],\n });\n }\n\n listHoldings({\n accessionNumber,\n cursor,\n limit,\n }: {\n accessionNumber: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listSecInstitutionalFilingHoldings\">> {\n return this.transport.request({\n path: [\n \"v1\",\n \"sec\",\n \"institutional-filings\",\n accessionNumber,\n \"holdings\",\n ],\n query: { cursor, limit },\n });\n }\n\n async *iterateHoldings({\n accessionNumber,\n limit,\n }: {\n accessionNumber: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalHolding> {\n let cursor: string | undefined;\n do {\n const page = await this.listHoldings({\n accessionNumber,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.holdings;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n}\n\nexport class InstitutionalManagers {\n constructor(private readonly transport: HttpTransport) {}\n\n search({\n query,\n }: {\n query: string;\n }): PromiseWithResponse<JsonResponse<\"searchInstitutionalManagers\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\", \"search\"],\n query: { query },\n });\n }\n\n list({\n cik,\n form13fFileNumber,\n cursor,\n limit,\n }: {\n cik?: string;\n form13fFileNumber?: string;\n cursor?: string;\n limit?: number;\n } = {}): PromiseWithResponse<JsonResponse<\"listInstitutionalManagers\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\"],\n query: {\n cik,\n cursor,\n form_13f_file_number: form13fFileNumber,\n limit,\n },\n });\n }\n\n get({\n form13fFileNumber,\n }: {\n form13fFileNumber: string;\n }): PromiseWithResponse<JsonResponse<\"getInstitutionalManager\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\", form13fFileNumber],\n });\n }\n\n listPeriods({\n form13fFileNumber,\n }: {\n form13fFileNumber: string;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalManagerPeriods\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\", form13fFileNumber, \"periods\"],\n });\n }\n\n listHoldings({\n form13fFileNumber,\n period,\n cursor,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalManagerHoldings\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\", form13fFileNumber, \"holdings\"],\n query: { cursor, limit, period },\n });\n }\n\n listPositions({\n form13fFileNumber,\n period,\n cursor,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n cursor?: string;\n limit?: number;\n }): PromiseWithResponse<JsonResponse<\"listInstitutionalManagerPositions\">> {\n return this.transport.request({\n path: [\"v1\", \"institutional-managers\", form13fFileNumber, \"positions\"],\n query: { cursor, limit, period },\n });\n }\n\n async *iterateManagers({\n cik,\n form13fFileNumber,\n limit,\n }: {\n cik?: string;\n form13fFileNumber?: string;\n limit?: number;\n } = {}): AsyncGenerator<InstitutionalManager> {\n let cursor: string | undefined;\n do {\n const page = await this.list({\n ...(cik === undefined ? {} : { cik }),\n ...(cursor === undefined ? {} : { cursor }),\n ...(form13fFileNumber === undefined ? {} : { form13fFileNumber }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.managers;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n\n async *iterateHoldings({\n form13fFileNumber,\n period,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalHolding> {\n let cursor: string | undefined;\n do {\n const page = await this.listHoldings({\n form13fFileNumber,\n period,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.holdings;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n\n async *iteratePositions({\n form13fFileNumber,\n period,\n limit,\n }: {\n form13fFileNumber: string;\n period: string;\n limit?: number;\n }): AsyncGenerator<InstitutionalPosition> {\n let cursor: string | undefined;\n do {\n const page = await this.listPositions({\n form13fFileNumber,\n period,\n ...(cursor === undefined ? {} : { cursor }),\n ...(limit === undefined ? {} : { limit }),\n });\n yield* page.positions;\n cursor = page.next_cursor ?? undefined;\n } while (cursor !== undefined);\n }\n}\n\nfunction commaSeparated(values: readonly string[] | undefined) {\n return values?.join(\",\");\n}\n","import { HttpTransport } from \"./internal/transport\";\nimport { Feeds } from \"./resources/feeds\";\nimport {\n Companies,\n CompanyReports,\n InsiderFilings,\n InsiderTransactions,\n InstitutionalFilings,\n InstitutionalManagers,\n ProposedSales,\n} from \"./resources/products\";\n\nexport interface ClientOptions {\n apiKey: string;\n baseURL?: string;\n}\n\nexport class Chadwin {\n readonly companies: Companies;\n readonly companyReports: CompanyReports;\n readonly feeds: Feeds;\n readonly insiderFilings: InsiderFilings;\n readonly insiderTransactions: InsiderTransactions;\n readonly institutionalFilings: InstitutionalFilings;\n readonly institutionalManagers: InstitutionalManagers;\n readonly proposedSales: ProposedSales;\n\n constructor(options: ClientOptions) {\n if (\n !options ||\n typeof options.apiKey !== \"string\" ||\n options.apiKey.trim().length === 0\n ) {\n throw new TypeError(\"A non-empty Chadwin API key is required\");\n }\n\n const transport = new HttpTransport({\n apiKey: options.apiKey,\n ...(options.baseURL === undefined ? {} : { baseURL: options.baseURL }),\n });\n this.companies = new Companies(transport);\n this.companyReports = new CompanyReports(transport);\n this.feeds = new Feeds(transport);\n this.insiderFilings = new InsiderFilings(transport);\n this.insiderTransactions = new InsiderTransactions(transport);\n this.institutionalFilings = new InstitutionalFilings(transport);\n this.institutionalManagers = new InstitutionalManagers(transport);\n this.proposedSales = new ProposedSales(transport);\n }\n}\n"],"mappings":"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","names":[]}
|