openfigi-sdk 1.0.3 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -209,11 +209,32 @@ To get an API key, sign up at [OpenFIGI.com](https://www.openfigi.com/).
209
209
 
210
210
  This is a **community-driven project** and contributions are welcome! Please feel free to submit a Pull Request.
211
211
 
212
+ ### Development Workflow
213
+
212
214
  1. Fork the repository
213
215
  2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
214
- 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
215
- 4. Push to the branch (`git push origin feature/AmazingFeature`)
216
- 5. Open a Pull Request
216
+ 3. Make your changes and add tests
217
+ 4. Add a changeset to describe your changes:
218
+ ```bash
219
+ bun run changeset
220
+ ```
221
+ 5. Commit your changes (`git commit -m 'feat: add some amazing feature'`)
222
+ 6. Push to the branch (`git push origin feature/AmazingFeature`)
223
+ 7. Open a Pull Request
224
+
225
+ ### Release Process
226
+
227
+ This project uses [Changesets](https://github.com/changesets/changesets) for version management:
228
+
229
+ - **Adding changes**: Run `bun run changeset` to create a changeset describing your changes
230
+ - **Releasing**: When PRs with changesets are merged to main, a release PR is automatically created
231
+ - **Publishing**: Merging the release PR automatically publishes to npm and creates git tags
232
+
233
+ ### Changeset Types
234
+
235
+ - `patch` - Bug fixes and small improvements
236
+ - `minor` - New features and enhancements
237
+ - `major` - Breaking changes
217
238
 
218
239
  **Note**: This library is maintained by the community and is not affiliated with OpenFIGI or Bloomberg. For official API support, please contact OpenFIGI directly.
219
240
 
package/dist/index.cjs CHANGED
@@ -166,7 +166,7 @@ var DEFAULT_CONFIG = {
166
166
  timeout: 3e4,
167
167
  retryLimit: 3,
168
168
  retryDelay: 1e3,
169
- userAgent: "@openfigi/sdk"
169
+ userAgent: "openfigi-sdk/1.0.3 (+https://github.com/viktorlarsson/openfigi)"
170
170
  };
171
171
  var currentRateLimitInfo;
172
172
  var debugMode = false;
@@ -289,13 +289,28 @@ var createClient = (config = {}) => {
289
289
  }
290
290
  if (status === 400) {
291
291
  const body = await httpError.response?.text();
292
- throw new ValidationError(`Bad request: ${body || "Invalid request format"}`);
292
+ throw new ValidationError(
293
+ `Bad request: ${body || "Invalid request format"}. Please check your request parameters and ensure all required fields are properly formatted.`,
294
+ body
295
+ );
293
296
  }
294
297
  if (status === 401) {
295
- throw new OpenFigiError("Authentication failed. Check your API key.", status);
298
+ throw new OpenFigiError(
299
+ "Authentication failed. Please check your API key. You can get an API key at https://www.openfigi.com/api",
300
+ status
301
+ );
302
+ }
303
+ if (status === 403) {
304
+ throw new OpenFigiError(
305
+ "Access forbidden. Your API key may not have the required permissions for this operation.",
306
+ status
307
+ );
296
308
  }
297
309
  if (status === 404) {
298
- throw new OpenFigiError("Endpoint not found. Please check the API version.", status);
310
+ throw new OpenFigiError(
311
+ "Endpoint not found. Please check the API version or ensure you are using the correct base URL.",
312
+ status
313
+ );
299
314
  }
300
315
  throw new OpenFigiError(
301
316
  `Request failed with status ${status}: ${httpError.message}`,
@@ -312,7 +327,7 @@ var createClient = (config = {}) => {
312
327
  };
313
328
  const searchByISIN2 = async (isin, options) => {
314
329
  if (!isin || typeof isin !== "string") {
315
- throw new ValidationError("ISIN must be a non-empty string");
330
+ throw new ValidationError('ISIN must be a non-empty string. Example: "US0378331005"');
316
331
  }
317
332
  return mappingSingle2({
318
333
  idType: "ID_ISIN",
@@ -322,7 +337,7 @@ var createClient = (config = {}) => {
322
337
  };
323
338
  const searchByCUSIP2 = async (cusip, options) => {
324
339
  if (!cusip || typeof cusip !== "string") {
325
- throw new ValidationError("CUSIP must be a non-empty string");
340
+ throw new ValidationError('CUSIP must be a non-empty string. Example: "037833100"');
326
341
  }
327
342
  return mappingSingle2({
328
343
  idType: "ID_CUSIP",
@@ -332,7 +347,7 @@ var createClient = (config = {}) => {
332
347
  };
333
348
  const searchBySEDOL2 = async (sedol, options) => {
334
349
  if (!sedol || typeof sedol !== "string") {
335
- throw new ValidationError("SEDOL must be a non-empty string");
350
+ throw new ValidationError('SEDOL must be a non-empty string. Example: "2046251"');
336
351
  }
337
352
  return mappingSingle2({
338
353
  idType: "ID_SEDOL",
@@ -342,7 +357,7 @@ var createClient = (config = {}) => {
342
357
  };
343
358
  const searchByTicker2 = async (ticker, exchCode, options) => {
344
359
  if (!ticker || typeof ticker !== "string") {
345
- throw new ValidationError("Ticker must be a non-empty string");
360
+ throw new ValidationError('Ticker must be a non-empty string. Example: "AAPL"');
346
361
  }
347
362
  return mappingSingle2({
348
363
  idType: "ID_EXCH_SYMBOL",
@@ -353,7 +368,7 @@ var createClient = (config = {}) => {
353
368
  };
354
369
  const searchByBloombergId2 = async (bbgId, options) => {
355
370
  if (!bbgId || typeof bbgId !== "string") {
356
- throw new ValidationError("Bloomberg ID must be a non-empty string");
371
+ throw new ValidationError('Bloomberg ID must be a non-empty string. Example: "BBG000B9XRY4"');
357
372
  }
358
373
  return mappingSingle2({
359
374
  idType: "ID_BB_GLOBAL",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/utils/helpers.ts","../src/validators/index.ts","../src/client/client.ts","../src/utils/validators.ts"],"names":["z","ky","mapping","validation","mappingSingle","searchByISIN","searchByCUSIP","searchBySEDOL","searchByTicker","searchByBloombergId","getRateLimitInfo"],"mappings":"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","file":"index.cjs","sourcesContent":["export class OpenFigiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: unknown\n ) {\n super(message)\n this.name = 'OpenFigiError'\n }\n}\n\nexport class RateLimitError extends OpenFigiError {\n constructor(\n message: string,\n public retryAfter?: number,\n statusCode?: number\n ) {\n super(message, statusCode)\n this.name = 'RateLimitError'\n }\n}\n\nexport class ValidationError extends OpenFigiError {\n constructor(\n message: string,\n public errors?: unknown\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function parseRateLimitHeaders(headers: Headers): {\n limit?: number\n remaining?: number\n reset?: Date\n} {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n return {\n limit: limit ? parseInt(limit, 10) : undefined,\n remaining: remaining ? parseInt(remaining, 10) : undefined,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : undefined,\n }\n}\n\nexport function exponentialBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n const delay = Math.min(baseDelay * 2 ** attempt, maxDelay)\n const jitter = Math.random() * 0.1 * delay\n return Math.floor(delay + jitter)\n}\n","import { z } from 'zod'\n\nexport const IdTypeSchema = z.enum([\n 'ID_ISIN',\n 'ID_BB_UNIQUE',\n 'ID_SEDOL',\n 'ID_COMMON',\n 'ID_WERTPAPIER',\n 'ID_CUSIP',\n 'ID_BB',\n 'ID_ITALY',\n 'ID_EXCH_SYMBOL',\n 'ID_FULL_EXCHANGE_SYMBOL',\n 'COMPOSITE_ID_BB_GLOBAL',\n 'ID_BB_GLOBAL_SHARE_CLASS_LEVEL',\n 'ID_BB_GLOBAL',\n 'ID_BB_SEC_NUM_DES',\n 'ID_BB_SEC_NUM',\n 'ID_CINS',\n 'ID_BELGIUM',\n 'ID_DENMARK',\n 'ID_FRANCE',\n 'ID_JAPAN',\n 'ID_LUXEMBOURG',\n 'ID_NETHERLANDS',\n 'ID_POLAND',\n 'ID_PORTUGAL',\n 'ID_SWEDEN',\n 'ID_SHORT_CODE',\n])\n\nexport const SecurityTypeSchema = z.enum([\n 'Common Stock',\n 'Preference',\n 'ADR',\n 'Open-End Fund',\n 'Closed-End Fund',\n 'ETF',\n 'ETN',\n 'Unit',\n 'Mutual Fund',\n 'Money Market',\n 'Commodity',\n 'Currency',\n 'Option',\n 'Index',\n])\n\nexport const MarketSectorSchema = z.enum([\n 'All',\n 'Comdty',\n 'Curncy',\n 'Equity',\n 'Govt',\n 'Corp',\n 'Index',\n 'Money',\n 'Mtge',\n 'Muni',\n 'Pref',\n])\n\nexport const MappingRequestSchema = z.object({\n idType: IdTypeSchema,\n idValue: z.string().min(1),\n exchCode: z.string().optional(),\n micCode: z.string().optional(),\n currency: z.string().length(3).optional(),\n marketSecDes: MarketSectorSchema.optional(),\n securityType: SecurityTypeSchema.optional(),\n securityType2: z.string().optional(),\n includeUnlistedEquities: z.boolean().optional(),\n optionType: z.enum(['Put', 'Call']).optional(),\n strike: z.array(z.number()).optional(),\n contractSize: z.number().optional(),\n coupon: z.array(z.number()).optional(),\n expiration: z.array(z.number()).optional(),\n maturity: z.array(z.number()).optional(),\n stateCode: z.string().length(2).optional(),\n})\n\nexport const FigiResultSchema = z.object({\n figi: z.string(),\n securityType: SecurityTypeSchema.optional(),\n marketSector: MarketSectorSchema.optional(),\n ticker: z.string().optional(),\n name: z.string().optional(),\n exchCode: z.string().optional(),\n shareClassFIGI: z.string().optional(),\n compositeFIGI: z.string().optional(),\n securityType2: z.string().optional(),\n securityDescription: z.string().optional(),\n metadata: z.string().optional(),\n})\n\nexport const MappingResponseSchema = z.object({\n data: z.array(FigiResultSchema).optional(),\n warning: z.string().optional(),\n error: z.string().optional(),\n})\n\nexport const ApiErrorSchema = z.object({\n error: z.string(),\n message: z.string().optional(),\n statusCode: z.number().optional(),\n})\n\nexport const ClientConfigSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n timeout: z.number().positive().optional(),\n retryLimit: z.number().min(0).max(10).optional(),\n retryDelay: z.number().positive().optional(),\n userAgent: z.string().optional(),\n})\n","import ky, { type HTTPError, type KyInstance } from 'ky'\nimport type { ClientConfig, MappingRequest, MappingResponse, RateLimitInfo } from '../types'\nimport { OpenFigiError, RateLimitError, ValidationError } from '../utils/errors'\nimport { exponentialBackoff, parseRateLimitHeaders, sleep } from '../utils/helpers'\nimport { ClientConfigSchema, MappingRequestSchema, MappingResponseSchema } from '../validators'\n\nconst DEFAULT_CONFIG: Required<ClientConfig> = {\n apiKey: '',\n baseUrl: 'https://api.openfigi.com',\n timeout: 30000,\n retryLimit: 3,\n retryDelay: 1000,\n userAgent: '@openfigi/sdk',\n}\n\nlet currentRateLimitInfo: RateLimitInfo | undefined\nlet debugMode = false\n\n/**\n * Enable or disable debug logging\n * @param enabled - Whether to enable debug mode\n */\nexport const setDebugMode = (enabled: boolean) => {\n debugMode = enabled\n}\n\nconst log = (level: 'info' | 'warn' | 'error', message: string, ...args: unknown[]) => {\n if (!debugMode) return\n const prefix = `[@openfigi/sdk] [${level.toUpperCase()}]`\n console[level](prefix, message, ...args)\n}\n\nconst createHttpClient = (config: Required<ClientConfig>): KyInstance => {\n return ky.create({\n prefixUrl: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': config.userAgent,\n ...(config.apiKey && { 'X-OPENFIGI-APIKEY': config.apiKey }),\n },\n retry: {\n limit: config.retryLimit,\n methods: ['get', 'post'],\n statusCodes: [408, 413, 429, 500, 502, 503, 504],\n },\n hooks: {\n beforeRequest: [\n (request) => {\n log('info', `Request: ${request.method} ${request.url}`)\n },\n ],\n beforeRetry: [\n async ({ error, retryCount }) => {\n const delay = exponentialBackoff(retryCount, config.retryDelay)\n log('warn', `Retry attempt ${retryCount} after ${delay}ms`, error.message)\n await sleep(delay)\n },\n ],\n afterResponse: [\n (_request, _options, response) => {\n const { limit, remaining, reset } = parseRateLimitHeaders(response.headers)\n if (limit !== undefined && remaining !== undefined && reset) {\n currentRateLimitInfo = { limit, remaining, reset }\n log('info', `Rate limit: ${remaining}/${limit} (resets: ${reset.toISOString()})`)\n }\n log('info', `Response: ${response.status} ${response.statusText}`)\n return response\n },\n ],\n },\n })\n}\n\n/**\n * Creates an OpenFIGI client with custom configuration\n *\n * @param config - Client configuration options\n * @returns An OpenFIGI client instance with all available methods\n *\n * @example\n * ```typescript\n * const client = createClient({\n * apiKey: 'your-api-key',\n * timeout: 60000\n * })\n * ```\n */\nexport const createClient = (config: ClientConfig = {}) => {\n const validation = ClientConfigSchema.safeParse(config)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(`Invalid client configuration: ${errors}`, validation.error)\n }\n\n const finalConfig = { ...DEFAULT_CONFIG, ...config }\n const httpClient = createHttpClient(finalConfig)\n\n /**\n * Map multiple identifiers to FIGIs in a single request\n *\n * @param requests - Array of mapping requests (max 100)\n * @returns Array of mapping responses in the same order as requests\n * @throws {ValidationError} If requests are invalid\n * @throws {RateLimitError} If rate limit is exceeded\n * @throws {OpenFigiError} If API returns an error\n *\n * @example\n * ```typescript\n * const responses = await mapping([\n * { idType: 'ID_ISIN', idValue: 'US0378331005' },\n * { idType: 'ID_CUSIP', idValue: '037833100' }\n * ])\n * ```\n */\n const mapping = async (requests: MappingRequest[]): Promise<MappingResponse[]> => {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Requests must be a non-empty array. Provide at least one mapping request.'\n )\n }\n\n if (requests.length > 100) {\n throw new ValidationError(\n `Too many requests: ${requests.length}. Maximum 100 requests allowed per call. Split into multiple batches.`\n )\n }\n\n const validatedRequests = requests.map((req, index) => {\n const validation = MappingRequestSchema.safeParse(req)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(\n `Invalid mapping request at index ${index}: ${errors}`,\n validation.error\n )\n }\n return validation.data\n })\n\n try {\n log('info', `Mapping ${validatedRequests.length} identifier(s)`)\n const response = await httpClient.post('v3/mapping', {\n json: validatedRequests,\n })\n\n const data = (await response.json()) as unknown\n\n if (!Array.isArray(data)) {\n throw new OpenFigiError(\n `Invalid API response: expected array but got ${typeof data}`,\n response.status,\n data\n )\n }\n\n const validatedResponses = data.map((item, index) => {\n const validation = MappingResponseSchema.safeParse(item)\n if (!validation.success) {\n log('warn', `Invalid response at index ${index}:`, item, validation.error)\n return item as MappingResponse\n }\n return validation.data\n })\n\n log('info', `Mapped ${validatedResponses.length} identifier(s) successfully`)\n return validatedResponses\n } catch (error) {\n if (error instanceof OpenFigiError) {\n throw error\n }\n\n if (error instanceof Error && 'response' in error) {\n const httpError = error as HTTPError\n const status = httpError.response?.status\n\n if (status === 429) {\n const retryAfter = httpError.response?.headers?.get('retry-after')\n throw new RateLimitError(\n 'Rate limit exceeded. Please wait before making more requests.',\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n status\n )\n }\n\n if (status === 400) {\n const body = await httpError.response?.text()\n throw new ValidationError(`Bad request: ${body || 'Invalid request format'}`)\n }\n\n if (status === 401) {\n throw new OpenFigiError('Authentication failed. Check your API key.', status)\n }\n\n if (status === 404) {\n throw new OpenFigiError('Endpoint not found. Please check the API version.', status)\n }\n\n throw new OpenFigiError(\n `Request failed with status ${status}: ${httpError.message}`,\n status,\n await httpError.response?.text()\n )\n }\n\n throw new OpenFigiError('Unexpected error occurred', undefined, error)\n }\n }\n\n /**\n * Map a single identifier to FIGI\n *\n * @param request - Single mapping request\n * @returns Mapping response\n *\n * @example\n * ```typescript\n * const response = await mappingSingle({\n * idType: 'ID_ISIN',\n * idValue: 'US0378331005'\n * })\n * ```\n */\n const mappingSingle = async (request: MappingRequest): Promise<MappingResponse> => {\n const responses = await mapping([request])\n return responses[0]\n }\n\n /**\n * Search for FIGI by ISIN\n *\n * @param isin - ISIN identifier (e.g., 'US0378331005')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByISIN('US0378331005')\n * if (result.data) {\n * console.log('FIGI:', result.data[0].figi)\n * }\n * ```\n */\n const searchByISIN = async (\n isin: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!isin || typeof isin !== 'string') {\n throw new ValidationError('ISIN must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_ISIN',\n idValue: isin.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by CUSIP\n *\n * @param cusip - CUSIP identifier (e.g., '037833100')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByCUSIP = async (\n cusip: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!cusip || typeof cusip !== 'string') {\n throw new ValidationError('CUSIP must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_CUSIP',\n idValue: cusip.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by SEDOL\n *\n * @param sedol - SEDOL identifier (e.g., '2046251')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchBySEDOL = async (\n sedol: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!sedol || typeof sedol !== 'string') {\n throw new ValidationError('SEDOL must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_SEDOL',\n idValue: sedol.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by ticker symbol\n *\n * @param ticker - Ticker symbol (e.g., 'AAPL')\n * @param exchCode - Optional exchange code (e.g., 'US')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByTicker('AAPL', 'US')\n * ```\n */\n const searchByTicker = async (\n ticker: string,\n exchCode?: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!ticker || typeof ticker !== 'string') {\n throw new ValidationError('Ticker must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_EXCH_SYMBOL',\n idValue: ticker.trim().toUpperCase(),\n exchCode: exchCode?.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by Bloomberg ID\n *\n * @param bbgId - Bloomberg Global ID (e.g., 'BBG000B9XRY4')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByBloombergId = async (\n bbgId: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!bbgId || typeof bbgId !== 'string') {\n throw new ValidationError('Bloomberg ID must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_BB_GLOBAL',\n idValue: bbgId.trim(),\n ...options,\n })\n }\n\n /**\n * Get current rate limit information\n *\n * @returns Rate limit info if available, undefined if no requests made yet\n *\n * @example\n * ```typescript\n * const rateLimit = getRateLimitInfo()\n * if (rateLimit) {\n * console.log(`${rateLimit.remaining} requests remaining`)\n * }\n * ```\n */\n const getRateLimitInfo = (): RateLimitInfo | undefined => {\n return currentRateLimitInfo\n }\n\n return {\n mapping,\n mappingSingle,\n searchByISIN,\n searchByCUSIP,\n searchBySEDOL,\n searchByTicker,\n searchByBloombergId,\n getRateLimitInfo,\n }\n}\n\n// Export standalone functions with default client\nconst defaultClient = createClient()\n\nexport const mapping = defaultClient.mapping\nexport const mappingSingle = defaultClient.mappingSingle\nexport const searchByISIN = defaultClient.searchByISIN\nexport const searchByCUSIP = defaultClient.searchByCUSIP\nexport const searchBySEDOL = defaultClient.searchBySEDOL\nexport const searchByTicker = defaultClient.searchByTicker\nexport const searchByBloombergId = defaultClient.searchByBloombergId\nexport const getRateLimitInfo = defaultClient.getRateLimitInfo\n","/**\n * Validate ISIN format (12 characters, alphanumeric)\n */\nexport const isValidISIN = (isin: string): boolean => {\n return /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/.test(isin)\n}\n\n/**\n * Validate CUSIP format (9 characters, alphanumeric)\n */\nexport const isValidCUSIP = (cusip: string): boolean => {\n return /^[A-Z0-9]{9}$/.test(cusip)\n}\n\n/**\n * Validate SEDOL format (7 characters, alphanumeric)\n */\nexport const isValidSEDOL = (sedol: string): boolean => {\n return /^[A-Z0-9]{7}$/.test(sedol)\n}\n\n/**\n * Validate Bloomberg ID format (starts with BBG)\n */\nexport const isValidBloombergId = (bbgId: string): boolean => {\n return /^BBG[A-Z0-9]{9}$/.test(bbgId)\n}\n\n/**\n * Split array into batches of specified size\n * Useful for splitting large arrays for batch processing\n */\nexport const batchArray = <T>(array: T[], batchSize: number): T[][] => {\n const batches: T[][] = []\n for (let i = 0; i < array.length; i += batchSize) {\n batches.push(array.slice(i, i + batchSize))\n }\n return batches\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/utils/helpers.ts","../src/validators/index.ts","../src/client/client.ts","../src/utils/validators.ts"],"names":["z","ky","mapping","validation","mappingSingle","searchByISIN","searchByCUSIP","searchBySEDOL","searchByTicker","searchByBloombergId","getRateLimitInfo"],"mappings":"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","file":"index.cjs","sourcesContent":["export class OpenFigiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: unknown\n ) {\n super(message)\n this.name = 'OpenFigiError'\n }\n}\n\nexport class RateLimitError extends OpenFigiError {\n constructor(\n message: string,\n public retryAfter?: number,\n statusCode?: number\n ) {\n super(message, statusCode)\n this.name = 'RateLimitError'\n }\n}\n\nexport class ValidationError extends OpenFigiError {\n constructor(\n message: string,\n public errors?: unknown\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function parseRateLimitHeaders(headers: Headers): {\n limit?: number\n remaining?: number\n reset?: Date\n} {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n return {\n limit: limit ? parseInt(limit, 10) : undefined,\n remaining: remaining ? parseInt(remaining, 10) : undefined,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : undefined,\n }\n}\n\nexport function exponentialBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n const delay = Math.min(baseDelay * 2 ** attempt, maxDelay)\n const jitter = Math.random() * 0.1 * delay\n return Math.floor(delay + jitter)\n}\n","import { z } from 'zod'\n\nexport const IdTypeSchema = z.enum([\n 'ID_ISIN',\n 'ID_BB_UNIQUE',\n 'ID_SEDOL',\n 'ID_COMMON',\n 'ID_WERTPAPIER',\n 'ID_CUSIP',\n 'ID_BB',\n 'ID_ITALY',\n 'ID_EXCH_SYMBOL',\n 'ID_FULL_EXCHANGE_SYMBOL',\n 'COMPOSITE_ID_BB_GLOBAL',\n 'ID_BB_GLOBAL_SHARE_CLASS_LEVEL',\n 'ID_BB_GLOBAL',\n 'ID_BB_SEC_NUM_DES',\n 'ID_BB_SEC_NUM',\n 'ID_CINS',\n 'ID_BELGIUM',\n 'ID_DENMARK',\n 'ID_FRANCE',\n 'ID_JAPAN',\n 'ID_LUXEMBOURG',\n 'ID_NETHERLANDS',\n 'ID_POLAND',\n 'ID_PORTUGAL',\n 'ID_SWEDEN',\n 'ID_SHORT_CODE',\n])\n\nexport const SecurityTypeSchema = z.enum([\n 'Common Stock',\n 'Preference',\n 'ADR',\n 'Open-End Fund',\n 'Closed-End Fund',\n 'ETF',\n 'ETN',\n 'Unit',\n 'Mutual Fund',\n 'Money Market',\n 'Commodity',\n 'Currency',\n 'Option',\n 'Index',\n])\n\nexport const MarketSectorSchema = z.enum([\n 'All',\n 'Comdty',\n 'Curncy',\n 'Equity',\n 'Govt',\n 'Corp',\n 'Index',\n 'Money',\n 'Mtge',\n 'Muni',\n 'Pref',\n])\n\nexport const MappingRequestSchema = z.object({\n idType: IdTypeSchema,\n idValue: z.string().min(1),\n exchCode: z.string().optional(),\n micCode: z.string().optional(),\n currency: z.string().length(3).optional(),\n marketSecDes: MarketSectorSchema.optional(),\n securityType: SecurityTypeSchema.optional(),\n securityType2: z.string().optional(),\n includeUnlistedEquities: z.boolean().optional(),\n optionType: z.enum(['Put', 'Call']).optional(),\n strike: z.array(z.number()).optional(),\n contractSize: z.number().optional(),\n coupon: z.array(z.number()).optional(),\n expiration: z.array(z.number()).optional(),\n maturity: z.array(z.number()).optional(),\n stateCode: z.string().length(2).optional(),\n})\n\nexport const FigiResultSchema = z.object({\n figi: z.string(),\n securityType: SecurityTypeSchema.optional(),\n marketSector: MarketSectorSchema.optional(),\n ticker: z.string().optional(),\n name: z.string().optional(),\n exchCode: z.string().optional(),\n shareClassFIGI: z.string().optional(),\n compositeFIGI: z.string().optional(),\n securityType2: z.string().optional(),\n securityDescription: z.string().optional(),\n metadata: z.string().optional(),\n})\n\nexport const MappingResponseSchema = z.object({\n data: z.array(FigiResultSchema).optional(),\n warning: z.string().optional(),\n error: z.string().optional(),\n})\n\nexport const ApiErrorSchema = z.object({\n error: z.string(),\n message: z.string().optional(),\n statusCode: z.number().optional(),\n})\n\nexport const ClientConfigSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n timeout: z.number().positive().optional(),\n retryLimit: z.number().min(0).max(10).optional(),\n retryDelay: z.number().positive().optional(),\n userAgent: z.string().optional(),\n})\n","import ky, { type HTTPError, type KyInstance } from 'ky'\nimport type { ClientConfig, MappingRequest, MappingResponse, RateLimitInfo } from '../types'\nimport { OpenFigiError, RateLimitError, ValidationError } from '../utils/errors'\nimport { exponentialBackoff, parseRateLimitHeaders, sleep } from '../utils/helpers'\nimport { ClientConfigSchema, MappingRequestSchema, MappingResponseSchema } from '../validators'\n\nconst DEFAULT_CONFIG: Required<ClientConfig> = {\n apiKey: '',\n baseUrl: 'https://api.openfigi.com',\n timeout: 30000,\n retryLimit: 3,\n retryDelay: 1000,\n userAgent: 'openfigi-sdk/1.0.3 (+https://github.com/viktorlarsson/openfigi)',\n}\n\nlet currentRateLimitInfo: RateLimitInfo | undefined\nlet debugMode = false\n\n/**\n * Enable or disable debug logging\n * @param enabled - Whether to enable debug mode\n */\nexport const setDebugMode = (enabled: boolean) => {\n debugMode = enabled\n}\n\nconst log = (level: 'info' | 'warn' | 'error', message: string, ...args: unknown[]) => {\n if (!debugMode) return\n const prefix = `[@openfigi/sdk] [${level.toUpperCase()}]`\n console[level](prefix, message, ...args)\n}\n\nconst createHttpClient = (config: Required<ClientConfig>): KyInstance => {\n return ky.create({\n prefixUrl: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': config.userAgent,\n ...(config.apiKey && { 'X-OPENFIGI-APIKEY': config.apiKey }),\n },\n retry: {\n limit: config.retryLimit,\n methods: ['get', 'post'],\n statusCodes: [408, 413, 429, 500, 502, 503, 504],\n },\n hooks: {\n beforeRequest: [\n (request) => {\n log('info', `Request: ${request.method} ${request.url}`)\n },\n ],\n beforeRetry: [\n async ({ error, retryCount }) => {\n const delay = exponentialBackoff(retryCount, config.retryDelay)\n log('warn', `Retry attempt ${retryCount} after ${delay}ms`, error.message)\n await sleep(delay)\n },\n ],\n afterResponse: [\n (_request, _options, response) => {\n const { limit, remaining, reset } = parseRateLimitHeaders(response.headers)\n if (limit !== undefined && remaining !== undefined && reset) {\n currentRateLimitInfo = { limit, remaining, reset }\n log('info', `Rate limit: ${remaining}/${limit} (resets: ${reset.toISOString()})`)\n }\n log('info', `Response: ${response.status} ${response.statusText}`)\n return response\n },\n ],\n },\n })\n}\n\n/**\n * Creates an OpenFIGI client with custom configuration\n *\n * @param config - Client configuration options\n * @returns An OpenFIGI client instance with all available methods\n *\n * @example\n * ```typescript\n * const client = createClient({\n * apiKey: 'your-api-key',\n * timeout: 60000\n * })\n * ```\n */\nexport const createClient = (config: ClientConfig = {}) => {\n const validation = ClientConfigSchema.safeParse(config)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(`Invalid client configuration: ${errors}`, validation.error)\n }\n\n const finalConfig = { ...DEFAULT_CONFIG, ...config }\n const httpClient = createHttpClient(finalConfig)\n\n /**\n * Map multiple identifiers to FIGIs in a single request\n *\n * @param requests - Array of mapping requests (max 100)\n * @returns Array of mapping responses in the same order as requests\n * @throws {ValidationError} If requests are invalid\n * @throws {RateLimitError} If rate limit is exceeded\n * @throws {OpenFigiError} If API returns an error\n *\n * @example\n * ```typescript\n * const responses = await mapping([\n * { idType: 'ID_ISIN', idValue: 'US0378331005' },\n * { idType: 'ID_CUSIP', idValue: '037833100' }\n * ])\n * ```\n */\n const mapping = async (requests: MappingRequest[]): Promise<MappingResponse[]> => {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Requests must be a non-empty array. Provide at least one mapping request.'\n )\n }\n\n if (requests.length > 100) {\n throw new ValidationError(\n `Too many requests: ${requests.length}. Maximum 100 requests allowed per call. Split into multiple batches.`\n )\n }\n\n const validatedRequests = requests.map((req, index) => {\n const validation = MappingRequestSchema.safeParse(req)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(\n `Invalid mapping request at index ${index}: ${errors}`,\n validation.error\n )\n }\n return validation.data\n })\n\n try {\n log('info', `Mapping ${validatedRequests.length} identifier(s)`)\n const response = await httpClient.post('v3/mapping', {\n json: validatedRequests,\n })\n\n const data = (await response.json()) as unknown\n\n if (!Array.isArray(data)) {\n throw new OpenFigiError(\n `Invalid API response: expected array but got ${typeof data}`,\n response.status,\n data\n )\n }\n\n const validatedResponses = data.map((item, index) => {\n const validation = MappingResponseSchema.safeParse(item)\n if (!validation.success) {\n log('warn', `Invalid response at index ${index}:`, item, validation.error)\n return item as MappingResponse\n }\n return validation.data\n })\n\n log('info', `Mapped ${validatedResponses.length} identifier(s) successfully`)\n return validatedResponses\n } catch (error) {\n if (error instanceof OpenFigiError) {\n throw error\n }\n\n if (error instanceof Error && 'response' in error) {\n const httpError = error as HTTPError\n const status = httpError.response?.status\n\n if (status === 429) {\n const retryAfter = httpError.response?.headers?.get('retry-after')\n throw new RateLimitError(\n 'Rate limit exceeded. Please wait before making more requests.',\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n status\n )\n }\n\n if (status === 400) {\n const body = await httpError.response?.text()\n throw new ValidationError(\n `Bad request: ${body || 'Invalid request format'}. Please check your request parameters and ensure all required fields are properly formatted.`,\n body\n )\n }\n\n if (status === 401) {\n throw new OpenFigiError(\n 'Authentication failed. Please check your API key. You can get an API key at https://www.openfigi.com/api',\n status\n )\n }\n\n if (status === 403) {\n throw new OpenFigiError(\n 'Access forbidden. Your API key may not have the required permissions for this operation.',\n status\n )\n }\n\n if (status === 404) {\n throw new OpenFigiError(\n 'Endpoint not found. Please check the API version or ensure you are using the correct base URL.',\n status\n )\n }\n\n throw new OpenFigiError(\n `Request failed with status ${status}: ${httpError.message}`,\n status,\n await httpError.response?.text()\n )\n }\n\n throw new OpenFigiError('Unexpected error occurred', undefined, error)\n }\n }\n\n /**\n * Map a single identifier to FIGI\n *\n * @param request - Single mapping request\n * @returns Mapping response\n *\n * @example\n * ```typescript\n * const response = await mappingSingle({\n * idType: 'ID_ISIN',\n * idValue: 'US0378331005'\n * })\n * ```\n */\n const mappingSingle = async (request: MappingRequest): Promise<MappingResponse> => {\n const responses = await mapping([request])\n return responses[0]\n }\n\n /**\n * Search for FIGI by ISIN\n *\n * @param isin - ISIN identifier (e.g., 'US0378331005')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByISIN('US0378331005')\n * if (result.data) {\n * console.log('FIGI:', result.data[0].figi)\n * }\n * ```\n */\n const searchByISIN = async (\n isin: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!isin || typeof isin !== 'string') {\n throw new ValidationError('ISIN must be a non-empty string. Example: \"US0378331005\"')\n }\n return mappingSingle({\n idType: 'ID_ISIN',\n idValue: isin.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by CUSIP\n *\n * @param cusip - CUSIP identifier (e.g., '037833100')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByCUSIP = async (\n cusip: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!cusip || typeof cusip !== 'string') {\n throw new ValidationError('CUSIP must be a non-empty string. Example: \"037833100\"')\n }\n return mappingSingle({\n idType: 'ID_CUSIP',\n idValue: cusip.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by SEDOL\n *\n * @param sedol - SEDOL identifier (e.g., '2046251')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchBySEDOL = async (\n sedol: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!sedol || typeof sedol !== 'string') {\n throw new ValidationError('SEDOL must be a non-empty string. Example: \"2046251\"')\n }\n return mappingSingle({\n idType: 'ID_SEDOL',\n idValue: sedol.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by ticker symbol\n *\n * @param ticker - Ticker symbol (e.g., 'AAPL')\n * @param exchCode - Optional exchange code (e.g., 'US')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByTicker('AAPL', 'US')\n * ```\n */\n const searchByTicker = async (\n ticker: string,\n exchCode?: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!ticker || typeof ticker !== 'string') {\n throw new ValidationError('Ticker must be a non-empty string. Example: \"AAPL\"')\n }\n return mappingSingle({\n idType: 'ID_EXCH_SYMBOL',\n idValue: ticker.trim().toUpperCase(),\n exchCode: exchCode?.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by Bloomberg ID\n *\n * @param bbgId - Bloomberg Global ID (e.g., 'BBG000B9XRY4')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByBloombergId = async (\n bbgId: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!bbgId || typeof bbgId !== 'string') {\n throw new ValidationError('Bloomberg ID must be a non-empty string. Example: \"BBG000B9XRY4\"')\n }\n return mappingSingle({\n idType: 'ID_BB_GLOBAL',\n idValue: bbgId.trim(),\n ...options,\n })\n }\n\n /**\n * Get current rate limit information\n *\n * @returns Rate limit info if available, undefined if no requests made yet\n *\n * @example\n * ```typescript\n * const rateLimit = getRateLimitInfo()\n * if (rateLimit) {\n * console.log(`${rateLimit.remaining} requests remaining`)\n * }\n * ```\n */\n const getRateLimitInfo = (): RateLimitInfo | undefined => {\n return currentRateLimitInfo\n }\n\n return {\n mapping,\n mappingSingle,\n searchByISIN,\n searchByCUSIP,\n searchBySEDOL,\n searchByTicker,\n searchByBloombergId,\n getRateLimitInfo,\n }\n}\n\n// Export standalone functions with default client\nconst defaultClient = createClient()\n\nexport const mapping = defaultClient.mapping\nexport const mappingSingle = defaultClient.mappingSingle\nexport const searchByISIN = defaultClient.searchByISIN\nexport const searchByCUSIP = defaultClient.searchByCUSIP\nexport const searchBySEDOL = defaultClient.searchBySEDOL\nexport const searchByTicker = defaultClient.searchByTicker\nexport const searchByBloombergId = defaultClient.searchByBloombergId\nexport const getRateLimitInfo = defaultClient.getRateLimitInfo\n","/**\n * Validate ISIN format (12 characters, alphanumeric)\n */\nexport const isValidISIN = (isin: string): boolean => {\n return /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/.test(isin)\n}\n\n/**\n * Validate CUSIP format (9 characters, alphanumeric)\n */\nexport const isValidCUSIP = (cusip: string): boolean => {\n return /^[A-Z0-9]{9}$/.test(cusip)\n}\n\n/**\n * Validate SEDOL format (7 characters, alphanumeric)\n */\nexport const isValidSEDOL = (sedol: string): boolean => {\n return /^[A-Z0-9]{7}$/.test(sedol)\n}\n\n/**\n * Validate Bloomberg ID format (starts with BBG)\n */\nexport const isValidBloombergId = (bbgId: string): boolean => {\n return /^BBG[A-Z0-9]{9}$/.test(bbgId)\n}\n\n/**\n * Split array into batches of specified size\n * Useful for splitting large arrays for batch processing\n */\nexport const batchArray = <T>(array: T[], batchSize: number): T[][] => {\n const batches: T[][] = []\n for (let i = 0; i < array.length; i += batchSize) {\n batches.push(array.slice(i, i + batchSize))\n }\n return batches\n}\n"]}
package/dist/index.js CHANGED
@@ -160,7 +160,7 @@ var DEFAULT_CONFIG = {
160
160
  timeout: 3e4,
161
161
  retryLimit: 3,
162
162
  retryDelay: 1e3,
163
- userAgent: "@openfigi/sdk"
163
+ userAgent: "openfigi-sdk/1.0.3 (+https://github.com/viktorlarsson/openfigi)"
164
164
  };
165
165
  var currentRateLimitInfo;
166
166
  var debugMode = false;
@@ -283,13 +283,28 @@ var createClient = (config = {}) => {
283
283
  }
284
284
  if (status === 400) {
285
285
  const body = await httpError.response?.text();
286
- throw new ValidationError(`Bad request: ${body || "Invalid request format"}`);
286
+ throw new ValidationError(
287
+ `Bad request: ${body || "Invalid request format"}. Please check your request parameters and ensure all required fields are properly formatted.`,
288
+ body
289
+ );
287
290
  }
288
291
  if (status === 401) {
289
- throw new OpenFigiError("Authentication failed. Check your API key.", status);
292
+ throw new OpenFigiError(
293
+ "Authentication failed. Please check your API key. You can get an API key at https://www.openfigi.com/api",
294
+ status
295
+ );
296
+ }
297
+ if (status === 403) {
298
+ throw new OpenFigiError(
299
+ "Access forbidden. Your API key may not have the required permissions for this operation.",
300
+ status
301
+ );
290
302
  }
291
303
  if (status === 404) {
292
- throw new OpenFigiError("Endpoint not found. Please check the API version.", status);
304
+ throw new OpenFigiError(
305
+ "Endpoint not found. Please check the API version or ensure you are using the correct base URL.",
306
+ status
307
+ );
293
308
  }
294
309
  throw new OpenFigiError(
295
310
  `Request failed with status ${status}: ${httpError.message}`,
@@ -306,7 +321,7 @@ var createClient = (config = {}) => {
306
321
  };
307
322
  const searchByISIN2 = async (isin, options) => {
308
323
  if (!isin || typeof isin !== "string") {
309
- throw new ValidationError("ISIN must be a non-empty string");
324
+ throw new ValidationError('ISIN must be a non-empty string. Example: "US0378331005"');
310
325
  }
311
326
  return mappingSingle2({
312
327
  idType: "ID_ISIN",
@@ -316,7 +331,7 @@ var createClient = (config = {}) => {
316
331
  };
317
332
  const searchByCUSIP2 = async (cusip, options) => {
318
333
  if (!cusip || typeof cusip !== "string") {
319
- throw new ValidationError("CUSIP must be a non-empty string");
334
+ throw new ValidationError('CUSIP must be a non-empty string. Example: "037833100"');
320
335
  }
321
336
  return mappingSingle2({
322
337
  idType: "ID_CUSIP",
@@ -326,7 +341,7 @@ var createClient = (config = {}) => {
326
341
  };
327
342
  const searchBySEDOL2 = async (sedol, options) => {
328
343
  if (!sedol || typeof sedol !== "string") {
329
- throw new ValidationError("SEDOL must be a non-empty string");
344
+ throw new ValidationError('SEDOL must be a non-empty string. Example: "2046251"');
330
345
  }
331
346
  return mappingSingle2({
332
347
  idType: "ID_SEDOL",
@@ -336,7 +351,7 @@ var createClient = (config = {}) => {
336
351
  };
337
352
  const searchByTicker2 = async (ticker, exchCode, options) => {
338
353
  if (!ticker || typeof ticker !== "string") {
339
- throw new ValidationError("Ticker must be a non-empty string");
354
+ throw new ValidationError('Ticker must be a non-empty string. Example: "AAPL"');
340
355
  }
341
356
  return mappingSingle2({
342
357
  idType: "ID_EXCH_SYMBOL",
@@ -347,7 +362,7 @@ var createClient = (config = {}) => {
347
362
  };
348
363
  const searchByBloombergId2 = async (bbgId, options) => {
349
364
  if (!bbgId || typeof bbgId !== "string") {
350
- throw new ValidationError("Bloomberg ID must be a non-empty string");
365
+ throw new ValidationError('Bloomberg ID must be a non-empty string. Example: "BBG000B9XRY4"');
351
366
  }
352
367
  return mappingSingle2({
353
368
  idType: "ID_BB_GLOBAL",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/utils/helpers.ts","../src/validators/index.ts","../src/client/client.ts","../src/utils/validators.ts"],"names":["mapping","validation","mappingSingle","searchByISIN","searchByCUSIP","searchBySEDOL","searchByTicker","searchByBloombergId","getRateLimitInfo"],"mappings":"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","file":"index.js","sourcesContent":["export class OpenFigiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: unknown\n ) {\n super(message)\n this.name = 'OpenFigiError'\n }\n}\n\nexport class RateLimitError extends OpenFigiError {\n constructor(\n message: string,\n public retryAfter?: number,\n statusCode?: number\n ) {\n super(message, statusCode)\n this.name = 'RateLimitError'\n }\n}\n\nexport class ValidationError extends OpenFigiError {\n constructor(\n message: string,\n public errors?: unknown\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function parseRateLimitHeaders(headers: Headers): {\n limit?: number\n remaining?: number\n reset?: Date\n} {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n return {\n limit: limit ? parseInt(limit, 10) : undefined,\n remaining: remaining ? parseInt(remaining, 10) : undefined,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : undefined,\n }\n}\n\nexport function exponentialBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n const delay = Math.min(baseDelay * 2 ** attempt, maxDelay)\n const jitter = Math.random() * 0.1 * delay\n return Math.floor(delay + jitter)\n}\n","import { z } from 'zod'\n\nexport const IdTypeSchema = z.enum([\n 'ID_ISIN',\n 'ID_BB_UNIQUE',\n 'ID_SEDOL',\n 'ID_COMMON',\n 'ID_WERTPAPIER',\n 'ID_CUSIP',\n 'ID_BB',\n 'ID_ITALY',\n 'ID_EXCH_SYMBOL',\n 'ID_FULL_EXCHANGE_SYMBOL',\n 'COMPOSITE_ID_BB_GLOBAL',\n 'ID_BB_GLOBAL_SHARE_CLASS_LEVEL',\n 'ID_BB_GLOBAL',\n 'ID_BB_SEC_NUM_DES',\n 'ID_BB_SEC_NUM',\n 'ID_CINS',\n 'ID_BELGIUM',\n 'ID_DENMARK',\n 'ID_FRANCE',\n 'ID_JAPAN',\n 'ID_LUXEMBOURG',\n 'ID_NETHERLANDS',\n 'ID_POLAND',\n 'ID_PORTUGAL',\n 'ID_SWEDEN',\n 'ID_SHORT_CODE',\n])\n\nexport const SecurityTypeSchema = z.enum([\n 'Common Stock',\n 'Preference',\n 'ADR',\n 'Open-End Fund',\n 'Closed-End Fund',\n 'ETF',\n 'ETN',\n 'Unit',\n 'Mutual Fund',\n 'Money Market',\n 'Commodity',\n 'Currency',\n 'Option',\n 'Index',\n])\n\nexport const MarketSectorSchema = z.enum([\n 'All',\n 'Comdty',\n 'Curncy',\n 'Equity',\n 'Govt',\n 'Corp',\n 'Index',\n 'Money',\n 'Mtge',\n 'Muni',\n 'Pref',\n])\n\nexport const MappingRequestSchema = z.object({\n idType: IdTypeSchema,\n idValue: z.string().min(1),\n exchCode: z.string().optional(),\n micCode: z.string().optional(),\n currency: z.string().length(3).optional(),\n marketSecDes: MarketSectorSchema.optional(),\n securityType: SecurityTypeSchema.optional(),\n securityType2: z.string().optional(),\n includeUnlistedEquities: z.boolean().optional(),\n optionType: z.enum(['Put', 'Call']).optional(),\n strike: z.array(z.number()).optional(),\n contractSize: z.number().optional(),\n coupon: z.array(z.number()).optional(),\n expiration: z.array(z.number()).optional(),\n maturity: z.array(z.number()).optional(),\n stateCode: z.string().length(2).optional(),\n})\n\nexport const FigiResultSchema = z.object({\n figi: z.string(),\n securityType: SecurityTypeSchema.optional(),\n marketSector: MarketSectorSchema.optional(),\n ticker: z.string().optional(),\n name: z.string().optional(),\n exchCode: z.string().optional(),\n shareClassFIGI: z.string().optional(),\n compositeFIGI: z.string().optional(),\n securityType2: z.string().optional(),\n securityDescription: z.string().optional(),\n metadata: z.string().optional(),\n})\n\nexport const MappingResponseSchema = z.object({\n data: z.array(FigiResultSchema).optional(),\n warning: z.string().optional(),\n error: z.string().optional(),\n})\n\nexport const ApiErrorSchema = z.object({\n error: z.string(),\n message: z.string().optional(),\n statusCode: z.number().optional(),\n})\n\nexport const ClientConfigSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n timeout: z.number().positive().optional(),\n retryLimit: z.number().min(0).max(10).optional(),\n retryDelay: z.number().positive().optional(),\n userAgent: z.string().optional(),\n})\n","import ky, { type HTTPError, type KyInstance } from 'ky'\nimport type { ClientConfig, MappingRequest, MappingResponse, RateLimitInfo } from '../types'\nimport { OpenFigiError, RateLimitError, ValidationError } from '../utils/errors'\nimport { exponentialBackoff, parseRateLimitHeaders, sleep } from '../utils/helpers'\nimport { ClientConfigSchema, MappingRequestSchema, MappingResponseSchema } from '../validators'\n\nconst DEFAULT_CONFIG: Required<ClientConfig> = {\n apiKey: '',\n baseUrl: 'https://api.openfigi.com',\n timeout: 30000,\n retryLimit: 3,\n retryDelay: 1000,\n userAgent: '@openfigi/sdk',\n}\n\nlet currentRateLimitInfo: RateLimitInfo | undefined\nlet debugMode = false\n\n/**\n * Enable or disable debug logging\n * @param enabled - Whether to enable debug mode\n */\nexport const setDebugMode = (enabled: boolean) => {\n debugMode = enabled\n}\n\nconst log = (level: 'info' | 'warn' | 'error', message: string, ...args: unknown[]) => {\n if (!debugMode) return\n const prefix = `[@openfigi/sdk] [${level.toUpperCase()}]`\n console[level](prefix, message, ...args)\n}\n\nconst createHttpClient = (config: Required<ClientConfig>): KyInstance => {\n return ky.create({\n prefixUrl: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': config.userAgent,\n ...(config.apiKey && { 'X-OPENFIGI-APIKEY': config.apiKey }),\n },\n retry: {\n limit: config.retryLimit,\n methods: ['get', 'post'],\n statusCodes: [408, 413, 429, 500, 502, 503, 504],\n },\n hooks: {\n beforeRequest: [\n (request) => {\n log('info', `Request: ${request.method} ${request.url}`)\n },\n ],\n beforeRetry: [\n async ({ error, retryCount }) => {\n const delay = exponentialBackoff(retryCount, config.retryDelay)\n log('warn', `Retry attempt ${retryCount} after ${delay}ms`, error.message)\n await sleep(delay)\n },\n ],\n afterResponse: [\n (_request, _options, response) => {\n const { limit, remaining, reset } = parseRateLimitHeaders(response.headers)\n if (limit !== undefined && remaining !== undefined && reset) {\n currentRateLimitInfo = { limit, remaining, reset }\n log('info', `Rate limit: ${remaining}/${limit} (resets: ${reset.toISOString()})`)\n }\n log('info', `Response: ${response.status} ${response.statusText}`)\n return response\n },\n ],\n },\n })\n}\n\n/**\n * Creates an OpenFIGI client with custom configuration\n *\n * @param config - Client configuration options\n * @returns An OpenFIGI client instance with all available methods\n *\n * @example\n * ```typescript\n * const client = createClient({\n * apiKey: 'your-api-key',\n * timeout: 60000\n * })\n * ```\n */\nexport const createClient = (config: ClientConfig = {}) => {\n const validation = ClientConfigSchema.safeParse(config)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(`Invalid client configuration: ${errors}`, validation.error)\n }\n\n const finalConfig = { ...DEFAULT_CONFIG, ...config }\n const httpClient = createHttpClient(finalConfig)\n\n /**\n * Map multiple identifiers to FIGIs in a single request\n *\n * @param requests - Array of mapping requests (max 100)\n * @returns Array of mapping responses in the same order as requests\n * @throws {ValidationError} If requests are invalid\n * @throws {RateLimitError} If rate limit is exceeded\n * @throws {OpenFigiError} If API returns an error\n *\n * @example\n * ```typescript\n * const responses = await mapping([\n * { idType: 'ID_ISIN', idValue: 'US0378331005' },\n * { idType: 'ID_CUSIP', idValue: '037833100' }\n * ])\n * ```\n */\n const mapping = async (requests: MappingRequest[]): Promise<MappingResponse[]> => {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Requests must be a non-empty array. Provide at least one mapping request.'\n )\n }\n\n if (requests.length > 100) {\n throw new ValidationError(\n `Too many requests: ${requests.length}. Maximum 100 requests allowed per call. Split into multiple batches.`\n )\n }\n\n const validatedRequests = requests.map((req, index) => {\n const validation = MappingRequestSchema.safeParse(req)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(\n `Invalid mapping request at index ${index}: ${errors}`,\n validation.error\n )\n }\n return validation.data\n })\n\n try {\n log('info', `Mapping ${validatedRequests.length} identifier(s)`)\n const response = await httpClient.post('v3/mapping', {\n json: validatedRequests,\n })\n\n const data = (await response.json()) as unknown\n\n if (!Array.isArray(data)) {\n throw new OpenFigiError(\n `Invalid API response: expected array but got ${typeof data}`,\n response.status,\n data\n )\n }\n\n const validatedResponses = data.map((item, index) => {\n const validation = MappingResponseSchema.safeParse(item)\n if (!validation.success) {\n log('warn', `Invalid response at index ${index}:`, item, validation.error)\n return item as MappingResponse\n }\n return validation.data\n })\n\n log('info', `Mapped ${validatedResponses.length} identifier(s) successfully`)\n return validatedResponses\n } catch (error) {\n if (error instanceof OpenFigiError) {\n throw error\n }\n\n if (error instanceof Error && 'response' in error) {\n const httpError = error as HTTPError\n const status = httpError.response?.status\n\n if (status === 429) {\n const retryAfter = httpError.response?.headers?.get('retry-after')\n throw new RateLimitError(\n 'Rate limit exceeded. Please wait before making more requests.',\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n status\n )\n }\n\n if (status === 400) {\n const body = await httpError.response?.text()\n throw new ValidationError(`Bad request: ${body || 'Invalid request format'}`)\n }\n\n if (status === 401) {\n throw new OpenFigiError('Authentication failed. Check your API key.', status)\n }\n\n if (status === 404) {\n throw new OpenFigiError('Endpoint not found. Please check the API version.', status)\n }\n\n throw new OpenFigiError(\n `Request failed with status ${status}: ${httpError.message}`,\n status,\n await httpError.response?.text()\n )\n }\n\n throw new OpenFigiError('Unexpected error occurred', undefined, error)\n }\n }\n\n /**\n * Map a single identifier to FIGI\n *\n * @param request - Single mapping request\n * @returns Mapping response\n *\n * @example\n * ```typescript\n * const response = await mappingSingle({\n * idType: 'ID_ISIN',\n * idValue: 'US0378331005'\n * })\n * ```\n */\n const mappingSingle = async (request: MappingRequest): Promise<MappingResponse> => {\n const responses = await mapping([request])\n return responses[0]\n }\n\n /**\n * Search for FIGI by ISIN\n *\n * @param isin - ISIN identifier (e.g., 'US0378331005')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByISIN('US0378331005')\n * if (result.data) {\n * console.log('FIGI:', result.data[0].figi)\n * }\n * ```\n */\n const searchByISIN = async (\n isin: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!isin || typeof isin !== 'string') {\n throw new ValidationError('ISIN must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_ISIN',\n idValue: isin.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by CUSIP\n *\n * @param cusip - CUSIP identifier (e.g., '037833100')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByCUSIP = async (\n cusip: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!cusip || typeof cusip !== 'string') {\n throw new ValidationError('CUSIP must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_CUSIP',\n idValue: cusip.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by SEDOL\n *\n * @param sedol - SEDOL identifier (e.g., '2046251')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchBySEDOL = async (\n sedol: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!sedol || typeof sedol !== 'string') {\n throw new ValidationError('SEDOL must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_SEDOL',\n idValue: sedol.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by ticker symbol\n *\n * @param ticker - Ticker symbol (e.g., 'AAPL')\n * @param exchCode - Optional exchange code (e.g., 'US')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByTicker('AAPL', 'US')\n * ```\n */\n const searchByTicker = async (\n ticker: string,\n exchCode?: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!ticker || typeof ticker !== 'string') {\n throw new ValidationError('Ticker must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_EXCH_SYMBOL',\n idValue: ticker.trim().toUpperCase(),\n exchCode: exchCode?.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by Bloomberg ID\n *\n * @param bbgId - Bloomberg Global ID (e.g., 'BBG000B9XRY4')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByBloombergId = async (\n bbgId: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!bbgId || typeof bbgId !== 'string') {\n throw new ValidationError('Bloomberg ID must be a non-empty string')\n }\n return mappingSingle({\n idType: 'ID_BB_GLOBAL',\n idValue: bbgId.trim(),\n ...options,\n })\n }\n\n /**\n * Get current rate limit information\n *\n * @returns Rate limit info if available, undefined if no requests made yet\n *\n * @example\n * ```typescript\n * const rateLimit = getRateLimitInfo()\n * if (rateLimit) {\n * console.log(`${rateLimit.remaining} requests remaining`)\n * }\n * ```\n */\n const getRateLimitInfo = (): RateLimitInfo | undefined => {\n return currentRateLimitInfo\n }\n\n return {\n mapping,\n mappingSingle,\n searchByISIN,\n searchByCUSIP,\n searchBySEDOL,\n searchByTicker,\n searchByBloombergId,\n getRateLimitInfo,\n }\n}\n\n// Export standalone functions with default client\nconst defaultClient = createClient()\n\nexport const mapping = defaultClient.mapping\nexport const mappingSingle = defaultClient.mappingSingle\nexport const searchByISIN = defaultClient.searchByISIN\nexport const searchByCUSIP = defaultClient.searchByCUSIP\nexport const searchBySEDOL = defaultClient.searchBySEDOL\nexport const searchByTicker = defaultClient.searchByTicker\nexport const searchByBloombergId = defaultClient.searchByBloombergId\nexport const getRateLimitInfo = defaultClient.getRateLimitInfo\n","/**\n * Validate ISIN format (12 characters, alphanumeric)\n */\nexport const isValidISIN = (isin: string): boolean => {\n return /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/.test(isin)\n}\n\n/**\n * Validate CUSIP format (9 characters, alphanumeric)\n */\nexport const isValidCUSIP = (cusip: string): boolean => {\n return /^[A-Z0-9]{9}$/.test(cusip)\n}\n\n/**\n * Validate SEDOL format (7 characters, alphanumeric)\n */\nexport const isValidSEDOL = (sedol: string): boolean => {\n return /^[A-Z0-9]{7}$/.test(sedol)\n}\n\n/**\n * Validate Bloomberg ID format (starts with BBG)\n */\nexport const isValidBloombergId = (bbgId: string): boolean => {\n return /^BBG[A-Z0-9]{9}$/.test(bbgId)\n}\n\n/**\n * Split array into batches of specified size\n * Useful for splitting large arrays for batch processing\n */\nexport const batchArray = <T>(array: T[], batchSize: number): T[][] => {\n const batches: T[][] = []\n for (let i = 0; i < array.length; i += batchSize) {\n batches.push(array.slice(i, i + batchSize))\n }\n return batches\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/utils/helpers.ts","../src/validators/index.ts","../src/client/client.ts","../src/utils/validators.ts"],"names":["mapping","validation","mappingSingle","searchByISIN","searchByCUSIP","searchBySEDOL","searchByTicker","searchByBloombergId","getRateLimitInfo"],"mappings":"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","file":"index.js","sourcesContent":["export class OpenFigiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: unknown\n ) {\n super(message)\n this.name = 'OpenFigiError'\n }\n}\n\nexport class RateLimitError extends OpenFigiError {\n constructor(\n message: string,\n public retryAfter?: number,\n statusCode?: number\n ) {\n super(message, statusCode)\n this.name = 'RateLimitError'\n }\n}\n\nexport class ValidationError extends OpenFigiError {\n constructor(\n message: string,\n public errors?: unknown\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function parseRateLimitHeaders(headers: Headers): {\n limit?: number\n remaining?: number\n reset?: Date\n} {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n return {\n limit: limit ? parseInt(limit, 10) : undefined,\n remaining: remaining ? parseInt(remaining, 10) : undefined,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : undefined,\n }\n}\n\nexport function exponentialBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n const delay = Math.min(baseDelay * 2 ** attempt, maxDelay)\n const jitter = Math.random() * 0.1 * delay\n return Math.floor(delay + jitter)\n}\n","import { z } from 'zod'\n\nexport const IdTypeSchema = z.enum([\n 'ID_ISIN',\n 'ID_BB_UNIQUE',\n 'ID_SEDOL',\n 'ID_COMMON',\n 'ID_WERTPAPIER',\n 'ID_CUSIP',\n 'ID_BB',\n 'ID_ITALY',\n 'ID_EXCH_SYMBOL',\n 'ID_FULL_EXCHANGE_SYMBOL',\n 'COMPOSITE_ID_BB_GLOBAL',\n 'ID_BB_GLOBAL_SHARE_CLASS_LEVEL',\n 'ID_BB_GLOBAL',\n 'ID_BB_SEC_NUM_DES',\n 'ID_BB_SEC_NUM',\n 'ID_CINS',\n 'ID_BELGIUM',\n 'ID_DENMARK',\n 'ID_FRANCE',\n 'ID_JAPAN',\n 'ID_LUXEMBOURG',\n 'ID_NETHERLANDS',\n 'ID_POLAND',\n 'ID_PORTUGAL',\n 'ID_SWEDEN',\n 'ID_SHORT_CODE',\n])\n\nexport const SecurityTypeSchema = z.enum([\n 'Common Stock',\n 'Preference',\n 'ADR',\n 'Open-End Fund',\n 'Closed-End Fund',\n 'ETF',\n 'ETN',\n 'Unit',\n 'Mutual Fund',\n 'Money Market',\n 'Commodity',\n 'Currency',\n 'Option',\n 'Index',\n])\n\nexport const MarketSectorSchema = z.enum([\n 'All',\n 'Comdty',\n 'Curncy',\n 'Equity',\n 'Govt',\n 'Corp',\n 'Index',\n 'Money',\n 'Mtge',\n 'Muni',\n 'Pref',\n])\n\nexport const MappingRequestSchema = z.object({\n idType: IdTypeSchema,\n idValue: z.string().min(1),\n exchCode: z.string().optional(),\n micCode: z.string().optional(),\n currency: z.string().length(3).optional(),\n marketSecDes: MarketSectorSchema.optional(),\n securityType: SecurityTypeSchema.optional(),\n securityType2: z.string().optional(),\n includeUnlistedEquities: z.boolean().optional(),\n optionType: z.enum(['Put', 'Call']).optional(),\n strike: z.array(z.number()).optional(),\n contractSize: z.number().optional(),\n coupon: z.array(z.number()).optional(),\n expiration: z.array(z.number()).optional(),\n maturity: z.array(z.number()).optional(),\n stateCode: z.string().length(2).optional(),\n})\n\nexport const FigiResultSchema = z.object({\n figi: z.string(),\n securityType: SecurityTypeSchema.optional(),\n marketSector: MarketSectorSchema.optional(),\n ticker: z.string().optional(),\n name: z.string().optional(),\n exchCode: z.string().optional(),\n shareClassFIGI: z.string().optional(),\n compositeFIGI: z.string().optional(),\n securityType2: z.string().optional(),\n securityDescription: z.string().optional(),\n metadata: z.string().optional(),\n})\n\nexport const MappingResponseSchema = z.object({\n data: z.array(FigiResultSchema).optional(),\n warning: z.string().optional(),\n error: z.string().optional(),\n})\n\nexport const ApiErrorSchema = z.object({\n error: z.string(),\n message: z.string().optional(),\n statusCode: z.number().optional(),\n})\n\nexport const ClientConfigSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n timeout: z.number().positive().optional(),\n retryLimit: z.number().min(0).max(10).optional(),\n retryDelay: z.number().positive().optional(),\n userAgent: z.string().optional(),\n})\n","import ky, { type HTTPError, type KyInstance } from 'ky'\nimport type { ClientConfig, MappingRequest, MappingResponse, RateLimitInfo } from '../types'\nimport { OpenFigiError, RateLimitError, ValidationError } from '../utils/errors'\nimport { exponentialBackoff, parseRateLimitHeaders, sleep } from '../utils/helpers'\nimport { ClientConfigSchema, MappingRequestSchema, MappingResponseSchema } from '../validators'\n\nconst DEFAULT_CONFIG: Required<ClientConfig> = {\n apiKey: '',\n baseUrl: 'https://api.openfigi.com',\n timeout: 30000,\n retryLimit: 3,\n retryDelay: 1000,\n userAgent: 'openfigi-sdk/1.0.3 (+https://github.com/viktorlarsson/openfigi)',\n}\n\nlet currentRateLimitInfo: RateLimitInfo | undefined\nlet debugMode = false\n\n/**\n * Enable or disable debug logging\n * @param enabled - Whether to enable debug mode\n */\nexport const setDebugMode = (enabled: boolean) => {\n debugMode = enabled\n}\n\nconst log = (level: 'info' | 'warn' | 'error', message: string, ...args: unknown[]) => {\n if (!debugMode) return\n const prefix = `[@openfigi/sdk] [${level.toUpperCase()}]`\n console[level](prefix, message, ...args)\n}\n\nconst createHttpClient = (config: Required<ClientConfig>): KyInstance => {\n return ky.create({\n prefixUrl: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': config.userAgent,\n ...(config.apiKey && { 'X-OPENFIGI-APIKEY': config.apiKey }),\n },\n retry: {\n limit: config.retryLimit,\n methods: ['get', 'post'],\n statusCodes: [408, 413, 429, 500, 502, 503, 504],\n },\n hooks: {\n beforeRequest: [\n (request) => {\n log('info', `Request: ${request.method} ${request.url}`)\n },\n ],\n beforeRetry: [\n async ({ error, retryCount }) => {\n const delay = exponentialBackoff(retryCount, config.retryDelay)\n log('warn', `Retry attempt ${retryCount} after ${delay}ms`, error.message)\n await sleep(delay)\n },\n ],\n afterResponse: [\n (_request, _options, response) => {\n const { limit, remaining, reset } = parseRateLimitHeaders(response.headers)\n if (limit !== undefined && remaining !== undefined && reset) {\n currentRateLimitInfo = { limit, remaining, reset }\n log('info', `Rate limit: ${remaining}/${limit} (resets: ${reset.toISOString()})`)\n }\n log('info', `Response: ${response.status} ${response.statusText}`)\n return response\n },\n ],\n },\n })\n}\n\n/**\n * Creates an OpenFIGI client with custom configuration\n *\n * @param config - Client configuration options\n * @returns An OpenFIGI client instance with all available methods\n *\n * @example\n * ```typescript\n * const client = createClient({\n * apiKey: 'your-api-key',\n * timeout: 60000\n * })\n * ```\n */\nexport const createClient = (config: ClientConfig = {}) => {\n const validation = ClientConfigSchema.safeParse(config)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(`Invalid client configuration: ${errors}`, validation.error)\n }\n\n const finalConfig = { ...DEFAULT_CONFIG, ...config }\n const httpClient = createHttpClient(finalConfig)\n\n /**\n * Map multiple identifiers to FIGIs in a single request\n *\n * @param requests - Array of mapping requests (max 100)\n * @returns Array of mapping responses in the same order as requests\n * @throws {ValidationError} If requests are invalid\n * @throws {RateLimitError} If rate limit is exceeded\n * @throws {OpenFigiError} If API returns an error\n *\n * @example\n * ```typescript\n * const responses = await mapping([\n * { idType: 'ID_ISIN', idValue: 'US0378331005' },\n * { idType: 'ID_CUSIP', idValue: '037833100' }\n * ])\n * ```\n */\n const mapping = async (requests: MappingRequest[]): Promise<MappingResponse[]> => {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Requests must be a non-empty array. Provide at least one mapping request.'\n )\n }\n\n if (requests.length > 100) {\n throw new ValidationError(\n `Too many requests: ${requests.length}. Maximum 100 requests allowed per call. Split into multiple batches.`\n )\n }\n\n const validatedRequests = requests.map((req, index) => {\n const validation = MappingRequestSchema.safeParse(req)\n if (!validation.success) {\n const errors = validation.error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ')\n throw new ValidationError(\n `Invalid mapping request at index ${index}: ${errors}`,\n validation.error\n )\n }\n return validation.data\n })\n\n try {\n log('info', `Mapping ${validatedRequests.length} identifier(s)`)\n const response = await httpClient.post('v3/mapping', {\n json: validatedRequests,\n })\n\n const data = (await response.json()) as unknown\n\n if (!Array.isArray(data)) {\n throw new OpenFigiError(\n `Invalid API response: expected array but got ${typeof data}`,\n response.status,\n data\n )\n }\n\n const validatedResponses = data.map((item, index) => {\n const validation = MappingResponseSchema.safeParse(item)\n if (!validation.success) {\n log('warn', `Invalid response at index ${index}:`, item, validation.error)\n return item as MappingResponse\n }\n return validation.data\n })\n\n log('info', `Mapped ${validatedResponses.length} identifier(s) successfully`)\n return validatedResponses\n } catch (error) {\n if (error instanceof OpenFigiError) {\n throw error\n }\n\n if (error instanceof Error && 'response' in error) {\n const httpError = error as HTTPError\n const status = httpError.response?.status\n\n if (status === 429) {\n const retryAfter = httpError.response?.headers?.get('retry-after')\n throw new RateLimitError(\n 'Rate limit exceeded. Please wait before making more requests.',\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n status\n )\n }\n\n if (status === 400) {\n const body = await httpError.response?.text()\n throw new ValidationError(\n `Bad request: ${body || 'Invalid request format'}. Please check your request parameters and ensure all required fields are properly formatted.`,\n body\n )\n }\n\n if (status === 401) {\n throw new OpenFigiError(\n 'Authentication failed. Please check your API key. You can get an API key at https://www.openfigi.com/api',\n status\n )\n }\n\n if (status === 403) {\n throw new OpenFigiError(\n 'Access forbidden. Your API key may not have the required permissions for this operation.',\n status\n )\n }\n\n if (status === 404) {\n throw new OpenFigiError(\n 'Endpoint not found. Please check the API version or ensure you are using the correct base URL.',\n status\n )\n }\n\n throw new OpenFigiError(\n `Request failed with status ${status}: ${httpError.message}`,\n status,\n await httpError.response?.text()\n )\n }\n\n throw new OpenFigiError('Unexpected error occurred', undefined, error)\n }\n }\n\n /**\n * Map a single identifier to FIGI\n *\n * @param request - Single mapping request\n * @returns Mapping response\n *\n * @example\n * ```typescript\n * const response = await mappingSingle({\n * idType: 'ID_ISIN',\n * idValue: 'US0378331005'\n * })\n * ```\n */\n const mappingSingle = async (request: MappingRequest): Promise<MappingResponse> => {\n const responses = await mapping([request])\n return responses[0]\n }\n\n /**\n * Search for FIGI by ISIN\n *\n * @param isin - ISIN identifier (e.g., 'US0378331005')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByISIN('US0378331005')\n * if (result.data) {\n * console.log('FIGI:', result.data[0].figi)\n * }\n * ```\n */\n const searchByISIN = async (\n isin: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!isin || typeof isin !== 'string') {\n throw new ValidationError('ISIN must be a non-empty string. Example: \"US0378331005\"')\n }\n return mappingSingle({\n idType: 'ID_ISIN',\n idValue: isin.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by CUSIP\n *\n * @param cusip - CUSIP identifier (e.g., '037833100')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByCUSIP = async (\n cusip: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!cusip || typeof cusip !== 'string') {\n throw new ValidationError('CUSIP must be a non-empty string. Example: \"037833100\"')\n }\n return mappingSingle({\n idType: 'ID_CUSIP',\n idValue: cusip.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by SEDOL\n *\n * @param sedol - SEDOL identifier (e.g., '2046251')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchBySEDOL = async (\n sedol: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!sedol || typeof sedol !== 'string') {\n throw new ValidationError('SEDOL must be a non-empty string. Example: \"2046251\"')\n }\n return mappingSingle({\n idType: 'ID_SEDOL',\n idValue: sedol.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by ticker symbol\n *\n * @param ticker - Ticker symbol (e.g., 'AAPL')\n * @param exchCode - Optional exchange code (e.g., 'US')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n *\n * @example\n * ```typescript\n * const result = await searchByTicker('AAPL', 'US')\n * ```\n */\n const searchByTicker = async (\n ticker: string,\n exchCode?: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!ticker || typeof ticker !== 'string') {\n throw new ValidationError('Ticker must be a non-empty string. Example: \"AAPL\"')\n }\n return mappingSingle({\n idType: 'ID_EXCH_SYMBOL',\n idValue: ticker.trim().toUpperCase(),\n exchCode: exchCode?.trim(),\n ...options,\n })\n }\n\n /**\n * Search for FIGI by Bloomberg ID\n *\n * @param bbgId - Bloomberg Global ID (e.g., 'BBG000B9XRY4')\n * @param options - Additional search options\n * @returns Mapping response with FIGI data\n */\n const searchByBloombergId = async (\n bbgId: string,\n options?: Partial<MappingRequest>\n ): Promise<MappingResponse> => {\n if (!bbgId || typeof bbgId !== 'string') {\n throw new ValidationError('Bloomberg ID must be a non-empty string. Example: \"BBG000B9XRY4\"')\n }\n return mappingSingle({\n idType: 'ID_BB_GLOBAL',\n idValue: bbgId.trim(),\n ...options,\n })\n }\n\n /**\n * Get current rate limit information\n *\n * @returns Rate limit info if available, undefined if no requests made yet\n *\n * @example\n * ```typescript\n * const rateLimit = getRateLimitInfo()\n * if (rateLimit) {\n * console.log(`${rateLimit.remaining} requests remaining`)\n * }\n * ```\n */\n const getRateLimitInfo = (): RateLimitInfo | undefined => {\n return currentRateLimitInfo\n }\n\n return {\n mapping,\n mappingSingle,\n searchByISIN,\n searchByCUSIP,\n searchBySEDOL,\n searchByTicker,\n searchByBloombergId,\n getRateLimitInfo,\n }\n}\n\n// Export standalone functions with default client\nconst defaultClient = createClient()\n\nexport const mapping = defaultClient.mapping\nexport const mappingSingle = defaultClient.mappingSingle\nexport const searchByISIN = defaultClient.searchByISIN\nexport const searchByCUSIP = defaultClient.searchByCUSIP\nexport const searchBySEDOL = defaultClient.searchBySEDOL\nexport const searchByTicker = defaultClient.searchByTicker\nexport const searchByBloombergId = defaultClient.searchByBloombergId\nexport const getRateLimitInfo = defaultClient.getRateLimitInfo\n","/**\n * Validate ISIN format (12 characters, alphanumeric)\n */\nexport const isValidISIN = (isin: string): boolean => {\n return /^[A-Z]{2}[A-Z0-9]{9}[0-9]$/.test(isin)\n}\n\n/**\n * Validate CUSIP format (9 characters, alphanumeric)\n */\nexport const isValidCUSIP = (cusip: string): boolean => {\n return /^[A-Z0-9]{9}$/.test(cusip)\n}\n\n/**\n * Validate SEDOL format (7 characters, alphanumeric)\n */\nexport const isValidSEDOL = (sedol: string): boolean => {\n return /^[A-Z0-9]{7}$/.test(sedol)\n}\n\n/**\n * Validate Bloomberg ID format (starts with BBG)\n */\nexport const isValidBloombergId = (bbgId: string): boolean => {\n return /^BBG[A-Z0-9]{9}$/.test(bbgId)\n}\n\n/**\n * Split array into batches of specified size\n * Useful for splitting large arrays for batch processing\n */\nexport const batchArray = <T>(array: T[], batchSize: number): T[][] => {\n const batches: T[][] = []\n for (let i = 0; i < array.length; i += batchSize) {\n batches.push(array.slice(i, i + batchSize))\n }\n return batches\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfigi-sdk",
3
- "version": "1.0.3",
3
+ "version": "1.0.6",
4
4
  "description": "Unofficial TypeScript SDK for OpenFIGI API - Map financial identifiers to FIGIs (community-maintained)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -48,7 +48,7 @@
48
48
  "financial-identifiers",
49
49
  "bloomberg"
50
50
  ],
51
- "author": "",
51
+ "author": "Viktor Larsson <viktorsarstrom@gmail.com>",
52
52
  "license": "MIT",
53
53
  "repository": {
54
54
  "type": "git",
@@ -58,11 +58,17 @@
58
58
  "url": "https://github.com/viktorlarsson/openfigi/issues"
59
59
  },
60
60
  "homepage": "https://github.com/viktorlarsson/openfigi#readme",
61
+ "funding": "https://github.com/sponsors/viktorlarsson",
62
+ "engines": {
63
+ "bun": ">=1.0.0",
64
+ "node": ">=18.0.0"
65
+ },
61
66
  "devDependencies": {
62
67
  "@biomejs/biome": "^2.3.11",
63
68
  "@changesets/cli": "^2.29.8",
64
69
  "@types/bun": "^1.3.6",
65
70
  "@types/node": "^25.0.9",
71
+ "@vitest/coverage-v8": "^4.0.17",
66
72
  "@vitest/ui": "^4.0.17",
67
73
  "tsup": "^8.5.1",
68
74
  "tsx": "^4.21.0",