forked from Lilly-Protocol/lily-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.cjs.map
More file actions
1 lines (1 loc) · 16.6 KB
/
Copy pathconfig.cjs.map
File metadata and controls
1 lines (1 loc) · 16.6 KB
1
{"version":3,"sources":["../src/errors/sdk-error.ts","../src/version.ts","../src/http/resolve-auth-headers.ts","../src/config/resolve-config.ts"],"names":[],"mappings":"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","file":"config.cjs","sourcesContent":["export interface LilyRequestMetadata {\n method: string;\n path: string;\n url: string;\n}\n\nexport interface LilyErrorOptions {\n code?: string;\n statusCode?: number;\n details?: unknown;\n cause?: unknown;\n request?: LilyRequestMetadata;\n /** Redacted excerpt of the response body, safe to log or send to a bug tracker. */\n bodySnippet?: string;\n /** Delta-seconds value from a Retry-After header, when present. */\n retryAfterSeconds?: number;\n}\n\nexport const LILY_ERROR_CODES = Object.freeze({\n CONFIG_ERROR: 'CONFIG_ERROR',\n API_ERROR: 'API_ERROR',\n AUTHENTICATION_ERROR: 'AUTHENTICATION_ERROR',\n AUTHORIZATION_ERROR: 'AUTHORIZATION_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n TRANSPORT_ERROR: 'TRANSPORT_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n RATE_LIMITED: 'RATE_LIMITED',\n SERVER_ERROR: 'SERVER_ERROR',\n TIMEOUT: 'TIMEOUT',\n});\n\nexport type LilyErrorCode = keyof typeof LILY_ERROR_CODES;\n\nexport class LilySdkError extends Error {\n public readonly code: string | undefined;\n public readonly statusCode: number | undefined;\n public readonly details: unknown;\n public readonly request: LilyRequestMetadata | undefined;\n\n public constructor(message: string, options: LilyErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code;\n this.statusCode = options.statusCode;\n this.details = options.details;\n this.request = options.request;\n }\n\n public toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n name: this.name,\n message: this.message,\n };\n\n if (this.code !== undefined) {\n result.code = this.code;\n }\n\n if (this.statusCode !== undefined) {\n result.statusCode = this.statusCode;\n }\n\n if (this.details !== undefined) {\n result.details = this.details;\n }\n\n if (this.request !== undefined) {\n result.request = this.request;\n }\n\n const cause = this.cause;\n if (cause !== undefined && cause !== null) {\n result.cause =\n cause instanceof LilySdkError\n ? cause.toJSON()\n : cause instanceof Error\n ? { name: cause.name, message: cause.message }\n : cause;\n }\n\n return result;\n }\n\n public override toString(): string {\n const parts: string[] = [this.name, this.message];\n\n if (this.code !== undefined) {\n parts.push(`[${this.code}]`);\n }\n\n if (this.statusCode !== undefined) {\n parts.push(`(HTTP ${this.statusCode})`);\n }\n\n return parts.join(': ');\n }\n}\n\nexport class LilyConfigError extends LilySdkError {}\nexport class LilyTransportError extends LilySdkError {}\nexport class LilyAuthenticationError extends LilySdkError {}\n\n/**\n * Any non-ok HTTP response. The subclasses below narrow it, so\n * `catch (e) { if (e instanceof LilyApiError) ... }` keeps working for callers\n * that only care that the API rejected the request.\n */\nexport class LilyApiError extends LilySdkError {}\nexport class LilyValidationError extends LilySdkError {}\n\nexport class LilyAuthorizationError extends LilyAuthenticationError {}\nexport class LilyNotFoundError extends LilyApiError {}\nexport class LilyConflictError extends LilyApiError {}\nexport class LilyServerError extends LilyApiError {}\n\nexport class LilyRateLimitError extends LilyApiError {\n public readonly retryAfterSeconds: number | undefined;\n\n public constructor(message: string, options: LilyErrorOptions = {}) {\n super(message, options);\n this.retryAfterSeconds = options.retryAfterSeconds;\n }\n}\n\nexport function isLilySdkError(value: unknown): value is LilySdkError {\n return value instanceof LilySdkError;\n}\n","// Auto-generated by scripts/generate-version.sh — do not edit.\nexport const SDK_VERSION = '0.1.0';\nexport const VERSION = SDK_VERSION;\n\ndeclare global {\n const __LILY_SDK_VERSION__: string;\n}\n","import type { ResolvedLilySdkConfig } from '../config/types';\n\nexport function toBearer(token: string): string {\n return /^Bearer\\s+/i.test(token) ? token : `Bearer ${token}`;\n}\n\nexport function resolveAuthHeaders(\n config: ResolvedLilySdkConfig,\n): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (config.apiKey !== undefined) {\n headers['x-api-key'] = config.apiKey;\n }\n\n if (config.authToken !== undefined) {\n headers.authorization = toBearer(config.authToken);\n }\n\n return headers;\n}\n","import type {\n LilySdkConfig,\n ResolvedLilySdkConfig,\n ResolvedRetryPolicy,\n} from './types';\nimport { LilyConfigError } from '../errors/sdk-error';\nimport { VERSION } from '../version';\nimport type { RetryPolicy } from '../http/types';\nimport { toBearer } from '../http/resolve-auth-headers';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_USER_AGENT = `lily-sdk/${VERSION}`;\nconst DEFAULT_RETRY_POLICY: RetryPolicy = {\n retries: 2,\n retryDelayMs: 250,\n retryableStatusCodes: [408, 409, 425, 429, 500, 502, 503, 504],\n};\n\nconst KNOWN_CONFIG_KEYS: readonly string[] = [\n 'baseUrl',\n 'apiKey',\n 'authToken',\n 'timeoutMs',\n 'retry',\n 'defaultHeaders',\n 'userAgent',\n 'fetch',\n 'validateResponses',\n];\n\nexport function resolveLilySdkConfig(\n config: LilySdkConfig,\n): ResolvedLilySdkConfig {\n const unknownKeys = Object.keys(config).filter(\n (key) => !KNOWN_CONFIG_KEYS.includes(key),\n );\n if (unknownKeys.length > 0) {\n console.warn(\n `[lily-sdk] Ignoring unknown config keys: ${unknownKeys.join(', ')}`,\n );\n }\n\n const baseUrl = resolveBaseUrl(config.baseUrl);\n\n if (\n config.apiKey !== undefined &&\n (typeof config.apiKey !== 'string' || config.apiKey.trim() === '')\n ) {\n throw new LilyConfigError('`apiKey` must be a non-empty string.');\n }\n\n if (\n config.authToken !== undefined &&\n (typeof config.authToken !== 'string' || config.authToken.trim() === '')\n ) {\n throw new LilyConfigError('`authToken` must be a non-empty string.');\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const retry = resolveRetryPolicy(config.retry);\n const fetchImpl = config.fetch ?? globalThis.fetch;\n const resolvedApiKey = resolveCredential(config.apiKey, 'LILY_API_KEY');\n const resolvedAuthToken = resolveCredential(\n config.authToken,\n 'LILY_AUTH_TOKEN',\n );\n const validateResponses = config.validateResponses ?? true;\n\n if (typeof fetchImpl !== 'function') {\n throw new LilyConfigError(\n 'No fetch implementation was found. Pass `fetch` in the SDK config when running in unsupported runtimes.',\n );\n }\n\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new LilyConfigError('`timeoutMs` must be a positive number.');\n }\n\n const defaultHeaders = Object.freeze({\n ...config.defaultHeaders,\n });\n\n return deepFreeze({\n baseUrl,\n timeoutMs,\n retry,\n defaultHeaders,\n userAgent: config.userAgent ?? DEFAULT_USER_AGENT,\n fetch: fetchImpl,\n ...(resolvedApiKey !== undefined ? { apiKey: resolvedApiKey } : {}),\n ...(resolvedAuthToken !== undefined\n ? { authToken: resolvedAuthToken }\n : {}),\n validateResponses,\n toHeaders: () => ({\n accept: 'application/json',\n 'user-agent': config.userAgent ?? DEFAULT_USER_AGENT,\n ...defaultHeaders,\n ...(resolvedApiKey !== undefined ? { 'x-api-key': resolvedApiKey } : {}),\n ...(resolvedAuthToken !== undefined\n ? { authorization: toBearer(resolvedAuthToken) }\n : {}),\n }),\n });\n}\n\nfunction resolveBaseUrl(explicit: string | URL | undefined): URL {\n const raw =\n explicit ??\n (typeof process !== 'undefined' ? process.env.LILY_API_URL : undefined);\n\n if (raw === undefined) {\n throw new LilyConfigError('`baseUrl` is required.');\n }\n\n return safeUrl(raw);\n}\n\nfunction resolveCredential(\n explicit: string | undefined,\n envName: string,\n): string | undefined {\n return explicit ?? process.env[envName] ?? undefined;\n}\n\nfunction safeUrl(rawUrl: string | URL): URL {\n let url: URL;\n\n try {\n if (rawUrl instanceof URL) {\n url = new URL(\n rawUrl.href.endsWith('/') ? rawUrl.href : `${rawUrl.href}/`,\n );\n } else {\n url = new URL(rawUrl.endsWith('/') ? rawUrl : `${rawUrl}/`);\n }\n } catch {\n throw new LilyConfigError('`baseUrl` must be a valid absolute URL.');\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new LilyConfigError(\n '`baseUrl` must use http: or https: protocol, got: ' + url.protocol,\n );\n }\n\n return url;\n}\n\nfunction resolveRetryPolicy(\n policy?: Partial<RetryPolicy>,\n): ResolvedRetryPolicy {\n const retries = policy?.retries ?? DEFAULT_RETRY_POLICY.retries;\n const retryDelayMs =\n policy?.retryDelayMs ?? DEFAULT_RETRY_POLICY.retryDelayMs;\n const retryableStatusCodes =\n policy?.retryableStatusCodes ?? DEFAULT_RETRY_POLICY.retryableStatusCodes;\n\n if (!Number.isInteger(retries) || retries < 0) {\n throw new LilyConfigError(\n '`retry.retries` must be a non-negative integer.',\n );\n }\n\n if (!Number.isFinite(retryDelayMs) || retryDelayMs < 0) {\n throw new LilyConfigError(\n '`retry.retryDelayMs` must be a non-negative number.',\n );\n }\n\n if (!Array.isArray(retryableStatusCodes)) {\n throw new LilyConfigError(\n '`retry.retryableStatusCodes` must be an array of HTTP status codes.',\n );\n }\n\n for (const code of retryableStatusCodes) {\n if (!Number.isInteger(code) || code < 100 || code > 599) {\n throw new LilyConfigError(\n `Invalid retry status code: ${code}. Must be an integer between 100 and 599.`,\n );\n }\n }\n\n return {\n retries,\n retryDelayMs,\n retryableStatusCodes: [...retryableStatusCodes],\n };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n for (const nestedValue of Object.values(value as Record<string, unknown>)) {\n if (typeof nestedValue === 'function') {\n continue;\n }\n deepFreeze(nestedValue);\n }\n\n return Object.freeze(value);\n}\n"]}