@fhirfly-io/terminology 0.1.5 → 0.2.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 CHANGED
@@ -189,6 +189,26 @@ var HttpClient = class {
189
189
  const queryString = params.toString();
190
190
  return queryString ? `?${queryString}` : "";
191
191
  }
192
+ /**
193
+ * Build query string from search params object.
194
+ */
195
+ buildSearchQueryString(params) {
196
+ const searchParams = new URLSearchParams();
197
+ for (const [key, value] of Object.entries(params)) {
198
+ if (value === void 0 || value === null) continue;
199
+ if (typeof value === "boolean") {
200
+ searchParams.set(key, value.toString());
201
+ } else if (typeof value === "number") {
202
+ searchParams.set(key, value.toString());
203
+ } else if (typeof value === "string" && value.length > 0) {
204
+ searchParams.set(key, value);
205
+ } else if (Array.isArray(value) && value.length > 0) {
206
+ searchParams.set(key, value.join(","));
207
+ }
208
+ }
209
+ const queryString = searchParams.toString();
210
+ return queryString ? `?${queryString}` : "";
211
+ }
192
212
  /**
193
213
  * Parse error response from API.
194
214
  */
@@ -342,6 +362,14 @@ var HttpClient = class {
342
362
  const response = await this.request("POST", `${endpoint}${queryString}`, body);
343
363
  return response.data;
344
364
  }
365
+ /**
366
+ * Make a GET request with search parameters.
367
+ */
368
+ async search(endpoint, params) {
369
+ const queryString = this.buildSearchQueryString(params);
370
+ const response = await this.request("GET", `${endpoint}${queryString}`);
371
+ return response.data;
372
+ }
345
373
  };
346
374
 
347
375
  // src/endpoints/ndc.ts
@@ -396,6 +424,38 @@ var NdcEndpoint = class {
396
424
  options
397
425
  );
398
426
  }
427
+ /**
428
+ * Search for NDC products.
429
+ *
430
+ * @param params - Search parameters (q, name, brand, ingredient, etc.)
431
+ * @param options - Pagination and response shape options
432
+ * @returns Search results with facets
433
+ *
434
+ * @example
435
+ * ```ts
436
+ * // Search by drug name
437
+ * const results = await client.ndc.search({ q: "advil" });
438
+ *
439
+ * // Search with filters
440
+ * const results = await client.ndc.search({
441
+ * ingredient: "ibuprofen",
442
+ * dosage_form: "TABLET",
443
+ * product_type: "otc"
444
+ * });
445
+ *
446
+ * console.log(`Found ${results.total} products`);
447
+ * for (const item of results.items) {
448
+ * console.log(item.product_name);
449
+ * }
450
+ * ```
451
+ */
452
+ async search(params, options) {
453
+ return this.http.search("/v1/ndc/search", {
454
+ ...params,
455
+ ...options,
456
+ include: options?.include?.join(",")
457
+ });
458
+ }
399
459
  };
400
460
 
401
461
  // src/endpoints/npi.ts
@@ -441,6 +501,35 @@ var NpiEndpoint = class {
441
501
  options
442
502
  );
443
503
  }
504
+ /**
505
+ * Search for healthcare providers.
506
+ *
507
+ * @param params - Search parameters (q, name, specialty, state, etc.)
508
+ * @param options - Pagination and response shape options
509
+ * @returns Search results with facets
510
+ *
511
+ * @example
512
+ * ```ts
513
+ * // Search by name
514
+ * const results = await client.npi.search({ q: "smith" });
515
+ *
516
+ * // Search with filters
517
+ * const results = await client.npi.search({
518
+ * specialty: "cardiology",
519
+ * state: "CA",
520
+ * entity_type: "individual"
521
+ * });
522
+ *
523
+ * console.log(`Found ${results.total} providers`);
524
+ * ```
525
+ */
526
+ async search(params, options) {
527
+ return this.http.search("/v1/npi/search", {
528
+ ...params,
529
+ ...options,
530
+ include: options?.include?.join(",")
531
+ });
532
+ }
444
533
  };
445
534
 
446
535
  // src/endpoints/rxnorm.ts
@@ -478,6 +567,32 @@ var RxNormEndpoint = class {
478
567
  options
479
568
  );
480
569
  }
570
+ /**
571
+ * Search for drugs in RxNorm.
572
+ *
573
+ * @param params - Search parameters (q, name, ingredient, brand, etc.)
574
+ * @param options - Pagination and response shape options
575
+ * @returns Search results with facets
576
+ *
577
+ * @example
578
+ * ```ts
579
+ * // Search by drug name
580
+ * const results = await client.rxnorm.search({ q: "lipitor" });
581
+ *
582
+ * // Search prescribable drugs by ingredient
583
+ * const results = await client.rxnorm.search({
584
+ * ingredient: "metformin",
585
+ * is_prescribable: true
586
+ * });
587
+ * ```
588
+ */
589
+ async search(params, options) {
590
+ return this.http.search("/v1/rxnorm/search", {
591
+ ...params,
592
+ ...options,
593
+ include: options?.include?.join(",")
594
+ });
595
+ }
481
596
  };
482
597
 
483
598
  // src/endpoints/loinc.ts
@@ -515,6 +630,33 @@ var LoincEndpoint = class {
515
630
  options
516
631
  );
517
632
  }
633
+ /**
634
+ * Search for LOINC codes.
635
+ *
636
+ * @param params - Search parameters (q, component, class, system, etc.)
637
+ * @param options - Pagination and response shape options
638
+ * @returns Search results with facets
639
+ *
640
+ * @example
641
+ * ```ts
642
+ * // Search by term
643
+ * const results = await client.loinc.search({ q: "glucose" });
644
+ *
645
+ * // Search blood chemistry tests
646
+ * const results = await client.loinc.search({
647
+ * class: "CHEM",
648
+ * system: "Bld",
649
+ * scale: "Qn"
650
+ * });
651
+ * ```
652
+ */
653
+ async search(params, options) {
654
+ return this.http.search("/v1/loinc/search", {
655
+ ...params,
656
+ ...options,
657
+ include: options?.include?.join(",")
658
+ });
659
+ }
518
660
  };
519
661
 
520
662
  // src/endpoints/icd10.ts
@@ -582,6 +724,36 @@ var Icd10Endpoint = class {
582
724
  options
583
725
  );
584
726
  }
727
+ /**
728
+ * Search for ICD-10 codes (both CM and PCS).
729
+ *
730
+ * @param params - Search parameters (q, code_system, chapter, billable, etc.)
731
+ * @param options - Pagination and response shape options
732
+ * @returns Search results with facets
733
+ *
734
+ * @example
735
+ * ```ts
736
+ * // Search diagnosis codes
737
+ * const results = await client.icd10.search({
738
+ * q: "diabetes",
739
+ * code_system: "CM",
740
+ * billable: true
741
+ * });
742
+ *
743
+ * // Search procedure codes
744
+ * const results = await client.icd10.search({
745
+ * q: "bypass",
746
+ * code_system: "PCS"
747
+ * });
748
+ * ```
749
+ */
750
+ async search(params, options) {
751
+ return this.http.search("/v1/icd10/search", {
752
+ ...params,
753
+ ...options,
754
+ include: options?.include?.join(",")
755
+ });
756
+ }
585
757
  };
586
758
 
587
759
  // src/endpoints/cvx.ts
@@ -619,6 +791,32 @@ var CvxEndpoint = class {
619
791
  options
620
792
  );
621
793
  }
794
+ /**
795
+ * Search for vaccine codes.
796
+ *
797
+ * @param params - Search parameters (q, status, vaccine_type, is_covid_vaccine)
798
+ * @param options - Pagination and response shape options
799
+ * @returns Search results with facets
800
+ *
801
+ * @example
802
+ * ```ts
803
+ * // Search for flu vaccines
804
+ * const results = await client.cvx.search({ q: "influenza" });
805
+ *
806
+ * // Find all COVID-19 vaccines
807
+ * const results = await client.cvx.search({
808
+ * is_covid_vaccine: true,
809
+ * status: "active"
810
+ * });
811
+ * ```
812
+ */
813
+ async search(params, options) {
814
+ return this.http.search("/v1/cvx/search", {
815
+ ...params,
816
+ ...options,
817
+ include: options?.include?.join(",")
818
+ });
819
+ }
622
820
  };
623
821
 
624
822
  // src/endpoints/mvx.ts
@@ -656,6 +854,29 @@ var MvxEndpoint = class {
656
854
  options
657
855
  );
658
856
  }
857
+ /**
858
+ * Search for vaccine manufacturers.
859
+ *
860
+ * @param params - Search parameters (q, status)
861
+ * @param options - Pagination and response shape options
862
+ * @returns Search results with facets
863
+ *
864
+ * @example
865
+ * ```ts
866
+ * // Search by name
867
+ * const results = await client.mvx.search({ q: "pfizer" });
868
+ *
869
+ * // List all active manufacturers
870
+ * const results = await client.mvx.search({ status: "active" });
871
+ * ```
872
+ */
873
+ async search(params, options) {
874
+ return this.http.search("/v1/mvx/search", {
875
+ ...params,
876
+ ...options,
877
+ include: options?.include?.join(",")
878
+ });
879
+ }
659
880
  };
