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 +24 -3
- package/dist/index.cjs +24 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +24 -9
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
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.
|
|
215
|
-
4.
|
|
216
|
-
|
|
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: "
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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",
|
package/dist/index.cjs.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":["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: "
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
+
"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",
|