660
881
 
661
882
  // src/endpoints/fda-labels.ts
@@ -709,6 +930,38 @@ var FdaLabelsEndpoint = class {
709
930
  options
710
931
  );
711
932
  }
933
+ /**
934
+ * Search for FDA drug labels.
935
+ *
936
+ * @param params - Search parameters (q, name, brand, substance, manufacturer, etc.)
937
+ * @param options - Pagination and response shape options
938
+ * @returns Search results with facets
939
+ *
940
+ * @example
941
+ * ```ts
942
+ * // Search by drug name
943
+ * const results = await client.fdaLabels.search({ q: "advil" });
944
+ *
945
+ * // Search OTC pain relievers
946
+ * const results = await client.fdaLabels.search({
947
+ * substance: "acetaminophen",
948
+ * product_type: "otc"
949
+ * });
950
+ *
951
+ * // Search by manufacturer
952
+ * const results = await client.fdaLabels.search({
953
+ * manufacturer: "pfizer",
954
+ * product_type: "rx"
955
+ * });
956
+ * ```
957
+ */
958
+ async search(params, options) {
959
+ return this.http.search("/v1/fda-label/search", {
960
+ ...params,
961
+ ...options,
962
+ include: options?.include?.join(",")
963
+ });
964
+ }
712
965
  };
713
966
 
714
967
  // src/client.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/endpoints/ndc.ts","../src/endpoints/npi.ts","../src/endpoints/rxnorm.ts","../src/endpoints/loinc.ts","../src/endpoints/icd10.ts","../src/endpoints/cvx.ts","../src/endpoints/mvx.ts","../src/endpoints/fda-labels.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all FHIRfly SDK errors.\n */\nexport class FhirflyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FhirflyError\";\n Object.setPrototypeOf(this, FhirflyError.prototype);\n }\n}\n\n/**\n * Error thrown when the API returns an error response.\n */\nexport class ApiError extends FhirflyError {\n readonly statusCode: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n statusCode: number,\n code?: string,\n details?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n this.statusCode = statusCode;\n this.code = code;\n this.details = details;\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\n/**\n * Error thrown when authentication fails (401).\n */\nexport class AuthenticationError extends ApiError {\n constructor(message = \"Authentication failed. Check your API key.\") {\n super(message, 401, \"AUTHENTICATION_ERROR\");\n this.name = \"AuthenticationError\";\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when a resource is not found (404).\n */\nexport class NotFoundError extends ApiError {\n readonly code_type: string;\n readonly code_value: string;\n\n constructor(codeType: string, codeValue: string) {\n super(`${codeType} not found: ${codeValue}`, 404, \"NOT_FOUND\");\n this.name = \"NotFoundError\";\n this.code_type = codeType;\n this.code_value = codeValue;\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when the request is invalid (400).\n */\nexport class ValidationError extends ApiError {\n readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message, 400, \"VALIDATION_ERROR\");\n this.name = \"ValidationError\";\n this.field = field;\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limited (429).\n */\nexport class RateLimitError extends ApiError {\n readonly retryAfter?: number;\n readonly limit?: number;\n readonly remaining?: number;\n readonly reset?: Date;\n\n constructor(\n message = \"Rate limit exceeded\",\n retryAfter?: number,\n limit?: number,\n remaining?: number,\n reset?: Date\n ) {\n super(message, 429, \"RATE_LIMIT_EXCEEDED\");\n this.name = \"RateLimitError\";\n this.retryAfter = retryAfter;\n this.limit = limit;\n this.remaining = remaining;\n this.reset = reset;\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when quota is exceeded (429 with quota context).\n */\nexport class QuotaExceededError extends ApiError {\n readonly quotaLimit?: number;\n readonly quotaUsed?: number;\n readonly quotaResetDate?: Date;\n\n constructor(\n message = \"Monthly quota exceeded\",\n quotaLimit?: number,\n quotaUsed?: number,\n quotaResetDate?: Date\n ) {\n super(message, 429, \"QUOTA_EXCEEDED\");\n this.name = \"QuotaExceededError\";\n this.quotaLimit = quotaLimit;\n this.quotaUsed = quotaUsed;\n this.quotaResetDate = quotaResetDate;\n Object.setPrototypeOf(this, QuotaExceededError.prototype);\n }\n}\n\n/**\n * Error thrown when the server returns a 5xx error.\n */\nexport class ServerError extends ApiError {\n constructor(message = \"Server error\", statusCode = 500) {\n super(message, statusCode, \"SERVER_ERROR\");\n this.name = \"ServerError\";\n Object.setPrototypeOf(this, ServerError.prototype);\n }\n}\n\n/**\n * Error thrown when a network error occurs.\n */\nexport class NetworkError extends FhirflyError {\n readonly cause?: Error;\n\n constructor(message = \"Network error\", cause?: Error) {\n super(message);\n this.name = \"NetworkError\";\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out.\n */\nexport class TimeoutError extends FhirflyError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n","import {\n ApiError,\n AuthenticationError,\n NetworkError,\n NotFoundError,\n QuotaExceededError,\n RateLimitError,\n ServerError,\n TimeoutError,\n ValidationError,\n} from \"./errors.js\";\nimport type { LookupOptions } from \"./types/common.js\";\n\n/**\n * OAuth2 token response from the token endpoint.\n */\ninterface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string;\n}\n\n/**\n * OAuth2 client credentials configuration.\n */\nexport interface OAuthCredentials {\n clientId: string;\n clientSecret: string;\n tokenUrl: string;\n scopes?: string[];\n}\n\n/**\n * Manages OAuth2 access tokens with automatic refresh.\n */\nexport class TokenManager {\n private readonly credentials: OAuthCredentials;\n private accessToken: string | null = null;\n private expiresAt = 0;\n private refreshPromise: Promise<string> | null = null;\n\n constructor(credentials: OAuthCredentials) {\n this.credentials = credentials;\n }\n\n /**\n * Get a valid access token, refreshing if needed.\n * Deduplicates concurrent refresh calls.\n */\n async getToken(): Promise<string> {\n if (this.accessToken && Date.now() < this.expiresAt) {\n return this.accessToken;\n }\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n this.refreshPromise = this.fetchToken();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Invalidate the cached token (e.g., after a 401 response).\n */\n invalidate(): void {\n this.accessToken = null;\n this.expiresAt = 0;\n }\n\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.credentials.clientId,\n client_secret: this.credentials.clientSecret,\n });\n if (this.credentials.scopes?.length) {\n body.set(\"scope\", this.credentials.scopes.join(\" \"));\n }\n\n const response = await fetch(this.credentials.tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new AuthenticationError(\n `OAuth2 token exchange failed (${response.status}): ${text}`\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.accessToken = data.access_token;\n // Refresh 60s before expiry\n this.expiresAt = Date.now() + (data.expires_in - 60) * 1000;\n return this.accessToken;\n }\n}\n\n/**\n * Authentication mode for the HTTP client.\n */\ntype AuthMode =\n | { type: \"api-key\"; apiKey: string }\n | { type: \"oauth\"; tokenManager: TokenManager };\n\n/**\n * HTTP client configuration.\n */\nexport interface HttpClientConfig {\n baseUrl: string;\n auth: AuthMode;\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n userAgent?: string;\n}\n\n/**\n * HTTP response from the API.\n */\ninterface HttpResponse<T> {\n data: T;\n status: number;\n headers: Headers;\n}\n\n/**\n * Internal HTTP client for making API requests.\n */\nexport class HttpClient {\n private readonly config: Required<Omit<HttpClientConfig, \"auth\">> & { auth: AuthMode };\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n auth: config.auth,\n timeout: config.timeout ?? 30000,\n maxRetries: config.maxRetries ?? 3,\n retryDelay: config.retryDelay ?? 1000,\n userAgent: config.userAgent ?? `@fhirfly/sdk/0.1.0 Node.js/${process.version}`,\n };\n }\n\n /**\n * Build query string from options.\n */\n private buildQueryString(options?: LookupOptions): string {\n if (!options) return \"\";\n\n const params = new URLSearchParams();\n\n if (options.shape) {\n params.set(\"shape\", options.shape);\n }\n\n if (options.include?.length) {\n params.set(\"include\", options.include.join(\",\"));\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Parse error response from API.\n */\n private async parseErrorResponse(\n response: Response,\n endpoint: string\n ): Promise<never> {\n const status = response.status;\n let body: { message?: string; code?: string; error?: string; details?: unknown } = {};\n\n try {\n body = await response.json() as typeof body;\n } catch {\n // Response body is not JSON\n }\n\n const message = body.message || body.error || response.statusText;\n\n // Handle specific status codes\n switch (status) {\n case 401:\n throw new AuthenticationError(message);\n\n case 404: {\n // Extract code type and value from endpoint\n const match = endpoint.match(/\\/v1\\/(\\w+)\\/(.+)/);\n if (match) {\n throw new NotFoundError(match[1]!.toUpperCase(), match[2]!);\n }\n throw new NotFoundError(\"Resource\", endpoint);\n }\n\n case 400:\n throw new ValidationError(message);\n\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\");\n const limit = response.headers.get(\"x-ratelimit-limit\");\n const remaining = response.headers.get(\"x-ratelimit-remaining\");\n const reset = response.headers.get(\"x-ratelimit-reset\");\n\n // Check if it's a quota error vs rate limit\n if (body.code === \"QUOTA_EXCEEDED\") {\n throw new QuotaExceededError(message);\n }\n\n throw new RateLimitError(\n message,\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n limit ? parseInt(limit, 10) : undefined,\n remaining ? parseInt(remaining, 10) : undefined,\n reset ? new Date(parseInt(reset, 10) * 1000) : undefined\n );\n }\n\n default:\n if (status >= 500) {\n throw new ServerError(message, status);\n }\n throw new ApiError(message, status, body.code, body.details);\n }\n }\n\n /**\n * Sleep for a given number of milliseconds.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get auth headers for the current request.\n */\n private async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.config.auth.type === \"api-key\") {\n return { \"x-api-key\": this.config.auth.apiKey };\n }\n const token = await this.config.auth.tokenManager.getToken();\n return { \"Authorization\": `Bearer ${token}` };\n }\n\n /**\n * Make an HTTP request with retries.\n */\n private async request<T>(\n method: \"GET\" | \"POST\",\n endpoint: string,\n body?: unknown,\n isRetryAfter401 = false\n ): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${endpoint}`;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n const authHeaders = await this.getAuthHeaders();\n\n const response = await fetch(url, {\n method,\n headers: {\n ...authHeaders,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": this.config.userAgent,\n \"Accept\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // On 401 with OAuth, invalidate token and retry once\n if (\n response.status === 401 &&\n this.config.auth.type === \"oauth\" &&\n !isRetryAfter401\n ) {\n this.config.auth.tokenManager.invalidate();\n return this.request<T>(method, endpoint, body, true);\n }\n\n // Don't retry client errors (except rate limits)\n if (response.status < 500 && response.status !== 429) {\n await this.parseErrorResponse(response, endpoint);\n }\n\n // For rate limits, check retry-after header\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter && attempt < this.config.maxRetries) {\n await this.sleep(parseInt(retryAfter, 10) * 1000);\n continue;\n }\n await this.parseErrorResponse(response, endpoint);\n }\n\n // Retry server errors\n if (attempt < this.config.maxRetries) {\n await this.sleep(this.config.retryDelay * Math.pow(2, attempt));\n continue;\n }\n\n await this.parseErrorResponse(response, endpoint);\n }\n\n const data = await response.json() as T;\n return { data, status: response.status, headers: response.headers };\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new TimeoutError(this.config.timeout);\n }\n\n lastError = error;\n\n // Retry on network errors\n if (attempt < this.config.maxRetries) {\n await this.sleep(this.config.retryDelay * Math.pow(2, attempt));\n continue;\n }\n }\n\n throw new NetworkError(\n lastError?.message || \"Unknown network error\",\n lastError\n );\n }\n }\n\n throw new NetworkError(\n lastError?.message || \"Request failed after retries\",\n lastError\n );\n }\n\n /**\n * Make a GET request.\n */\n async get<T>(endpoint: string, options?: LookupOptions): Promise<T> {\n const queryString = this.buildQueryString(options);\n const response = await this.request<T>(\"GET\", `${endpoint}${queryString}`);\n return response.data;\n }\n\n /**\n * Make a POST request.\n */\n async post<T>(endpoint: string, body: unknown, options?: LookupOptions): Promise<T> {\n const queryString = this.buildQueryString(options);\n const response = await this.request<T>(\"POST\", `${endpoint}${queryString}`, body);\n return response.data;\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { NdcData } from \"../types/ndc.js\";\n\n/**\n * NDC (National Drug Code) API endpoint.\n */\nexport class NdcEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single NDC code.\n *\n * @param code - NDC code (10-digit, 11-digit, or hyphenated format)\n * @param options - Response shape and include options\n * @returns NDC data\n *\n * @example\n * ```ts\n * const ndc = await client.ndc.lookup(\"0069-0151-01\");\n * console.log(ndc.data.product_name); // \"Lipitor\"\n * ```\n */\n async lookup(code: string, options?: LookupOptions): Promise<ApiResponse<NdcData>> {\n return this.http.get<ApiResponse<NdcData>>(`/v1/ndc/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up multiple NDC codes in a single request.\n *\n * @param codes - Array of NDC codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n *\n * @example\n * ```ts\n * const results = await client.ndc.lookupMany([\n * \"0069-0151-01\",\n * \"0069-0151-02\",\n * \"invalid-code\"\n * ]);\n *\n * for (const item of results.results) {\n * if (item.found) {\n * console.log(item.data.product_name);\n * } else {\n * console.log(`Not found: ${item.code}`);\n * }\n * }\n * ```\n */\n async lookupMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<NdcData>> {\n return this.http.post<BatchResponse<NdcData>>(\n \"/v1/ndc/_batch\",\n { codes },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { NpiData } from \"../types/npi.js\";\n\n/**\n * NPI (National Provider Identifier) API endpoint.\n */\nexport class NpiEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single NPI.\n *\n * @param npi - 10-digit NPI number\n * @param options - Response shape and include options\n * @returns NPI data\n *\n * @example\n * ```ts\n * const npi = await client.npi.lookup(\"1234567890\");\n * console.log(npi.data.name);\n * ```\n */\n async lookup(npi: string, options?: LookupOptions): Promise<ApiResponse<NpiData>> {\n return this.http.get<ApiResponse<NpiData>>(`/v1/npi/${encodeURIComponent(npi)}`, options);\n }\n\n /**\n * Look up multiple NPIs in a single request.\n *\n * @param npis - Array of 10-digit NPI numbers (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each NPI\n *\n * @example\n * ```ts\n * const results = await client.npi.lookupMany([\n * \"1234567890\",\n * \"0987654321\"\n * ]);\n * ```\n */\n async lookupMany(\n npis: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<NpiData>> {\n return this.http.post<BatchResponse<NpiData>>(\n \"/v1/npi/_batch\",\n { codes: npis },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { RxNormData } from \"../types/rxnorm.js\";\n\n/**\n * RxNorm API endpoint.\n */\nexport class RxNormEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single RxCUI.\n *\n * @param rxcui - RxNorm Concept Unique Identifier\n * @param options - Response shape and include options\n * @returns RxNorm data\n *\n * @example\n * ```ts\n * const rx = await client.rxnorm.lookup(\"213169\");\n * console.log(rx.data.name); // \"atorvastatin 10 MG Oral Tablet\"\n * ```\n */\n async lookup(rxcui: string, options?: LookupOptions): Promise<ApiResponse<RxNormData>> {\n return this.http.get<ApiResponse<RxNormData>>(`/v1/rxnorm/${encodeURIComponent(rxcui)}`, options);\n }\n\n /**\n * Look up multiple RxCUIs in a single request.\n *\n * @param rxcuis - Array of RxCUIs (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each RxCUI\n */\n async lookupMany(\n rxcuis: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<RxNormData>> {\n return this.http.post<BatchResponse<RxNormData>>(\n \"/v1/rxnorm/_batch\",\n { codes: rxcuis },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { LoincData } from \"../types/loinc.js\";\n\n/**\n * LOINC API endpoint.\n */\nexport class LoincEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single LOINC code.\n *\n * @param loincNum - LOINC number (e.g., \"2345-7\")\n * @param options - Response shape and include options\n * @returns LOINC data\n *\n * @example\n * ```ts\n * const loinc = await client.loinc.lookup(\"2345-7\");\n * console.log(loinc.data.long_common_name); // \"Glucose [Mass/volume] in Serum or Plasma\"\n * ```\n */\n async lookup(loincNum: string, options?: LookupOptions): Promise<ApiResponse<LoincData>> {\n return this.http.get<ApiResponse<LoincData>>(`/v1/loinc/${encodeURIComponent(loincNum)}`, options);\n }\n\n /**\n * Look up multiple LOINC codes in a single request.\n *\n * @param loincNums - Array of LOINC numbers (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each LOINC\n */\n async lookupMany(\n loincNums: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<LoincData>> {\n return this.http.post<BatchResponse<LoincData>>(\n \"/v1/loinc/_batch\",\n { codes: loincNums },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { Icd10Data } from \"../types/icd10.js\";\n\n/**\n * ICD-10 API endpoint.\n */\nexport class Icd10Endpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single ICD-10-CM code (diagnoses).\n *\n * @param code - ICD-10-CM code (e.g., \"E11.9\")\n * @param options - Response shape and include options\n * @returns ICD-10 data\n *\n * @example\n * ```ts\n * const icd = await client.icd10.lookupCm(\"E11.9\");\n * console.log(icd.data.description); // \"Type 2 diabetes mellitus without complications\"\n * ```\n */\n async lookupCm(code: string, options?: LookupOptions): Promise<ApiResponse<Icd10Data>> {\n return this.http.get<ApiResponse<Icd10Data>>(`/v1/icd10/cm/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up a single ICD-10-PCS code (procedures).\n *\n * @param code - ICD-10-PCS code (e.g., \"0BJ08ZZ\")\n * @param options - Response shape and include options\n * @returns ICD-10 data\n *\n * @example\n * ```ts\n * const icd = await client.icd10.lookupPcs(\"0BJ08ZZ\");\n * console.log(icd.data.description);\n * ```\n */\n async lookupPcs(code: string, options?: LookupOptions): Promise<ApiResponse<Icd10Data>> {\n return this.http.get<ApiResponse<Icd10Data>>(`/v1/icd10/pcs/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up multiple ICD-10-CM codes in a single request.\n *\n * @param codes - Array of ICD-10-CM codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupCmMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<Icd10Data>> {\n return this.http.post<BatchResponse<Icd10Data>>(\n \"/v1/icd10/cm/_batch\",\n { codes },\n options\n );\n }\n\n /**\n * Look up multiple ICD-10-PCS codes in a single request.\n *\n * @param codes - Array of ICD-10-PCS codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupPcsMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<Icd10Data>> {\n return this.http.post<BatchResponse<Icd10Data>>(\n \"/v1/icd10/pcs/_batch\",\n { codes },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { CvxData } from \"../types/cvx.js\";\n\n/**\n * CVX (Vaccine Codes) API endpoint.\n */\nexport class CvxEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single CVX code.\n *\n * @param cvxCode - CVX vaccine code\n * @param options - Response shape and include options\n * @returns CVX data\n *\n * @example\n * ```ts\n * const cvx = await client.cvx.lookup(\"208\");\n * console.log(cvx.data.short_description); // \"COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose\"\n * ```\n */\n async lookup(cvxCode: string, options?: LookupOptions): Promise<ApiResponse<CvxData>> {\n return this.http.get<ApiResponse<CvxData>>(`/v1/cvx/${encodeURIComponent(cvxCode)}`, options);\n }\n\n /**\n * Look up multiple CVX codes in a single request.\n *\n * @param cvxCodes - Array of CVX codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupMany(\n cvxCodes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<CvxData>> {\n return this.http.post<BatchResponse<CvxData>>(\n \"/v1/cvx/_batch\",\n { codes: cvxCodes },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { MvxData } from \"../types/mvx.js\";\n\n/**\n * MVX (Vaccine Manufacturer Codes) API endpoint.\n */\nexport class MvxEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single MVX code.\n *\n * @param mvxCode - MVX manufacturer code\n * @param options - Response shape and include options\n * @returns MVX data\n *\n * @example\n * ```ts\n * const mvx = await client.mvx.lookup(\"PFR\");\n * console.log(mvx.data.manufacturer_name); // \"Pfizer, Inc\"\n * ```\n */\n async lookup(mvxCode: string, options?: LookupOptions): Promise<ApiResponse<MvxData>> {\n return this.http.get<ApiResponse<MvxData>>(`/v1/mvx/${encodeURIComponent(mvxCode)}`, options);\n }\n\n /**\n * Look up multiple MVX codes in a single request.\n *\n * @param mvxCodes - Array of MVX codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupMany(\n mvxCodes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<MvxData>> {\n return this.http.post<BatchResponse<MvxData>>(\n \"/v1/mvx/_batch\",\n { codes: mvxCodes },\n options\n );\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n} from \"../types/common.js\";\nimport type { FdaLabelData } from \"../types/fda-labels.js\";\n\n/**\n * FDA Labels API endpoint.\n */\nexport class FdaLabelsEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up FDA label by Set ID.\n *\n * @param setId - FDA SPL Set ID\n * @param options - Response shape and include options\n * @returns FDA Label data\n *\n * @example\n * ```ts\n * const label = await client.fdaLabels.lookup(\"abc123-def456\");\n * console.log(label.data.indications_and_usage);\n * ```\n */\n async lookup(setId: string, options?: LookupOptions): Promise<ApiResponse<FdaLabelData>> {\n return this.http.get<ApiResponse<FdaLabelData>>(`/v1/fda-labels/${encodeURIComponent(setId)}`, options);\n }\n\n /**\n * Look up FDA label by NDC code.\n *\n * @param ndc - NDC code\n * @param options - Response shape and include options\n * @returns FDA Label data\n *\n * @example\n * ```ts\n * const label = await client.fdaLabels.lookupByNdc(\"0069-0151-01\");\n * console.log(label.data.product_name);\n * ```\n */\n async lookupByNdc(ndc: string, options?: LookupOptions): Promise<ApiResponse<FdaLabelData>> {\n return this.http.get<ApiResponse<FdaLabelData>>(`/v1/fda-labels/ndc/${encodeURIComponent(ndc)}`, options);\n }\n\n /**\n * Look up multiple FDA labels by Set IDs in a single request.\n *\n * @param setIds - Array of Set IDs (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each Set ID\n */\n async lookupMany(\n setIds: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<FdaLabelData>> {\n return this.http.post<BatchResponse<FdaLabelData>>(\n \"/v1/fda-labels/_batch\",\n { codes: setIds },\n options\n );\n }\n}\n","import { HttpClient, TokenManager, type HttpClientConfig } from \"./http.js\";\nimport { NdcEndpoint } from \"./endpoints/ndc.js\";\nimport { NpiEndpoint } from \"./endpoints/npi.js\";\nimport { RxNormEndpoint } from \"./endpoints/rxnorm.js\";\nimport { LoincEndpoint } from \"./endpoints/loinc.js\";\nimport { Icd10Endpoint } from \"./endpoints/icd10.js\";\nimport { CvxEndpoint } from \"./endpoints/cvx.js\";\nimport { MvxEndpoint } from \"./endpoints/mvx.js\";\nimport { FdaLabelsEndpoint } from \"./endpoints/fda-labels.js\";\n\n/**\n * Base configuration options shared by all auth modes.\n */\ninterface FhirflyBaseConfig {\n /**\n * Base URL for the API.\n * @default \"https://api.fhirfly.io\"\n */\n baseUrl?: string;\n\n /**\n * Request timeout in milliseconds.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts for failed requests.\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Base delay between retries in milliseconds (exponential backoff).\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * Configuration using an API key (simple credentials).\n */\nexport interface FhirflyApiKeyConfig extends FhirflyBaseConfig {\n /**\n * Your FHIRfly API key.\n * Get one at https://fhirfly.io/dashboard\n */\n apiKey: string;\n clientId?: never;\n clientSecret?: never;\n tokenUrl?: never;\n scopes?: never;\n}\n\n/**\n * Configuration using OAuth2 client credentials (secure credentials).\n */\nexport interface FhirflyOAuthConfig extends FhirflyBaseConfig {\n /**\n * OAuth2 client ID from your secure credential.\n */\n clientId: string;\n\n /**\n * OAuth2 client secret from your secure credential.\n */\n clientSecret: string;\n\n /**\n * OAuth2 token endpoint URL.\n * @default \"{baseUrl}/oauth2/token\"\n */\n tokenUrl?: string;\n\n /**\n * OAuth2 scopes to request.\n */\n scopes?: string[];\n\n apiKey?: never;\n}\n\n/**\n * Configuration options for the FHIRfly client.\n * Provide either `apiKey` OR `clientId`+`clientSecret`, not both.\n */\nexport type FhirflyConfig = FhirflyApiKeyConfig | FhirflyOAuthConfig;\n\n/**\n * FHIRfly API client.\n *\n * Provides access to healthcare reference data including drug codes (NDC, RxNorm),\n * provider identifiers (NPI), lab codes (LOINC), diagnosis codes (ICD-10),\n * vaccine codes (CVX, MVX), and FDA drug labels.\n *\n * @example\n * ```ts\n * import { Fhirfly } from \"@fhirfly/sdk\";\n *\n * // Option A: API key (simple)\n * const client = new Fhirfly({ apiKey: \"ffly_sk_live_...\" });\n *\n * // Option B: Client credentials (secure)\n * const client = new Fhirfly({\n * clientId: \"ffly_client_...\",\n * clientSecret: \"ffly_secret_...\",\n * });\n *\n * // Look up a drug by NDC\n * const ndc = await client.ndc.lookup(\"0069-0151-01\");\n * console.log(ndc.data.product_name); // \"Lipitor\"\n * ```\n */\nexport class Fhirfly {\n private readonly http: HttpClient;\n\n /**\n * NDC (National Drug Code) lookups.\n */\n readonly ndc: NdcEndpoint;\n\n /**\n * NPI (National Provider Identifier) lookups.\n */\n readonly npi: NpiEndpoint;\n\n /**\n * RxNorm drug terminology lookups.\n */\n readonly rxnorm: RxNormEndpoint;\n\n /**\n * LOINC laboratory and clinical observation code lookups.\n */\n readonly loinc: LoincEndpoint;\n\n /**\n * ICD-10 diagnosis and procedure code lookups.\n */\n readonly icd10: Icd10Endpoint;\n\n /**\n * CVX vaccine code lookups.\n */\n readonly cvx: CvxEndpoint;\n\n /**\n * MVX vaccine manufacturer code lookups.\n */\n readonly mvx: MvxEndpoint;\n\n /**\n * FDA drug label lookups.\n */\n readonly fdaLabels: FdaLabelsEndpoint;\n\n /**\n * Create a new FHIRfly client.\n *\n * @param config - Client configuration (API key or OAuth2 client credentials)\n * @throws {Error} If neither apiKey nor clientId+clientSecret is provided\n */\n constructor(config: FhirflyConfig) {\n const baseUrl = config.baseUrl ?? \"https://api.fhirfly.io\";\n\n let httpConfig: HttpClientConfig;\n\n if (\"apiKey\" in config && config.apiKey) {\n httpConfig = {\n baseUrl,\n auth: { type: \"api-key\", apiKey: config.apiKey },\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n };\n } else if (\"clientId\" in config && config.clientId && config.clientSecret) {\n const tokenManager = new TokenManager({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n tokenUrl: config.tokenUrl ?? `${baseUrl}/oauth2/token`,\n scopes: config.scopes,\n });\n httpConfig = {\n baseUrl,\n auth: { type: \"oauth\", tokenManager },\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n };\n } else {\n throw new Error(\n \"FHIRfly requires either an apiKey or clientId+clientSecret. Get credentials at https://fhirfly.io/dashboard\"\n );\n }\n\n this.http = new HttpClient(httpConfig);\n\n // Initialize endpoints\n this.ndc = new NdcEndpoint(this.http);\n this.npi = new NpiEndpoint(this.http);\n this.rxnorm = new RxNormEndpoint(this.http);\n this.loinc = new LoincEndpoint(this.http);\n this.icd10 = new Icd10Endpoint(this.http);\n this.cvx = new CvxEndpoint(this.http);\n this.mvx = new MvxEndpoint(this.http);\n this.fdaLabels = new FdaLabelsEndpoint(this.http);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/endpoints/ndc.ts","../src/endpoints/npi.ts","../src/endpoints/rxnorm.ts","../src/endpoints/loinc.ts","../src/endpoints/icd10.ts","../src/endpoints/cvx.ts","../src/endpoints/mvx.ts","../src/endpoints/fda-labels.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all FHIRfly SDK errors.\n */\nexport class FhirflyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FhirflyError\";\n Object.setPrototypeOf(this, FhirflyError.prototype);\n }\n}\n\n/**\n * Error thrown when the API returns an error response.\n */\nexport class ApiError extends FhirflyError {\n readonly statusCode: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n statusCode: number,\n code?: string,\n details?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n this.statusCode = statusCode;\n this.code = code;\n this.details = details;\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\n/**\n * Error thrown when authentication fails (401).\n */\nexport class AuthenticationError extends ApiError {\n constructor(message = \"Authentication failed. Check your API key.\") {\n super(message, 401, \"AUTHENTICATION_ERROR\");\n this.name = \"AuthenticationError\";\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Error thrown when a resource is not found (404).\n */\nexport class NotFoundError extends ApiError {\n readonly code_type: string;\n readonly code_value: string;\n\n constructor(codeType: string, codeValue: string) {\n super(`${codeType} not found: ${codeValue}`, 404, \"NOT_FOUND\");\n this.name = \"NotFoundError\";\n this.code_type = codeType;\n this.code_value = codeValue;\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when the request is invalid (400).\n */\nexport class ValidationError extends ApiError {\n readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message, 400, \"VALIDATION_ERROR\");\n this.name = \"ValidationError\";\n this.field = field;\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limited (429).\n */\nexport class RateLimitError extends ApiError {\n readonly retryAfter?: number;\n readonly limit?: number;\n readonly remaining?: number;\n readonly reset?: Date;\n\n constructor(\n message = \"Rate limit exceeded\",\n retryAfter?: number,\n limit?: number,\n remaining?: number,\n reset?: Date\n ) {\n super(message, 429, \"RATE_LIMIT_EXCEEDED\");\n this.name = \"RateLimitError\";\n this.retryAfter = retryAfter;\n this.limit = limit;\n this.remaining = remaining;\n this.reset = reset;\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when quota is exceeded (429 with quota context).\n */\nexport class QuotaExceededError extends ApiError {\n readonly quotaLimit?: number;\n readonly quotaUsed?: number;\n readonly quotaResetDate?: Date;\n\n constructor(\n message = \"Monthly quota exceeded\",\n quotaLimit?: number,\n quotaUsed?: number,\n quotaResetDate?: Date\n ) {\n super(message, 429, \"QUOTA_EXCEEDED\");\n this.name = \"QuotaExceededError\";\n this.quotaLimit = quotaLimit;\n this.quotaUsed = quotaUsed;\n this.quotaResetDate = quotaResetDate;\n Object.setPrototypeOf(this, QuotaExceededError.prototype);\n }\n}\n\n/**\n * Error thrown when the server returns a 5xx error.\n */\nexport class ServerError extends ApiError {\n constructor(message = \"Server error\", statusCode = 500) {\n super(message, statusCode, \"SERVER_ERROR\");\n this.name = \"ServerError\";\n Object.setPrototypeOf(this, ServerError.prototype);\n }\n}\n\n/**\n * Error thrown when a network error occurs.\n */\nexport class NetworkError extends FhirflyError {\n readonly cause?: Error;\n\n constructor(message = \"Network error\", cause?: Error) {\n super(message);\n this.name = \"NetworkError\";\n this.cause = cause;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out.\n */\nexport class TimeoutError extends FhirflyError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n","import {\n ApiError,\n AuthenticationError,\n NetworkError,\n NotFoundError,\n QuotaExceededError,\n RateLimitError,\n ServerError,\n TimeoutError,\n ValidationError,\n} from \"./errors.js\";\nimport type { LookupOptions } from \"./types/common.js\";\n\n/**\n * OAuth2 token response from the token endpoint.\n */\ninterface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n scope?: string;\n}\n\n/**\n * OAuth2 client credentials configuration.\n */\nexport interface OAuthCredentials {\n clientId: string;\n clientSecret: string;\n tokenUrl: string;\n scopes?: string[];\n}\n\n/**\n * Manages OAuth2 access tokens with automatic refresh.\n */\nexport class TokenManager {\n private readonly credentials: OAuthCredentials;\n private accessToken: string | null = null;\n private expiresAt = 0;\n private refreshPromise: Promise<string> | null = null;\n\n constructor(credentials: OAuthCredentials) {\n this.credentials = credentials;\n }\n\n /**\n * Get a valid access token, refreshing if needed.\n * Deduplicates concurrent refresh calls.\n */\n async getToken(): Promise<string> {\n if (this.accessToken && Date.now() < this.expiresAt) {\n return this.accessToken;\n }\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n this.refreshPromise = this.fetchToken();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Invalidate the cached token (e.g., after a 401 response).\n */\n invalidate(): void {\n this.accessToken = null;\n this.expiresAt = 0;\n }\n\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.credentials.clientId,\n client_secret: this.credentials.clientSecret,\n });\n if (this.credentials.scopes?.length) {\n body.set(\"scope\", this.credentials.scopes.join(\" \"));\n }\n\n const response = await fetch(this.credentials.tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new AuthenticationError(\n `OAuth2 token exchange failed (${response.status}): ${text}`\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.accessToken = data.access_token;\n // Refresh 60s before expiry\n this.expiresAt = Date.now() + (data.expires_in - 60) * 1000;\n return this.accessToken;\n }\n}\n\n/**\n * Authentication mode for the HTTP client.\n */\ntype AuthMode =\n | { type: \"api-key\"; apiKey: string }\n | { type: \"oauth\"; tokenManager: TokenManager };\n\n/**\n * HTTP client configuration.\n */\nexport interface HttpClientConfig {\n baseUrl: string;\n auth: AuthMode;\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n userAgent?: string;\n}\n\n/**\n * HTTP response from the API.\n */\ninterface HttpResponse<T> {\n data: T;\n status: number;\n headers: Headers;\n}\n\n/**\n * Internal HTTP client for making API requests.\n */\nexport class HttpClient {\n private readonly config: Required<Omit<HttpClientConfig, \"auth\">> & { auth: AuthMode };\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n auth: config.auth,\n timeout: config.timeout ?? 30000,\n maxRetries: config.maxRetries ?? 3,\n retryDelay: config.retryDelay ?? 1000,\n userAgent: config.userAgent ?? `@fhirfly/sdk/0.1.0 Node.js/${process.version}`,\n };\n }\n\n /**\n * Build query string from options.\n */\n private buildQueryString(options?: LookupOptions): string {\n if (!options) return \"\";\n\n const params = new URLSearchParams();\n\n if (options.shape) {\n params.set(\"shape\", options.shape);\n }\n\n if (options.include?.length) {\n params.set(\"include\", options.include.join(\",\"));\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Build query string from search params object.\n */\n buildSearchQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n\n if (typeof value === \"boolean\") {\n searchParams.set(key, value.toString());\n } else if (typeof value === \"number\") {\n searchParams.set(key, value.toString());\n } else if (typeof value === \"string\" && value.length > 0) {\n searchParams.set(key, value);\n } else if (Array.isArray(value) && value.length > 0) {\n searchParams.set(key, value.join(\",\"));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Parse error response from API.\n */\n private async parseErrorResponse(\n response: Response,\n endpoint: string\n ): Promise<never> {\n const status = response.status;\n let body: { message?: string; code?: string; error?: string; details?: unknown } = {};\n\n try {\n body = await response.json() as typeof body;\n } catch {\n // Response body is not JSON\n }\n\n const message = body.message || body.error || response.statusText;\n\n // Handle specific status codes\n switch (status) {\n case 401:\n throw new AuthenticationError(message);\n\n case 404: {\n // Extract code type and value from endpoint\n const match = endpoint.match(/\\/v1\\/(\\w+)\\/(.+)/);\n if (match) {\n throw new NotFoundError(match[1]!.toUpperCase(), match[2]!);\n }\n throw new NotFoundError(\"Resource\", endpoint);\n }\n\n case 400:\n throw new ValidationError(message);\n\n case 429: {\n const retryAfter = response.headers.get(\"retry-after\");\n const limit = response.headers.get(\"x-ratelimit-limit\");\n const remaining = response.headers.get(\"x-ratelimit-remaining\");\n const reset = response.headers.get(\"x-ratelimit-reset\");\n\n // Check if it's a quota error vs rate limit\n if (body.code === \"QUOTA_EXCEEDED\") {\n throw new QuotaExceededError(message);\n }\n\n throw new RateLimitError(\n message,\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n limit ? parseInt(limit, 10) : undefined,\n remaining ? parseInt(remaining, 10) : undefined,\n reset ? new Date(parseInt(reset, 10) * 1000) : undefined\n );\n }\n\n default:\n if (status >= 500) {\n throw new ServerError(message, status);\n }\n throw new ApiError(message, status, body.code, body.details);\n }\n }\n\n /**\n * Sleep for a given number of milliseconds.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get auth headers for the current request.\n */\n private async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.config.auth.type === \"api-key\") {\n return { \"x-api-key\": this.config.auth.apiKey };\n }\n const token = await this.config.auth.tokenManager.getToken();\n return { \"Authorization\": `Bearer ${token}` };\n }\n\n /**\n * Make an HTTP request with retries.\n */\n private async request<T>(\n method: \"GET\" | \"POST\",\n endpoint: string,\n body?: unknown,\n isRetryAfter401 = false\n ): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${endpoint}`;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n const authHeaders = await this.getAuthHeaders();\n\n const response = await fetch(url, {\n method,\n headers: {\n ...authHeaders,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": this.config.userAgent,\n \"Accept\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // On 401 with OAuth, invalidate token and retry once\n if (\n response.status === 401 &&\n this.config.auth.type === \"oauth\" &&\n !isRetryAfter401\n ) {\n this.config.auth.tokenManager.invalidate();\n return this.request<T>(method, endpoint, body, true);\n }\n\n // Don't retry client errors (except rate limits)\n if (response.status < 500 && response.status !== 429) {\n await this.parseErrorResponse(response, endpoint);\n }\n\n // For rate limits, check retry-after header\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter && attempt < this.config.maxRetries) {\n await this.sleep(parseInt(retryAfter, 10) * 1000);\n continue;\n }\n await this.parseErrorResponse(response, endpoint);\n }\n\n // Retry server errors\n if (attempt < this.config.maxRetries) {\n await this.sleep(this.config.retryDelay * Math.pow(2, attempt));\n continue;\n }\n\n await this.parseErrorResponse(response, endpoint);\n }\n\n const data = await response.json() as T;\n return { data, status: response.status, headers: response.headers };\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new TimeoutError(this.config.timeout);\n }\n\n lastError = error;\n\n // Retry on network errors\n if (attempt < this.config.maxRetries) {\n await this.sleep(this.config.retryDelay * Math.pow(2, attempt));\n continue;\n }\n }\n\n throw new NetworkError(\n lastError?.message || \"Unknown network error\",\n lastError\n );\n }\n }\n\n throw new NetworkError(\n lastError?.message || \"Request failed after retries\",\n lastError\n );\n }\n\n /**\n * Make a GET request.\n */\n async get<T>(endpoint: string, options?: LookupOptions): Promise<T> {\n const queryString = this.buildQueryString(options);\n const response = await this.request<T>(\"GET\", `${endpoint}${queryString}`);\n return response.data;\n }\n\n /**\n * Make a POST request.\n */\n async post<T>(endpoint: string, body: unknown, options?: LookupOptions): Promise<T> {\n const queryString = this.buildQueryString(options);\n const response = await this.request<T>(\"POST\", `${endpoint}${queryString}`, body);\n return response.data;\n }\n\n /**\n * Make a GET request with search parameters.\n */\n async search<T>(endpoint: string, params: Record<string, unknown>): Promise<T> {\n const queryString = this.buildSearchQueryString(params);\n const response = await this.request<T>(\"GET\", `${endpoint}${queryString}`);\n return response.data;\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { NdcData, NdcSearchParams } from \"../types/ndc.js\";\n\n/**\n * NDC (National Drug Code) API endpoint.\n */\nexport class NdcEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single NDC code.\n *\n * @param code - NDC code (10-digit, 11-digit, or hyphenated format)\n * @param options - Response shape and include options\n * @returns NDC data\n *\n * @example\n * ```ts\n * const ndc = await client.ndc.lookup(\"0069-0151-01\");\n * console.log(ndc.data.product_name); // \"Lipitor\"\n * ```\n */\n async lookup(code: string, options?: LookupOptions): Promise<ApiResponse<NdcData>> {\n return this.http.get<ApiResponse<NdcData>>(`/v1/ndc/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up multiple NDC codes in a single request.\n *\n * @param codes - Array of NDC codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n *\n * @example\n * ```ts\n * const results = await client.ndc.lookupMany([\n * \"0069-0151-01\",\n * \"0069-0151-02\",\n * \"invalid-code\"\n * ]);\n *\n * for (const item of results.results) {\n * if (item.found) {\n * console.log(item.data.product_name);\n * } else {\n * console.log(`Not found: ${item.code}`);\n * }\n * }\n * ```\n */\n async lookupMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<NdcData>> {\n return this.http.post<BatchResponse<NdcData>>(\n \"/v1/ndc/_batch\",\n { codes },\n options\n );\n }\n\n /**\n * Search for NDC products.\n *\n * @param params - Search parameters (q, name, brand, ingredient, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by drug name\n * const results = await client.ndc.search({ q: \"advil\" });\n *\n * // Search with filters\n * const results = await client.ndc.search({\n * ingredient: \"ibuprofen\",\n * dosage_form: \"TABLET\",\n * product_type: \"otc\"\n * });\n *\n * console.log(`Found ${results.total} products`);\n * for (const item of results.items) {\n * console.log(item.product_name);\n * }\n * ```\n */\n async search(\n params: NdcSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<NdcData>> {\n return this.http.search<SearchResponse<NdcData>>(\"/v1/ndc/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { NpiData, NpiSearchParams } from \"../types/npi.js\";\n\n/**\n * NPI (National Provider Identifier) API endpoint.\n */\nexport class NpiEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single NPI.\n *\n * @param npi - 10-digit NPI number\n * @param options - Response shape and include options\n * @returns NPI data\n *\n * @example\n * ```ts\n * const npi = await client.npi.lookup(\"1234567890\");\n * console.log(npi.data.name);\n * ```\n */\n async lookup(npi: string, options?: LookupOptions): Promise<ApiResponse<NpiData>> {\n return this.http.get<ApiResponse<NpiData>>(`/v1/npi/${encodeURIComponent(npi)}`, options);\n }\n\n /**\n * Look up multiple NPIs in a single request.\n *\n * @param npis - Array of 10-digit NPI numbers (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each NPI\n *\n * @example\n * ```ts\n * const results = await client.npi.lookupMany([\n * \"1234567890\",\n * \"0987654321\"\n * ]);\n * ```\n */\n async lookupMany(\n npis: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<NpiData>> {\n return this.http.post<BatchResponse<NpiData>>(\n \"/v1/npi/_batch\",\n { codes: npis },\n options\n );\n }\n\n /**\n * Search for healthcare providers.\n *\n * @param params - Search parameters (q, name, specialty, state, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by name\n * const results = await client.npi.search({ q: \"smith\" });\n *\n * // Search with filters\n * const results = await client.npi.search({\n * specialty: \"cardiology\",\n * state: \"CA\",\n * entity_type: \"individual\"\n * });\n *\n * console.log(`Found ${results.total} providers`);\n * ```\n */\n async search(\n params: NpiSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<NpiData>> {\n return this.http.search<SearchResponse<NpiData>>(\"/v1/npi/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { RxNormData, RxNormSearchParams } from \"../types/rxnorm.js\";\n\n/**\n * RxNorm API endpoint.\n */\nexport class RxNormEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single RxCUI.\n *\n * @param rxcui - RxNorm Concept Unique Identifier\n * @param options - Response shape and include options\n * @returns RxNorm data\n *\n * @example\n * ```ts\n * const rx = await client.rxnorm.lookup(\"213169\");\n * console.log(rx.data.name); // \"atorvastatin 10 MG Oral Tablet\"\n * ```\n */\n async lookup(rxcui: string, options?: LookupOptions): Promise<ApiResponse<RxNormData>> {\n return this.http.get<ApiResponse<RxNormData>>(`/v1/rxnorm/${encodeURIComponent(rxcui)}`, options);\n }\n\n /**\n * Look up multiple RxCUIs in a single request.\n *\n * @param rxcuis - Array of RxCUIs (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each RxCUI\n */\n async lookupMany(\n rxcuis: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<RxNormData>> {\n return this.http.post<BatchResponse<RxNormData>>(\n \"/v1/rxnorm/_batch\",\n { codes: rxcuis },\n options\n );\n }\n\n /**\n * Search for drugs in RxNorm.\n *\n * @param params - Search parameters (q, name, ingredient, brand, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by drug name\n * const results = await client.rxnorm.search({ q: \"lipitor\" });\n *\n * // Search prescribable drugs by ingredient\n * const results = await client.rxnorm.search({\n * ingredient: \"metformin\",\n * is_prescribable: true\n * });\n * ```\n */\n async search(\n params: RxNormSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<RxNormData>> {\n return this.http.search<SearchResponse<RxNormData>>(\"/v1/rxnorm/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { LoincData, LoincSearchParams } from \"../types/loinc.js\";\n\n/**\n * LOINC API endpoint.\n */\nexport class LoincEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single LOINC code.\n *\n * @param loincNum - LOINC number (e.g., \"2345-7\")\n * @param options - Response shape and include options\n * @returns LOINC data\n *\n * @example\n * ```ts\n * const loinc = await client.loinc.lookup(\"2345-7\");\n * console.log(loinc.data.long_common_name); // \"Glucose [Mass/volume] in Serum or Plasma\"\n * ```\n */\n async lookup(loincNum: string, options?: LookupOptions): Promise<ApiResponse<LoincData>> {\n return this.http.get<ApiResponse<LoincData>>(`/v1/loinc/${encodeURIComponent(loincNum)}`, options);\n }\n\n /**\n * Look up multiple LOINC codes in a single request.\n *\n * @param loincNums - Array of LOINC numbers (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each LOINC\n */\n async lookupMany(\n loincNums: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<LoincData>> {\n return this.http.post<BatchResponse<LoincData>>(\n \"/v1/loinc/_batch\",\n { codes: loincNums },\n options\n );\n }\n\n /**\n * Search for LOINC codes.\n *\n * @param params - Search parameters (q, component, class, system, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by term\n * const results = await client.loinc.search({ q: \"glucose\" });\n *\n * // Search blood chemistry tests\n * const results = await client.loinc.search({\n * class: \"CHEM\",\n * system: \"Bld\",\n * scale: \"Qn\"\n * });\n * ```\n */\n async search(\n params: LoincSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<LoincData>> {\n return this.http.search<SearchResponse<LoincData>>(\"/v1/loinc/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { Icd10Data, Icd10SearchParams } from \"../types/icd10.js\";\n\n/**\n * ICD-10 API endpoint.\n */\nexport class Icd10Endpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single ICD-10-CM code (diagnoses).\n *\n * @param code - ICD-10-CM code (e.g., \"E11.9\")\n * @param options - Response shape and include options\n * @returns ICD-10 data\n *\n * @example\n * ```ts\n * const icd = await client.icd10.lookupCm(\"E11.9\");\n * console.log(icd.data.description); // \"Type 2 diabetes mellitus without complications\"\n * ```\n */\n async lookupCm(code: string, options?: LookupOptions): Promise<ApiResponse<Icd10Data>> {\n return this.http.get<ApiResponse<Icd10Data>>(`/v1/icd10/cm/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up a single ICD-10-PCS code (procedures).\n *\n * @param code - ICD-10-PCS code (e.g., \"0BJ08ZZ\")\n * @param options - Response shape and include options\n * @returns ICD-10 data\n *\n * @example\n * ```ts\n * const icd = await client.icd10.lookupPcs(\"0BJ08ZZ\");\n * console.log(icd.data.description);\n * ```\n */\n async lookupPcs(code: string, options?: LookupOptions): Promise<ApiResponse<Icd10Data>> {\n return this.http.get<ApiResponse<Icd10Data>>(`/v1/icd10/pcs/${encodeURIComponent(code)}`, options);\n }\n\n /**\n * Look up multiple ICD-10-CM codes in a single request.\n *\n * @param codes - Array of ICD-10-CM codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupCmMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<Icd10Data>> {\n return this.http.post<BatchResponse<Icd10Data>>(\n \"/v1/icd10/cm/_batch\",\n { codes },\n options\n );\n }\n\n /**\n * Look up multiple ICD-10-PCS codes in a single request.\n *\n * @param codes - Array of ICD-10-PCS codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupPcsMany(\n codes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<Icd10Data>> {\n return this.http.post<BatchResponse<Icd10Data>>(\n \"/v1/icd10/pcs/_batch\",\n { codes },\n options\n );\n }\n\n /**\n * Search for ICD-10 codes (both CM and PCS).\n *\n * @param params - Search parameters (q, code_system, chapter, billable, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search diagnosis codes\n * const results = await client.icd10.search({\n * q: \"diabetes\",\n * code_system: \"CM\",\n * billable: true\n * });\n *\n * // Search procedure codes\n * const results = await client.icd10.search({\n * q: \"bypass\",\n * code_system: \"PCS\"\n * });\n * ```\n */\n async search(\n params: Icd10SearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<Icd10Data>> {\n return this.http.search<SearchResponse<Icd10Data>>(\"/v1/icd10/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { CvxData, CvxSearchParams } from \"../types/cvx.js\";\n\n/**\n * CVX (Vaccine Codes) API endpoint.\n */\nexport class CvxEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single CVX code.\n *\n * @param cvxCode - CVX vaccine code\n * @param options - Response shape and include options\n * @returns CVX data\n *\n * @example\n * ```ts\n * const cvx = await client.cvx.lookup(\"208\");\n * console.log(cvx.data.short_description); // \"COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose\"\n * ```\n */\n async lookup(cvxCode: string, options?: LookupOptions): Promise<ApiResponse<CvxData>> {\n return this.http.get<ApiResponse<CvxData>>(`/v1/cvx/${encodeURIComponent(cvxCode)}`, options);\n }\n\n /**\n * Look up multiple CVX codes in a single request.\n *\n * @param cvxCodes - Array of CVX codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupMany(\n cvxCodes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<CvxData>> {\n return this.http.post<BatchResponse<CvxData>>(\n \"/v1/cvx/_batch\",\n { codes: cvxCodes },\n options\n );\n }\n\n /**\n * Search for vaccine codes.\n *\n * @param params - Search parameters (q, status, vaccine_type, is_covid_vaccine)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search for flu vaccines\n * const results = await client.cvx.search({ q: \"influenza\" });\n *\n * // Find all COVID-19 vaccines\n * const results = await client.cvx.search({\n * is_covid_vaccine: true,\n * status: \"active\"\n * });\n * ```\n */\n async search(\n params: CvxSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<CvxData>> {\n return this.http.search<SearchResponse<CvxData>>(\"/v1/cvx/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { MvxData, MvxSearchParams } from \"../types/mvx.js\";\n\n/**\n * MVX (Vaccine Manufacturer Codes) API endpoint.\n */\nexport class MvxEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up a single MVX code.\n *\n * @param mvxCode - MVX manufacturer code\n * @param options - Response shape and include options\n * @returns MVX data\n *\n * @example\n * ```ts\n * const mvx = await client.mvx.lookup(\"PFR\");\n * console.log(mvx.data.manufacturer_name); // \"Pfizer, Inc\"\n * ```\n */\n async lookup(mvxCode: string, options?: LookupOptions): Promise<ApiResponse<MvxData>> {\n return this.http.get<ApiResponse<MvxData>>(`/v1/mvx/${encodeURIComponent(mvxCode)}`, options);\n }\n\n /**\n * Look up multiple MVX codes in a single request.\n *\n * @param mvxCodes - Array of MVX codes (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each code\n */\n async lookupMany(\n mvxCodes: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<MvxData>> {\n return this.http.post<BatchResponse<MvxData>>(\n \"/v1/mvx/_batch\",\n { codes: mvxCodes },\n options\n );\n }\n\n /**\n * Search for vaccine manufacturers.\n *\n * @param params - Search parameters (q, status)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by name\n * const results = await client.mvx.search({ q: \"pfizer\" });\n *\n * // List all active manufacturers\n * const results = await client.mvx.search({ status: \"active\" });\n * ```\n */\n async search(\n params: MvxSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<MvxData>> {\n return this.http.search<SearchResponse<MvxData>>(\"/v1/mvx/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import type { HttpClient } from \"../http.js\";\nimport type {\n ApiResponse,\n BatchResponse,\n LookupOptions,\n BatchLookupOptions,\n SearchOptions,\n SearchResponse,\n} from \"../types/common.js\";\nimport type { FdaLabelData, FdaLabelSearchParams } from \"../types/fda-labels.js\";\n\n/**\n * FDA Labels API endpoint.\n */\nexport class FdaLabelsEndpoint {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Look up FDA label by Set ID.\n *\n * @param setId - FDA SPL Set ID\n * @param options - Response shape and include options\n * @returns FDA Label data\n *\n * @example\n * ```ts\n * const label = await client.fdaLabels.lookup(\"abc123-def456\");\n * console.log(label.data.indications_and_usage);\n * ```\n */\n async lookup(setId: string, options?: LookupOptions): Promise<ApiResponse<FdaLabelData>> {\n return this.http.get<ApiResponse<FdaLabelData>>(`/v1/fda-labels/${encodeURIComponent(setId)}`, options);\n }\n\n /**\n * Look up FDA label by NDC code.\n *\n * @param ndc - NDC code\n * @param options - Response shape and include options\n * @returns FDA Label data\n *\n * @example\n * ```ts\n * const label = await client.fdaLabels.lookupByNdc(\"0069-0151-01\");\n * console.log(label.data.product_name);\n * ```\n */\n async lookupByNdc(ndc: string, options?: LookupOptions): Promise<ApiResponse<FdaLabelData>> {\n return this.http.get<ApiResponse<FdaLabelData>>(`/v1/fda-labels/ndc/${encodeURIComponent(ndc)}`, options);\n }\n\n /**\n * Look up multiple FDA labels by Set IDs in a single request.\n *\n * @param setIds - Array of Set IDs (max 500)\n * @param options - Response shape, include, and batch options\n * @returns Batch response with results for each Set ID\n */\n async lookupMany(\n setIds: string[],\n options?: BatchLookupOptions\n ): Promise<BatchResponse<FdaLabelData>> {\n return this.http.post<BatchResponse<FdaLabelData>>(\n \"/v1/fda-labels/_batch\",\n { codes: setIds },\n options\n );\n }\n\n /**\n * Search for FDA drug labels.\n *\n * @param params - Search parameters (q, name, brand, substance, manufacturer, etc.)\n * @param options - Pagination and response shape options\n * @returns Search results with facets\n *\n * @example\n * ```ts\n * // Search by drug name\n * const results = await client.fdaLabels.search({ q: \"advil\" });\n *\n * // Search OTC pain relievers\n * const results = await client.fdaLabels.search({\n * substance: \"acetaminophen\",\n * product_type: \"otc\"\n * });\n *\n * // Search by manufacturer\n * const results = await client.fdaLabels.search({\n * manufacturer: \"pfizer\",\n * product_type: \"rx\"\n * });\n * ```\n */\n async search(\n params: FdaLabelSearchParams,\n options?: SearchOptions\n ): Promise<SearchResponse<FdaLabelData>> {\n return this.http.search<SearchResponse<FdaLabelData>>(\"/v1/fda-label/search\", {\n ...params,\n ...options,\n include: options?.include?.join(\",\"),\n });\n }\n}\n","import { HttpClient, TokenManager, type HttpClientConfig } from \"./http.js\";\nimport { NdcEndpoint } from \"./endpoints/ndc.js\";\nimport { NpiEndpoint } from \"./endpoints/npi.js\";\nimport { RxNormEndpoint } from \"./endpoints/rxnorm.js\";\nimport { LoincEndpoint } from \"./endpoints/loinc.js\";\nimport { Icd10Endpoint } from \"./endpoints/icd10.js\";\nimport { CvxEndpoint } from \"./endpoints/cvx.js\";\nimport { MvxEndpoint } from \"./endpoints/mvx.js\";\nimport { FdaLabelsEndpoint } from \"./endpoints/fda-labels.js\";\n\n/**\n * Base configuration options shared by all auth modes.\n */\ninterface FhirflyBaseConfig {\n /**\n * Base URL for the API.\n * @default \"https://api.fhirfly.io\"\n */\n baseUrl?: string;\n\n /**\n * Request timeout in milliseconds.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts for failed requests.\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Base delay between retries in milliseconds (exponential backoff).\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * Configuration using an API key (simple credentials).\n */\nexport interface FhirflyApiKeyConfig extends FhirflyBaseConfig {\n /**\n * Your FHIRfly API key.\n * Get one at https://fhirfly.io/dashboard\n */\n apiKey: string;\n clientId?: never;\n clientSecret?: never;\n tokenUrl?: never;\n scopes?: never;\n}\n\n/**\n * Configuration using OAuth2 client credentials (secure credentials).\n */\nexport interface FhirflyOAuthConfig extends FhirflyBaseConfig {\n /**\n * OAuth2 client ID from your secure credential.\n */\n clientId: string;\n\n /**\n * OAuth2 client secret from your secure credential.\n */\n clientSecret: string;\n\n /**\n * OAuth2 token endpoint URL.\n * @default \"{baseUrl}/oauth2/token\"\n */\n tokenUrl?: string;\n\n /**\n * OAuth2 scopes to request.\n */\n scopes?: string[];\n\n apiKey?: never;\n}\n\n/**\n * Configuration options for the FHIRfly client.\n * Provide either `apiKey` OR `clientId`+`clientSecret`, not both.\n */\nexport type FhirflyConfig = FhirflyApiKeyConfig | FhirflyOAuthConfig;\n\n/**\n * FHIRfly API client.\n *\n * Provides access to healthcare reference data including drug codes (NDC, RxNorm),\n * provider identifiers (NPI), lab codes (LOINC), diagnosis codes (ICD-10),\n * vaccine codes (CVX, MVX), and FDA drug labels.\n *\n * @example\n * ```ts\n * import { Fhirfly } from \"@fhirfly/sdk\";\n *\n * // Option A: API key (simple)\n * const client = new Fhirfly({ apiKey: \"ffly_sk_live_...\" });\n *\n * // Option B: Client credentials (secure)\n * const client = new Fhirfly({\n * clientId: \"ffly_client_...\",\n * clientSecret: \"ffly_secret_...\",\n * });\n *\n * // Look up a drug by NDC\n * const ndc = await client.ndc.lookup(\"0069-0151-01\");\n * console.log(ndc.data.product_name); // \"Lipitor\"\n * ```\n */\nexport class Fhirfly {\n private readonly http: HttpClient;\n\n /**\n * NDC (National Drug Code) lookups.\n */\n readonly ndc: NdcEndpoint;\n\n /**\n * NPI (National Provider Identifier) lookups.\n */\n readonly npi: NpiEndpoint;\n\n /**\n * RxNorm drug terminology lookups.\n */\n readonly rxnorm: RxNormEndpoint;\n\n /**\n * LOINC laboratory and clinical observation code lookups.\n */\n readonly loinc: LoincEndpoint;\n\n /**\n * ICD-10 diagnosis and procedure code lookups.\n */\n readonly icd10: Icd10Endpoint;\n\n /**\n * CVX vaccine code lookups.\n */\n readonly cvx: CvxEndpoint;\n\n /**\n * MVX vaccine manufacturer code lookups.\n */\n readonly mvx: MvxEndpoint;\n\n /**\n * FDA drug label lookups.\n */\n readonly fdaLabels: FdaLabelsEndpoint;\n\n /**\n * Create a new FHIRfly client.\n *\n * @param config - Client configuration (API key or OAuth2 client credentials)\n * @throws {Error} If neither apiKey nor clientId+clientSecret is provided\n */\n constructor(config: FhirflyConfig) {\n const baseUrl = config.baseUrl ?? \"https://api.fhirfly.io\";\n\n let httpConfig: HttpClientConfig;\n\n if (\"apiKey\" in config && config.apiKey) {\n httpConfig = {\n baseUrl,\n auth: { type: \"api-key\", apiKey: config.apiKey },\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n };\n } else if (\"clientId\" in config && config.clientId && config.clientSecret) {\n const tokenManager = new TokenManager({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n tokenUrl: config.tokenUrl ?? `${baseUrl}/oauth2/token`,\n scopes: config.scopes,\n });\n httpConfig = {\n baseUrl,\n auth: { type: \"oauth\", tokenManager },\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n };\n } else {\n throw new Error(\n \"FHIRfly requires either an apiKey or clientId+clientSecret. Get credentials at https://fhirfly.io/dashboard\"\n );\n }\n\n this.http = new HttpClient(httpConfig);\n\n // Initialize endpoints\n this.ndc = new NdcEndpoint(this.http);\n this.npi = new NpiEndpoint(this.http);\n this.rxnorm = new RxNormEndpoint(this.http);\n this.loinc = new LoincEndpoint(this.http);\n this.icd10 = new Icd10Endpoint(this.http);\n this.cvx = new CvxEndpoint(this.http);\n this.mvx = new MvxEndpoint(this.http);\n this.fdaLabels = new FdaLabelsEndpoint(this.http);\n }\n}\n"]}