nhle-api 0.5.1
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/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/lib/index.cjs +1905 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.cts +1623 -0
- package/lib/index.d.ts +1623 -0
- package/lib/index.js +1899 -0
- package/lib/index.js.map +1 -0
- package/package.json +56 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/gamecenter/index.ts","../src/api/gamecenter/draft.ts","../src/config/env.ts","../src/errors/index.ts","../src/client/types.ts","../src/client/index.ts","../src/utils/date.ts","../src/constants/edge-adv.ts","../src/constants/edge-stats.ts","../src/constants/nhl.ts","../src/constants/index.ts","../src/utils/schemas.ts","../src/utils/utils.ts","../src/api/gamecenter/game.ts","../src/api/gamecenter/misc.ts","../src/api/gamecenter/player.ts","../src/api/gamecenter/score.ts","../src/api/gamecenter/team.ts"],"names":["route","type","_paths","landing","schedule"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * NHL API Endpoints\n * This file re-exports all the API endpoint functions\n */\nexport * as draft from './draft.ts';\nexport * as game from './game.ts';\nexport * as misc from './misc.ts';\nexport * as player from './player.ts';\nexport * from './score.ts';\nexport * as team from './team.ts';\n","/**\n * Draft-related API endpoints\n */\n\nimport nhlClient from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type {\n DraftPicks,\n DraftRankings,\n DraftRound,\n DraftTracker,\n Year,\n} from '#/types/index.ts';\nimport { getCurrentYear } from '#/utils/date.ts';\nimport {\n DraftParams,\n isParseError,\n Year as YearType,\n} from '#/utils/schemas.ts';\nimport { route } from '#/utils/utils.ts';\n\nconst _paths = {\n draftPicks: {\n byYearAndRound: 'draft/picks/{year}/{round}',\n byYear: 'draft/picks/{year}/all',\n },\n draftRankings: 'draft/rankings/{year}/{type}',\n draftTracker: 'draft-tracker/picks/now',\n};\n\nconst DraftRankingsEnum = {\n skatersNA: '1',\n skatersIntl: '2',\n goaliesNA: '3',\n goaliesIntl: '4',\n} as const;\n\n/**\n * Get draft picks for a specific year and round\n * @param year - The draft year\n * @param round - The draft round\n * @returns Promise resolving to draft picks for the specified year and round\n */\nexport const picks = (\n year?: Year,\n round?: DraftRound,\n): Promise<APIResponse<DraftPicks>> => {\n const parsed = DraftParams({ year, round });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.draftPicks.byYearAndRound,\n }),\n });\n }\n if (parsed.year && !parsed.round)\n return nhlClient.get(route(_paths.draftPicks.byYear, parsed));\n\n return nhlClient.get(route(_paths.draftPicks.byYearAndRound, parsed));\n};\n\n/**\n * Get current draft tracker information\n * @returns Promise resolving to current draft tracker data\n */\nexport const tracker = (): Promise<APIResponse<DraftTracker>> =>\n nhlClient.get(_paths.draftTracker);\n\n/**\n * Access draft rankings related endpoints\n */\nexport const rankings = (year?: Year) => {\n const getRankings = (\n type: '1' | '2' | '3' | '4',\n ): Promise<APIResponse<DraftRankings>> => {\n const parsedYear = YearType(year ?? getCurrentYear());\n if (isParseError(parsedYear)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedYear.summary, {\n endpoint: _paths.draftRankings,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.draftRankings, {\n year: parsedYear,\n type,\n }),\n );\n };\n\n return {\n skatersNA: (): Promise<APIResponse<DraftRankings>> =>\n getRankings(DraftRankingsEnum.skatersNA),\n skatersIntl: (): Promise<APIResponse<DraftRankings>> =>\n getRankings(DraftRankingsEnum.skatersIntl),\n goaliesNA: (): Promise<APIResponse<DraftRankings>> =>\n getRankings(DraftRankingsEnum.goaliesNA),\n goaliesIntl: (): Promise<APIResponse<DraftRankings>> =>\n getRankings(DraftRankingsEnum.goaliesIntl),\n all: (): Promise<APIResponse<DraftRankings>[]> =>\n Promise.all([\n getRankings(DraftRankingsEnum.skatersNA),\n getRankings(DraftRankingsEnum.skatersIntl),\n getRankings(DraftRankingsEnum.goaliesNA),\n getRankings(DraftRankingsEnum.goaliesIntl),\n ]),\n };\n};\n","/**\n * Environment Variable Configuration\n * Simple configuration system for NHL API client based on environment variables\n *\n * Supported environment variables:\n * - NHLE_API_TIMEOUT: Request timeout in milliseconds (default: 5000)\n * - NHLE_API_LANGUAGE: Language code 'en' or 'fr' (default: 'en')\n * - NHLE_API_LOGLEVEL: Logging level 'silent', 'error', 'warn', 'info', 'debug' (default: 'warn')\n *\n * @example\n * // In .env or shell\n * NHLE_API_TIMEOUT=10000\n * NHLE_API_LANGUAGE=fr\n * NHLE_API_LOGLEVEL=debug\n *\n * @module config/env\n */\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';\n\n/**\n * Parse timeout from environment variable\n * @internal\n */\nfunction parseTimeout(): number {\n const timeout = process.env.NHLE_API_TIMEOUT;\n if (!timeout) return 5000;\n\n const parsed = parseInt(timeout, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n console.warn(\n `Invalid NHLE_API_TIMEOUT: \"${timeout}\". Using default 5000ms`,\n );\n return 5000;\n }\n return parsed;\n}\n\n/**\n * Parse language from environment variable\n * @internal\n */\nfunction parseLanguage(): 'en' | 'fr' {\n const language = process.env.NHLE_API_LANGUAGE?.toLowerCase();\n if (language === 'fr') return 'fr';\n if (language && language !== 'en') {\n console.warn(\n `Invalid NHLE_API_LANGUAGE: \"${language}\". Using default 'en'`,\n );\n }\n return 'en';\n}\n\n/**\n * Parse log level from environment variable\n * @internal\n */\nfunction parseLogLevel(): LogLevel {\n const logLevel = process.env.NHLE_API_LOGLEVEL?.toLowerCase();\n const validLevels: LogLevel[] = [\n 'silent',\n 'error',\n 'warn',\n 'info',\n 'debug',\n ];\n\n if (!logLevel) return 'warn';\n if (validLevels.includes(logLevel as LogLevel)) {\n return logLevel as LogLevel;\n }\n\n console.warn(\n `Invalid NHLE_API_LOGLEVEL: \"${logLevel}\". Valid options: ${validLevels.join(', ')}. Using default 'warn'`,\n );\n return 'warn';\n}\n\n/**\n * Environment-based configuration for NHL API client\n * Reads from process.env at initialization time\n */\nexport const envConfig = {\n /**\n * Request timeout in milliseconds\n * Set via NHLE_API_TIMEOUT environment variable\n * @default 5000\n */\n timeout: parseTimeout(),\n\n /**\n * Language code for API responses\n * Set via NHLE_API_LANGUAGE environment variable\n * @default 'en'\n */\n language: parseLanguage() as 'en' | 'fr',\n\n /**\n * Logging level for the client\n * Set via NHLE_API_LOGLEVEL environment variable\n * @default 'warn'\n */\n logLevel: parseLogLevel(),\n};\n\n/**\n * Log current environment configuration (useful for debugging)\n * Only logs if environment variables are explicitly set\n */\nexport function logEnvConfig(): void {\n const vars = {\n timeout: process.env.NHLE_API_TIMEOUT,\n language: process.env.NHLE_API_LANGUAGE,\n logLevel: process.env.NHLE_API_LOGLEVEL,\n };\n\n const configured = Object.entries(vars).filter(\n ([, v]) => v !== undefined,\n );\n if (configured.length > 0) {\n console.debug('NHL API Environment Configuration:', {\n ...Object.fromEntries(configured),\n resolvedTimeout: envConfig.timeout,\n resolvedLanguage: envConfig.language,\n resolvedLogLevel: envConfig.logLevel,\n });\n }\n}\n","/**\n * Error handling module for NHL Sports Data API wrapper\n * Provides structured error classification and logging for API interactions\n */\n\nexport const ErrorCategory = {\n /** Network-level errors (connection refused, timeout, etc.) */\n NETWORK: 'NETWORK',\n\n /** HTTP 4xx client errors (invalid params, not found, etc.) */\n CLIENT: 'CLIENT',\n\n /** HTTP 5xx server errors */\n SERVER: 'SERVER',\n\n /** Rate limiting (HTTP 429) */\n RATE_LIMIT: 'RATE_LIMIT',\n\n /** Valid HTTP response but with error payload */\n API_ERROR: 'API_ERROR',\n\n /** Response parsing/validation failures */\n PARSE: 'PARSE',\n\n /** Invalid user input or configuration */\n VALIDATION: 'VALIDATION',\n} as const;\n\nexport type ErrorCategory =\n (typeof ErrorCategory)[keyof typeof ErrorCategory];\n\nexport const LogLevel = {\n NONE: 0,\n ERROR: 1,\n WARN: 2,\n INFO: 3,\n DEBUG: 4,\n};\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\nexport interface ErrorContext {\n /** HTTP status code if applicable */\n statusCode?: number;\n\n /** Original error object */\n cause?: unknown;\n\n /** Request URL or endpoint */\n endpoint?: string;\n\n /** Request method */\n method?: string;\n\n /** Request parameters */\n params?: Record<string, unknown>;\n\n /** Response body if available */\n responseBody?: unknown;\n\n /** Timestamp of error */\n timestamp?: Date;\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\nexport interface ErrorConfig {\n /** Logging level for error output */\n logLevel?: LogLevel;\n\n /** Custom logger function */\n logger?: (\n level: LogLevel,\n message: string,\n context?: ErrorContext,\n ) => void;\n\n /** Whether to include stack traces */\n includeStack?: boolean;\n}\n\n/**\n * Base error class for all NHL API errors\n */\nexport class NHLError extends Error {\n public readonly category: ErrorCategory;\n public readonly context: ErrorContext;\n\n constructor(\n message: string,\n category: ErrorCategory,\n context: ErrorContext = {},\n ) {\n super(message);\n this.name = this.constructor.name;\n this.category = category;\n this.context = {\n ...context,\n timestamp: context.timestamp || new Date(),\n };\n\n // Maintain proper stack trace\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n /**\n * Serialize error to JSON\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n category: this.category,\n context: this.context,\n ...(this.stack && { stack: this.stack }),\n };\n }\n}\n\n/**\n * Network-level errors (timeouts, connection failures)\n */\nexport class NetworkError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.NETWORK, context);\n }\n}\n\n/**\n * HTTP 4xx client errors\n */\nexport class ClientError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.CLIENT, context);\n }\n}\n\n/**\n * HTTP 404 resource not found\n */\nexport class NotFoundError extends ClientError {\n constructor(\n message: string = 'Resource not found',\n context: ErrorContext = {},\n ) {\n super(message, { ...context, statusCode: context.statusCode || 404 });\n }\n}\n\n/**\n * HTTP 5xx server errors\n */\nexport class ServerError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.SERVER, context);\n }\n}\n\n/**\n * HTTP 429 rate limit errors\n */\nexport class RateLimitError extends NHLError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n context: ErrorContext = {},\n retryAfter?: number,\n ) {\n super(message, ErrorCategory.RATE_LIMIT, {\n ...context,\n statusCode: context.statusCode || 429,\n });\n this.retryAfter = retryAfter || 0;\n }\n}\n\n/**\n * API returned 200 but with error message in JSON payload\n */\nexport class APIError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.API_ERROR, context);\n }\n}\n\n/**\n * Response parsing or validation failures\n */\nexport class ParseError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.PARSE, context);\n }\n}\n\n/**\n * Invalid user input or configuration\n */\nexport class ValidationError extends NHLError {\n constructor(message: string, context: ErrorContext = {}) {\n super(message, ErrorCategory.VALIDATION, context);\n }\n}\n\n/**\n * Error handler utility class\n */\nexport class ErrorHandler {\n private config: Required<ErrorConfig>;\n\n constructor(config: ErrorConfig = {}) {\n this.config = {\n logLevel: config.logLevel ?? LogLevel.ERROR,\n logger: config.logger ?? this.defaultLogger.bind(this),\n includeStack: config.includeStack ?? true,\n };\n }\n\n /**\n * Default console-based logger\n */\n private defaultLogger(\n level: LogLevel,\n message: string,\n context?: ErrorContext,\n ): void {\n if (level > this.config.logLevel) return;\n\n const logFn =\n level === LogLevel.ERROR\n ? console.error\n : level === LogLevel.WARN\n ? console.warn\n : console.log;\n\n logFn(`[NHL API] ${message}`, context);\n }\n\n /**\n * Log an error based on configuration\n */\n log(error: NHLError): void {\n const level = this.getLogLevel(error.category);\n const context = this.config.includeStack\n ? { ...error.context, stack: error.stack }\n : error.context;\n\n this.config.logger(level, error.message, context);\n }\n\n /**\n * Determine log level based on error category\n */\n private getLogLevel(category: ErrorCategory): LogLevel {\n switch (category) {\n case ErrorCategory.NETWORK:\n case ErrorCategory.SERVER:\n return LogLevel.ERROR;\n case ErrorCategory.RATE_LIMIT:\n return LogLevel.WARN;\n case ErrorCategory.CLIENT:\n case ErrorCategory.API_ERROR:\n return LogLevel.INFO;\n case ErrorCategory.PARSE:\n case ErrorCategory.VALIDATION:\n return LogLevel.DEBUG;\n default:\n return LogLevel.ERROR;\n }\n }\n\n /**\n * Create error from HTTP response\n */\n async fromResponse(\n response: Response,\n context: Omit<ErrorContext, 'statusCode'> = {},\n ): Promise<NHLError> {\n const statusCode = response.status;\n const baseContext: ErrorContext = {\n ...context,\n statusCode,\n endpoint: context.endpoint || response.url,\n };\n\n // Try to parse response body\n let responseBody: unknown;\n try {\n const text = await response.text();\n responseBody = text ? JSON.parse(text) : null;\n baseContext.responseBody = responseBody;\n } catch {\n // Response body not parseable as JSON\n }\n\n // Extract error message from JSON response if available\n const errorMessage =\n responseBody &&\n typeof responseBody === 'object' &&\n 'message' in responseBody\n ? String(responseBody.message)\n : `HTTP ${statusCode}: ${response.statusText}`;\n\n // Classify by status code\n if (statusCode === 429) {\n const retryAfter = response.headers.get('Retry-After');\n return new RateLimitError(\n errorMessage,\n baseContext,\n retryAfter ? parseInt(retryAfter, 10) : undefined,\n );\n }\n\n if (statusCode === 404) {\n return new NotFoundError(errorMessage, baseContext);\n }\n\n if (statusCode >= 500) {\n return new ServerError(errorMessage, baseContext);\n }\n\n if (statusCode >= 400) {\n return new ClientError(errorMessage, baseContext);\n }\n\n // 200-level response with error in JSON body\n if (\n responseBody &&\n typeof responseBody === 'object' &&\n 'message' in responseBody\n ) {\n return new APIError(errorMessage, baseContext);\n }\n\n // Fallback\n return new NHLError(errorMessage, ErrorCategory.CLIENT, baseContext);\n }\n\n /**\n * Create error from caught exception\n */\n fromError(error: unknown, context: ErrorContext = {}): NHLError {\n if (error instanceof NHLError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Network/fetch errors\n if (error.name === 'TypeError' || error.name === 'NetworkError') {\n return new NetworkError(error.message, {\n ...context,\n cause: error,\n });\n }\n\n // Generic error wrapper\n return new NHLError(error.message, ErrorCategory.NETWORK, {\n ...context,\n cause: error,\n });\n }\n\n // Unknown error type\n return new NHLError(\n 'An unknown error occurred',\n ErrorCategory.NETWORK,\n { ...context, cause: error },\n );\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<ErrorConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Default error handler instance\n */\nexport const defaultErrorHandler = new ErrorHandler();\n\n/**\n * Convenience function to create errors from responses\n */\nexport const fromResponse = (\n response: Response,\n context?: Omit<ErrorContext, 'statusCode'>,\n) => defaultErrorHandler.fromResponse(response, context);\n\n/**\n * Convenience function to create errors from exceptions\n */\nexport const fromError = (error: unknown, context?: ErrorContext) =>\n defaultErrorHandler.fromError(error, context);\n","/**\r\n * NHL API Client Type Definitions\r\n */\r\n\r\nimport type { NHLError } from '#/errors/index.ts';\r\n/**\r\n * Configuration options for the NHL API client\r\n */\r\nexport interface NHLClientConfig {\r\n /**\r\n * Base URL for the NHL API\r\n * @default 'https://api-web.nhle.com/v1'\r\n */\r\n baseUrl?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 5000 (5 seconds)\r\n */\r\n timeout?: number;\r\n\r\n /**\r\n * Additional headers to include with every request\r\n */\r\n headers?: Record<string, string>;\r\n\r\n /**\r\n * Language code for localized responses\r\n * @default 'en' (English)\r\n */\r\n language?: 'en' | 'fr';\r\n}\r\n\r\n/**\r\n * Predefined API endpoints for different NHL services\r\n */\r\nexport type APIEndpoint = 'edge-adv' | 'edge-stats' | 'default';\r\n\r\n/**\r\n * Mapping of API endpoints to their base URLs\r\n */\r\nexport const API_BASE_URLS: Record<APIEndpoint, string> = {\r\n 'edge-adv': 'https://api-web.nhle.com/v1',\r\n 'edge-stats': 'https://api.nhle.com/stats/rest',\r\n default: 'https://api-web.nhle.com/v1',\r\n};\r\n\r\nexport interface NHLApiResponse<T> {\r\n data: T;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\nexport type APIResponse<T> =\r\n | { status: 'success'; data: T }\r\n | { status: 'error'; error: NHLError };\r\n\r\n/**\r\n * NHL API error response structure\r\n * @deprecated Use NHLError class instead\r\n */\r\nexport interface NHLApiError {\r\n error: string;\r\n status: number;\r\n statusText: string;\r\n headers: Record<string, string>;\r\n}\r\n\r\n/**\r\n * NHL API client interface\r\n */\r\nexport interface NHLClient {\r\n /**\r\n * Send a GET request to the NHL API\r\n * @param endpoint - API endpoint path (will be appended to baseUrl)\r\n * @param params - Optional query parameters\r\n */\r\n get: <T = unknown>(\r\n endpoint: string,\r\n params?: Record<string, unknown>,\r\n ) => Promise<T>;\r\n}\r\n","/**\n * NHL API Client implementation\n * Internal client for making API requests to the NHL API\n */\n\nimport { envConfig } from '#/config/env.ts';\nimport {\n ErrorCategory,\n type ErrorConfig,\n ErrorHandler,\n NHLError,\n} from '#/errors/index.ts';\nimport type { APIEndpoint, APIResponse, NHLClientConfig } from './types.ts';\nimport { API_BASE_URLS } from './types.ts';\n\n/**\n * Extended configuration for the NHL API client including error handling\n */\nexport interface NHLClientWithErrorConfig extends NHLClientConfig {\n /**\n * Error handling configuration\n */\n errorConfig?: ErrorConfig;\n}\n\n/**\n * Default configuration for the NHL API client\n * Uses environment variables if set, otherwise falls back to sensible defaults\n */\nconst DEFAULT_CONFIG: Required<NHLClientConfig> = {\n baseUrl: 'https://api-web.nhle.com/v1',\n timeout: envConfig.timeout,\n headers: {\n Accept: 'application/json',\n },\n language: envConfig.language,\n};\n\n/**\n * NHL API Client class for making API requests to the NHL API\n * Provides methods for sending GET requests to the NHL API with automatic\n * URL construction, query parameter handling, timeout management, and\n * comprehensive error handling using the ErrorHandler utility.\n */\nexport class NHLClient {\n private config: Required<NHLClientConfig>;\n private errorHandler: ErrorHandler;\n\n /**\n * Creates a new NHL API client instance\n * @param baseURL - Optional custom base URL or predefined API endpoint key\n * @param errorConfig - Optional error handling configuration\n */\n constructor(baseURL?: string | APIEndpoint, errorConfig?: ErrorConfig) {\n this.config = { ...DEFAULT_CONFIG };\n\n // Check if baseURL is a predefined endpoint key\n if (baseURL && baseURL in API_BASE_URLS) {\n this.config.baseUrl = API_BASE_URLS[baseURL as APIEndpoint];\n } else if (baseURL) {\n this.config.baseUrl = baseURL;\n }\n\n // Initialize error handler with provided config\n this.errorHandler = new ErrorHandler(errorConfig);\n }\n\n /**\n * Helper to build URL with query parameters\n * @private\n */\n private buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Ensure endpoint doesn't have leading slash for URL construction\n const cleanEndpoint = endpoint.startsWith('/')\n ? endpoint.slice(1)\n : endpoint;\n const url = new URL(cleanEndpoint, `${this.config.baseUrl}/`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n return url.toString();\n }\n\n /**\n * Send a GET request to the NHL API\n * @param endpoint - API endpoint path\n * @param params - Optional query parameters\n * @returns Promise resolving to an APIResponse containing either data or error\n */\n async get<T = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n ): Promise<APIResponse<T>> {\n const url = this.buildUrl(endpoint, params);\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...this.config.headers,\n 'Accept-Language': this.config.language,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await this.errorHandler.fromResponse(response, {\n endpoint: url,\n });\n this.errorHandler.log(error);\n return { status: 'error', error };\n }\n\n return { data: (await response.json()) as T, status: 'success' };\n } catch (error) {\n clearTimeout(timeoutId);\n\n // If it's already an NHLError, return it\n if (error instanceof NHLError) {\n this.errorHandler.log(error);\n return { status: 'error', error };\n }\n\n // Handle AbortError (timeout)\n let nhlError: NHLError;\n if (error instanceof Error && error.name === 'AbortError') {\n nhlError = new NHLError(\n 'Request timeout',\n ErrorCategory.CLIENT,\n {\n endpoint,\n },\n );\n } else {\n // Convert other errors using ErrorHandler\n nhlError = this.errorHandler.fromError(error, {\n endpoint,\n method: 'GET',\n });\n }\n\n this.errorHandler.log(nhlError);\n return { status: 'error', error: nhlError };\n }\n }\n\n /**\n * Configure error handling behavior\n * @param config - Error configuration options\n */\n configureErrorHandling(config: Partial<ErrorConfig>): void {\n this.errorHandler.configure(config);\n }\n}\n\n/**\n * Factory function for backward compatibility\n * Creates a new NHL API client instance\n *\n * @param baseURL - Optional custom base URL or predefined API endpoint key\n * @param errorConfig - Optional error handling configuration\n * @returns A new NHL API client instance\n */\nexport function createNHLClient(\n baseURL?: string | APIEndpoint,\n errorConfig?: ErrorConfig,\n): NHLClient {\n return new NHLClient(baseURL, errorConfig);\n}\n\n/**\n * Default client instance for edge-adv API endpoints\n */\nconst nhlClient = createNHLClient('default');\n\n/**\n * Client instance for edge-stats API endpoints\n */\nconst edgeStatsClient = createNHLClient('edge-stats');\n\nexport default nhlClient;\nexport { edgeStatsClient };\n","/**\r\n * Date utility functions for NHL API\r\n * Provides functions for formatting dates and handling seasons\r\n */\r\n\r\nexport const NHL_TIMEZONE = 'America/New_York';\r\nexport const NHL_START_DATE = new Date('1916-12-19'); // 1 year prior to the first NHL game\r\nexport const NHL_END_DATE = new Date('2026-04-17'); // 1 year after the last game of the 2024-2025 season\r\n\r\n/**\r\n * Formats a date object into a string in the format YYYY-MM-DD\r\n * @param date - The date object to format\r\n * @returns The formatted date string\r\n */\r\nexport const getDate = (date: Date): string =>\r\n new Intl.DateTimeFormat('en-CA', {\r\n timeZone: NHL_TIMEZONE,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n }).format(date);\r\n/**\r\n * Returns the current date formatted as YYYY-MM-DD.\r\n * This is a convenience method that calls getDate with the current date.\r\n * @returns The current date formatted as YYYY-MM-DD\r\n */\r\nexport const getCurrentDate = (): string => getDate(new Date());\r\n\r\n/**\r\n * Formats a date object into a string representing the month in YYYY-MM format\r\n * @param date - The date object to format\r\n * @returns The formatted month string\r\n */\r\nexport const getMonth = (date: Date): string => {\r\n return new Intl.DateTimeFormat('en-CA', {\r\n timeZone: NHL_TIMEZONE,\r\n year: 'numeric',\r\n month: '2-digit',\r\n }).format(date);\r\n};\r\n\r\n/**\r\n * Returns the current month formatted as YYYY-MM\r\n * This is a convenience method that calls getMonth with the current date\r\n * @returns The current month formatted as YYYY-MM\r\n */\r\nexport const getCurrentMonth = (): string => getMonth(new Date());\r\n\r\n/**\r\n * Formats a date object into a string representing the year in YYYY format\r\n * @param date - The date object to format\r\n * @returns The formatted year string\r\n */\r\nexport const getYear = (date: Date): string =>\r\n new Intl.DateTimeFormat('en-CA', {\r\n timeZone: NHL_TIMEZONE,\r\n year: 'numeric',\r\n }).format(date);\r\n/**\r\n * Returns the current year formatted as YYYY\r\n * This is a convenience method that calls getYear with the current date\r\n * @returns The current year formatted as YYYY\r\n */\r\nexport const getCurrentYear = (): string => getYear(new Date());\r\n/**\r\n * Returns the season associated with the specified date in the format yyyyYYYY (e.g., 20232024)\r\n * @param date - The date object to parse the season from\r\n * @returns The current season formatted as yyyyYYYY\\\r\n * @throws Error if the provided date is invalid\r\n */\r\nexport const getSeason = (date: string | Date): string => {\r\n const format = new Intl.DateTimeFormat('en-CA', {\r\n timeZone: NHL_TIMEZONE,\r\n year: 'numeric',\r\n month: 'numeric',\r\n }).formatToParts(date instanceof Date ? date : new Date(date));\r\n const month = format.find((part) => part.type === 'month')?.value;\r\n const year = format.find((part) => part.type === 'year')?.value;\r\n if (!year) {\r\n throw new Error('Invalid date provided, could not extract year');\r\n }\r\n if (month && parseInt(month, 10) < 7) {\r\n console.log(month, parseInt(month, 10) < 7);\r\n return `${parseInt(year, 10) - 1}${year}`;\r\n }\r\n return `${year}${parseInt(year, 10) + 1}`;\r\n};\r\n/**\r\n * Returns the current season in the format yyyyYYYY (e.g., 20232024)\r\n * This is a convenience method that calls getSeason with the current date\r\n * @returns The current season formatted as yyyyYYYY\r\n */\r\nexport const getCurrentSeason = (): string => getSeason(new Date());\r\n","/** Categories for save location top-10 list */\nexport const SaveLocationCategoryEnum = {\n /** Save Percentage */\n 'SV%': 'save-pctg',\n /** Saves */\n SV: 'saves',\n /** Shots Against */\n SA: 'shots-against',\n /** Goals Against */\n GA: 'goals-against',\n} as const;\n\n/** Sort options for shot location top-10 list */\nexport const ShotLocationSortEnum = {\n /** All shot locations */\n ALL: 'all',\n /** High-danger (i.e. close-range) shot locations */\n HIGH: 'high',\n /** Mid-range shot locations */\n MID: 'mid',\n /** Long-range shot locations */\n LONG: 'long',\n} as const;\n\n/** Alias for ShotLocationSortEnum */\nexport const SaveLocationSortEnum = ShotLocationSortEnum;\n\n/** Sort options for 5v5 save percentage top-10 list */\nexport const SavePercentage5v5SortEnum = {\n /**5v5 Save %: The percentage of shots a goalie stops at even strength (5-on-5). */\n '5v5-SV%': 'save-pctg',\n /**5v5 Save % in Close Situations: A “close situation” is the time during which a game is tied in the first or second period, or within one goal in the third period. This stats helps how goalies perform in high-pressure situations.*/\n '5v5-SV%-Close': 'save-pctg-close',\n /**5v5 Shots Against: The total number of shots a goalie faces at even strength (5-on-5).*/\n '5v5-SA': 'shots',\n /**5v5 Shots Against per 60 Minutes: The total number of shots a goalie faces at even strength (5-on-5) normalized to a 60-minute game. */\n '5v5-SA/60': 'shots-per-60',\n} as const;\n\n/** Sort options for save percentage top-10 list */\nexport const SavePercentageSortEnum = {\n /** Starts above .900 */\n GAMES: 'games',\n /** Percentage of starts above .900 */\n PCTG: 'pctg',\n} as const;\n\n/** Filter options for player positions */\nexport const PositionFilterEnum = {\n /** Center */\n ALL: 'all',\n /** Left Wing */\n FWD: 'forwards',\n /** Right Wing */\n DEF: 'defense',\n} as const;\n\n/** Categories for skater strength */\nexport const SkatersStrengthEnum = {\n /** All strengths */\n ALL: 'all',\n /** Even strength */\n ES: 'es',\n /** Power play */\n PP: 'pp',\n /** Short-handed */\n PK: 'pk',\n} as const;\n\n/** Sorting options for shot speed top-10 list */\nexport const ShotSpeedSortEnum = {\n /** Hardest shot recorded by player */\n MAX: 'max',\n /** Shots over 100 mph */\n 'OVER-100': 'over-100',\n /** Shots between 90 and 99 mph */\n '90-99': '90-99',\n /** Shots between 80 and 89 mph */\n '80-89': '80-89',\n /** Shots between 70 and 79 mph */\n '70-79': '70-79',\n} as const;\n\n/** Sorting options for skating speed top-10 list */\nexport const SkatingSpeedSortEnum = {\n /** Fastest skating speed recorded by player */\n TOP: 'max',\n /** Speed bursts recorded over 22 mph */\n 'OVER-22': 'over-22',\n /** Speed bursts recorded between 20 and 22 mph */\n '20-22': '20-22',\n /** Speed bursts recorded between 18 and 20 mph */\n '18-20': '18-20',\n} as const;\n\n/** Sorting options for skating distance top-10 list */\nexport const SkatingDistanceSortEnum = {\n /** Total distance skated */\n TOTAL: 'total',\n /** Average distance skated per 60 minutes */\n 'PER-60': 'per-60',\n /** Maximum distance skated in a single period */\n 'MAX-PERIOD': 'max-period',\n /** Maximum distance skated in a single game */\n 'MAX-GAME': 'max-game',\n};\n\n/** Categories for shot location top-10 list */\nexport const ShotLocationCategoryEnum = {\n /** Total shots on goal */\n SOG: 'sog',\n /** Total goals */\n G: 'goals',\n /** Shooting percentage */\n 'SH%': 'shooting-pctg',\n} as const;\n\n/** Sorting options for zone time top-10 lists. */\nexport const ZoneTimeSortEnum = {\n /** Percentage of time spent in the offensive zone */\n OZ: 'offensive',\n /** Percentage of time spent in the defensive zone */\n DZ: 'defensive',\n /** Percentage of time spent in the neutral zone */\n NZ: 'neutral',\n} as const;\n","","// Values are based on the NHL API documentation and other sources.\r\n// Last updated: 2025-10-23\r\n\r\n/**\r\n * All valid NHL team abbreviations and their corresponding team IDs.\r\n */\r\nexport const TeamsEnum = {\r\n /** Anaheim Ducks */\r\n ANA: 24,\r\n /** Boston Bruins */\r\n BOS: 6,\r\n /** Buffalo Sabres */\r\n BUF: 7,\r\n /** Calgary Flames */\r\n CGY: 20,\r\n /** Carolina Hurricanes */\r\n CAR: 12,\r\n /** Chicago Blackhawks */\r\n CHI: 16,\r\n /** Colorado Avalanche */\r\n COL: 21,\r\n /** Columbus Blue Jackets */\r\n CBJ: 29,\r\n /** Dallas Stars */\r\n DAL: 25,\r\n /** Detroit Red Wings */\r\n DET: 17,\r\n /** Edmonton Oilers */\r\n EDM: 22,\r\n /** Florida Panthers */\r\n FLA: 13,\r\n /** Los Angeles Kings */\r\n LAK: 26,\r\n /** Minnesota Wild*/\r\n MIN: 30,\r\n /** Montreal Canadiens */\r\n MTL: 8,\r\n /** New Jersey Devils */\r\n NJD: 1,\r\n /** Nashville Predators */\r\n NSH: 18,\r\n /** New York Islanders */\r\n NYI: 2,\r\n /** New York Rangers */\r\n NYR: 3,\r\n /** Ottawa Senators */\r\n OTT: 9,\r\n /** Philadelphia Flyers */\r\n PHI: 4,\r\n /** Pittsburgh Penguins */\r\n PIT: 5,\r\n /** San Jose Sharks */\r\n SJS: 28,\r\n /** Seattle Kraken */\r\n SEA: 55,\r\n /** St. Louis Blues */\r\n STL: 19,\r\n /** Tampa Bay Lightning */\r\n TBL: 14,\r\n /** Toronto Maple Leafs */\r\n TOR: 10,\r\n /** Utah Hockey Club */\r\n UTA: 59,\r\n /** Vancouver Canucks */\r\n VAN: 23,\r\n /** Vegas Golden Knights */\r\n VGK: 54,\r\n /** Winnipeg Jets */\r\n WPG: 52,\r\n /** Washington Capitals */\r\n WSH: 15,\r\n} as const;\r\n\r\nexport const TeamsReverseEnum = Object.fromEntries(\r\n Object.entries(TeamsEnum).map(([key, value]) => [value, key]),\r\n) as Record<\r\n (typeof TeamsEnum)[keyof typeof TeamsEnum],\r\n keyof typeof TeamsEnum\r\n>;\r\n\r\n/**\r\n * All inactive NHL teams and their corresponding team IDs.\r\n */\r\nexport const InactiveTeamsEnum = {\r\n /** Atlanta Flames (not active) */\r\n AFM: 47,\r\n /** Arizona Coyotes (not active) */\r\n ARI: 53,\r\n /** Atlanta Thrashers (not active) */\r\n ATL: 11,\r\n /** Brooklyn Americans - (not active) */\r\n BRK: 51,\r\n /** California Golden Seals (aka Bay Area Seals) - (not active) */\r\n CGS: 56,\r\n /** Cleveland Barons - (not active) */\r\n CLE: 49,\r\n /** Colorado Rockies - (not active) */\r\n CLR: 35,\r\n /** Detroit Cougars - (not active) */\r\n DCG: 40,\r\n /** Detroit Falcons - (not active) */\r\n DFL: 50,\r\n /** Hamilton Tigers - (not active) */\r\n HAM: 37,\r\n /** Hartford Whalers - (not active) */\r\n HFD: 34,\r\n /** Kansas City Scouts - (not active) */\r\n KCS: 48,\r\n /** Montreal Maroons - (not active) */\r\n MMR: 43,\r\n /** Minnesota North Stars - (not active) */\r\n MNS: 31,\r\n /** Montreal Wanderers - (not active) */\r\n MWN: 41,\r\n /** New York Americans - (not active) */\r\n NYA: 44,\r\n /** California Seals (aka Oakland Seals) - (not active) */\r\n OAK: 46,\r\n /** Phoenix Coyotes - (not active) */\r\n PHX: 27,\r\n /** Pittsburgh Pirates - (not active) */\r\n PIR: 38,\r\n /** Quebec Bulldogs - (not active) */\r\n QBD: 42,\r\n /** Philadelphia Quakers - (not active) */\r\n QUA: 39,\r\n /** Quebec Nordiques - (not active) */\r\n QUE: 32,\r\n /** Ottawa Senators (original franchise) - (not active) */\r\n SEN: 36,\r\n /** St. Louis Eagles - (not active) */\r\n SLE: 45,\r\n /** Toronto Hockey Club (aka Toronto Arenas) - (not active) */\r\n TAN: 57,\r\n /** Toronto St. Patricks - (not active) */\r\n TSP: 58,\r\n /** Winnipeg Jets (original franchise) - (not active) */\r\n WIN: 33,\r\n} as const;\r\n\r\nexport const InactiveTeamsReverseEnum = Object.fromEntries(\r\n Object.entries(InactiveTeamsEnum).map(([key, value]) => [value, key]),\r\n) as Record<\r\n (typeof InactiveTeamsEnum)[keyof typeof InactiveTeamsEnum],\r\n keyof typeof InactiveTeamsEnum\r\n>;\r\n/**\r\n * All valid NHL seasons in yyyyYYYY format.\r\n */\r\nexport const SeasonsArray = [\r\n 19171918, 19181919, 19191920, 19201921, 19211922, 19221923, 19231924,\r\n 19241925, 19251926, 19261927, 19271928, 19281929, 19291930, 19301931,\r\n 19311932, 19321933, 19331934, 19341935, 19351936, 19361937, 19371938,\r\n 19381939, 19391940, 19401941, 19411942, 19421943, 19431944, 19441945,\r\n 19451946, 19461947, 19471948, 19481949, 19491950, 19501951, 19511952,\r\n 19521953, 19531954, 19541955, 19551956, 19561957, 19571958, 19581959,\r\n 19591960, 19601961, 19611962, 19621963, 19631964, 19641965, 19651966,\r\n 19661967, 19671968, 19681969, 19691970, 19701971, 19711972, 19721973,\r\n 19731974, 19741975, 19751976, 19761977, 19771978, 19781979, 19791980,\r\n 19801981, 19811982, 19821983, 19831984, 19841985, 19851986, 19861987,\r\n 19871988, 19881989, 19891990, 19901991, 19911992, 19921993, 19931994,\r\n 19941995, 19951996, 19961997, 19971998, 19981999, 19992000, 20002001,\r\n 20012002, 20022003, 20032004, 20052006, 20062007, 20072008, 20082009,\r\n 20092010, 20102011, 20112012, 20122013, 20132014, 20142015, 20152016,\r\n 20162017, 20172018, 20182019, 20192020, 20202021, 20212022, 20222023,\r\n 20232024, 20242025, 20252026,\r\n] as const;\r\n\r\n/**\r\n * All valid NHL playoff series letters.\r\n */\r\nexport const SeriesLetterEnum = {\r\n /** Atlantic Division Round 1: D1 vs WC# */\r\n A: 'A',\r\n /** Atlantic Division Round 1: D2 vs D3 */\r\n B: 'B',\r\n /** Metropolitan Division Round 1: D1 vs WC# */\r\n C: 'C',\r\n /** Metropolitan Division Round 1: D2 vs D3 */\r\n D: 'D',\r\n /** Central Division Round 1: D1 vs WC# */\r\n E: 'E',\r\n /** Central Division Round 1: D2 vs D3 */\r\n F: 'F',\r\n /** Pacific Division Round 1: D1 vs WC# */\r\n G: 'G',\r\n /** Pacific Division Round 1: D2 vs D3 */\r\n H: 'H',\r\n /** Atlantic Division Round 2: Aw vs Bw */\r\n I: 'I',\r\n /** Metropolitan Division Round 2: Cw vs Dw */\r\n J: 'J',\r\n /** Central Division Round 2: Ew vs Fw */\r\n K: 'K',\r\n /** Pacific Division Round 2: Gw vs Hw */\r\n L: 'L',\r\n /** Eastern Conference Finals */\r\n M: 'M',\r\n /** Western Conference Finals*/\r\n N: 'N',\r\n /** Stanley Cup Finals */\r\n O: 'O',\r\n} as const;\r\n\r\n/**\r\n * All valid NHL playoff series letters grouped by round.\r\n */\r\nexport const SeriesLetterByRound = {\r\n R1: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],\r\n R2: ['I', 'J', 'K', 'L'],\r\n CF: ['M', 'N'],\r\n SCF: ['O'],\r\n};\r\n/**\r\n * All valid NHL playoff series letters mapped to human-readable names.\r\n */\r\nexport const PlayoffSeriesEnum = {\r\n Atlantic_R1_D1_vs_WC: 'A',\r\n Atlantic_R1_D2_vs_D3: 'B',\r\n Metropolitan_R1_D1_vs_WC: 'C',\r\n Metropolitan_R1_D2_vs_D3: 'D',\r\n Central_R1_D1_vs_WC: 'E',\r\n Central_R1_D2_vs_D3: 'F',\r\n Pacific_R1_D1_vs_WC: 'G',\r\n Pacific_R1_D2_vs_D3: 'H',\r\n Atlantic_R2_Aw_vs_Bw: 'I',\r\n Metropolitan_R2_Cw_vs_Dw: 'J',\r\n Central_R2_Ew_vs_Fw: 'K',\r\n Pacific_R2_Gw_vs_Hw: 'L',\r\n Eastern_Conference_Finals: 'M',\r\n Western_Conference_Finals: 'N',\r\n Stanley_Cup_Finals: 'O',\r\n};\r\n\r\n/**\r\n * All valid NHL game states.\r\n */\r\nexport const GameStateEnum = {\r\n /** Future */\r\n FUT: 'FUT',\r\n /** Live */\r\n LIV: 'LIV',\r\n /** Finished */\r\n FIN: 'FIN',\r\n} as const;\r\n\r\n/**\r\n * All valid NHL period types.\r\n */\r\nexport const PeriodTypeEnum = {\r\n /** Regulation */\r\n REG: 'REG',\r\n /** Overtime */\r\n OT: 'OT',\r\n /** Shootout */\r\n SO: 'SO',\r\n} as const;\r\n\r\n/**\r\n * All valid NHL game types.\r\n */\r\nexport const GameTypeEnum = {\r\n /** Pre-season */\r\n PRE: 1,\r\n /** Regular season */\r\n REG: 2,\r\n /** Post-season (aka playoffs) */\r\n POST: 3,\r\n /** All-Star Game (unconfirmed) */\r\n ASG: 4,\r\n /** International (unconfirmed) */\r\n INTL: 19,\r\n} as const;\r\n\r\n/** */\r\nexport const SEASON_RANGE = {\r\n START: SeasonsArray[0] as number,\r\n END: SeasonsArray.at(-1) as number,\r\n};\r\n/** */\r\nexport const START_SEASON = SEASON_RANGE.START;\r\n/** */\r\nexport const END_SEASON = SEASON_RANGE.END;\r\n/** */\r\nexport const YEAR_RANGE = {\r\n START: parseInt(SEASON_RANGE.START.toString().slice(0, 4), 10),\r\n END: parseInt(SEASON_RANGE.END.toString().slice(4, 8), 10),\r\n};\r\n/** */\r\nexport const START_YEAR = YEAR_RANGE.START;\r\n/** */\r\nexport const END_YEAR = YEAR_RANGE.END;\r\n/** */\r\nexport const CURRENT = {\r\n SEASON: SEASON_RANGE.END,\r\n YEAR: YEAR_RANGE.END,\r\n};\r\n/** */\r\nexport const PLAYER_ID_RANGE = { MIN: 8444000, MAX: 8489999 } as const;\r\n/** */\r\nexport const TEAM_ID_RANGE = { MIN: 1, MAX: 59 } as const;\r\n// export const TEAM_ID_RANGE = {\r\n// MIN: Object.values(TeamsEnum).reduce(\r\n// (min, team) => Math.min(min, team),\r\n// Infinity,\r\n// ),\r\n// MAX: Object.values(TeamsEnum).reduce(\r\n// (max, team) => Math.max(max, team),\r\n// -Infinity,\r\n// ),\r\n// } as const;\r\n","import * as EA from './edge-adv.ts';\nimport * as ES from './edge-stats.ts';\n\nexport const EDGE = { ...EA, ...ES };\nexport * as NHL from './nhl.ts';\n","import { type } from 'arktype';\nimport { EDGE, NHL } from '#/constants/index.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport { getCurrentDate } from '#/utils/date.ts';\n\nexport function isParseError(value: unknown): value is type.errors {\n return value instanceof type.errors;\n}\n\nexport function createValidationError(\n parsed: unknown,\n path: string,\n): ValidationError | null {\n if (parsed instanceof type.errors) {\n return new ValidationError(parsed.summary, { endpoint: path });\n }\n return null;\n}\n\nexport const Year = type(`${NHL.START_YEAR} <= number <= ${NHL.END_YEAR}`)\n .or(\n type('string.numeric.parse').narrow((v) => {\n return v >= NHL.START_YEAR && v <= NHL.END_YEAR;\n }),\n )\n .describe(`a valid year from ${NHL.START_YEAR} to ${NHL.END_YEAR}`);\n\nexport const Season = type('number.integer | string.numeric.parse')\n .narrow((v): v is number => {\n const yr = Math.trunc(v / 10000);\n return typeof Year(yr) === 'number' && yr + 1 === v % 10000;\n })\n .pipe((v) => v.toString())\n .describe(`a valid NHL season, e.g. ${NHL.CURRENT.SEASON}`);\n\nexport const TeamAbbrev = type\n .enumerated(\n ...(Object.keys(NHL.TeamsEnum) as (keyof typeof NHL.TeamsEnum)[]),\n ...(Object.keys(\n NHL.InactiveTeamsEnum,\n ) as (keyof typeof NHL.InactiveTeamsEnum)[]),\n )\n .describe('a valid NHL team abbreviation');\n\nexport const TeamId = type\n .enumerated(...Object.values(NHL.TeamsEnum))\n .describe('a valid NHL team ID');\n\nexport const GameType = type\n .enumerated(\n ...(Object.keys(\n NHL.GameTypeEnum,\n ) as (keyof typeof NHL.GameTypeEnum)[]),\n )\n .pipe((v) => NHL.GameTypeEnum[v])\n .or(type('1|2|3|4|19|\"1\"|\"2\"|\"3\"|\"4\"|\"19\"'))\n .describe('a valid NHL game type (e.g., REG, PRE, POST)');\n\nexport const GameNumber = type('number')\n .atLeast(1)\n .atMost((82 * 32) / 2) // Max possible games in a season - need to bump to 84 per team in 2026-27\n .or(\n type('string.numeric.parse').narrow((v) => {\n return v >= 1 && v <= (82 * 32) / 2;\n }),\n )\n .pipe((v) => v.toString())\n .describe('a valid NHL game number between 1 and 1312');\n\nexport const DraftRound = type('1 <= number <= 7')\n .or(type(/^(1|2|3|4|5|6|7)$/))\n .pipe((v) => (typeof v === 'number' ? v.toString() : v))\n .describe('a valid NHL draft round (1-7)');\n\nexport const PlayoffRound = type('1 <= number <= 4')\n .or(type(/^(1|2|3|4)$/))\n .pipe((v) => (typeof v === 'number' ? v.toString() : v))\n .describe('a valid NHL playoff round (1-4)');\n\nexport const EventId = type('number.integer | string.numeric.parse')\n .narrow((v): v is number => Number.isInteger(v) && v > 0)\n .describe('a positive integer representing an NHL event ID');\n\nexport const NHLDate = type('Date | string.date.iso')\n .pipe((v) =>\n typeof v === 'string'\n ? new Date(v).toISOString().slice(0, 10)\n : v.toISOString().slice(0, 10),\n )\n .describe(\n 'a valid date, either as a string (ISO date string) or a Date object',\n );\nexport const NHLMonth = type('Date | string')\n .narrow((v) => {\n if (typeof v === 'string') {\n return /^\\d{4}-\\d{2}$/.test(v);\n } else if (v instanceof Date) {\n return true;\n }\n return false;\n })\n .pipe((v) => (typeof v === 'string' ? v : v.toISOString().slice(0, 7)))\n .describe(\n 'a valid month, either as a string (formatted as YYYY-MM) or a Date object',\n );\n\nexport const GameTypeCode = type('1|2|3|4|19').describe(\n 'a valid NHL game type code (1=PRE, 2=REG, 3=POST, 4=ASG, 19=INTL)',\n);\n\nconst parseGameIdParts = type({\n year: Year,\n gameType: GameType,\n gameNumber: GameNumber,\n});\n\nexport const GameId = type('number.integer | string.numeric.parse')\n .narrow((v) => {\n if (Number.isInteger(v) && v < 0) return false;\n const year = Math.trunc(v / 1e6); // remove last 6 digits\n const gameType = Math.trunc(v / 1e4) % 1e2; // remove last 4 digits, then get last 2 digits\n const gameNumber = v % 1e4; // get last 4 digits\n const valid = !(\n parseGameIdParts({ year, gameType, gameNumber }) instanceof\n type.errors\n );\n return valid;\n })\n .describe('a positive integer representing an NHL game ID');\n\nexport const SeriesLetter = type\n .enumerated(...Object.values(NHL.SeriesLetterEnum))\n .describe('a valid NHL playoff series letter (A-O)');\n\nexport const GameState = type\n .enumerated(...Object.values(NHL.GameStateEnum))\n .describe('a valid NHL game state');\n\nexport const CountryCode = type(/^[a-zA-Z]{2}$/)\n .pipe((v) => v.toLowerCase())\n .describe('a valid ISO 3166-1 alpha-2 country code, e.g. US, CA, RU');\n\nexport const PostalCode = type(/^[a-zA-Z]\\d[a-zA-Z] \\d[a-zA-Z]\\d$/)\n .or(type(/^\\d{5}$/))\n .describe(\n 'a valid postal code, either US ZIP code (5 digit) or Canadian postal code (A1A 1A1 format; space required)',\n );\n\nexport const PlayerId = type('number')\n .atLeast(NHL.PLAYER_ID_RANGE.MIN)\n .atMost(NHL.PLAYER_ID_RANGE.MAX)\n .or(\n type('string.numeric.parse').narrow((v) => {\n return (\n v >= NHL.PLAYER_ID_RANGE.MIN && v <= NHL.PLAYER_ID_RANGE.MAX\n );\n }),\n )\n .pipe((v) => v.toString())\n .describe('a valid NHL player ID');\n\nexport const SaveLocationCategory = type\n .enumerated(\n ...(Object.keys(\n EDGE.SaveLocationCategoryEnum,\n ) as (keyof typeof EDGE.SaveLocationCategoryEnum)[]),\n )\n .pipe((v) => EDGE.SaveLocationCategoryEnum[v]);\n\nexport const ShotLocationSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.ShotLocationSortEnum,\n ) as (keyof typeof EDGE.ShotLocationSortEnum)[]),\n )\n .pipe((v) => EDGE.ShotLocationSortEnum[v]);\n\nexport const SaveLocationSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.SaveLocationSortEnum,\n ) as (keyof typeof EDGE.SaveLocationSortEnum)[]),\n )\n .pipe((v) => EDGE.SaveLocationSortEnum[v]);\n\nexport const SavePercentage5v5Sort = type\n .enumerated(\n ...(Object.keys(\n EDGE.SavePercentage5v5SortEnum,\n ) as (keyof typeof EDGE.SavePercentage5v5SortEnum)[]),\n )\n .pipe((v) => EDGE.SavePercentage5v5SortEnum[v]);\n\nexport const SavePercentageSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.SavePercentageSortEnum,\n ) as (keyof typeof EDGE.SavePercentageSortEnum)[]),\n )\n .pipe((v) => EDGE.SavePercentageSortEnum[v]);\n\nexport const PositionFilter = type\n .enumerated(\n ...(Object.keys(\n EDGE.PositionFilterEnum,\n ) as (keyof typeof EDGE.PositionFilterEnum)[]),\n )\n .pipe((v) => EDGE.PositionFilterEnum[v]);\n\nexport const SkatersStrength = type\n .enumerated(\n ...(Object.keys(\n EDGE.SkatersStrengthEnum,\n ) as (keyof typeof EDGE.SkatersStrengthEnum)[]),\n )\n .pipe((v) => EDGE.SkatersStrengthEnum[v]);\n\nexport const ShotSpeedSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.ShotSpeedSortEnum,\n ) as (keyof typeof EDGE.ShotSpeedSortEnum)[]),\n )\n .pipe((v) => EDGE.ShotSpeedSortEnum[v]);\n\nexport const SkatingSpeedSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.SkatingSpeedSortEnum,\n ) as (keyof typeof EDGE.SkatingSpeedSortEnum)[]),\n )\n .pipe((v) => EDGE.SkatingSpeedSortEnum[v]);\n\nexport const SkatingDistanceSort = type.enumerated(\n ...(Object.keys(\n EDGE.SkatingDistanceSortEnum,\n ) as (keyof typeof EDGE.SkatingDistanceSortEnum)[]),\n);\n// .pipe((v) => C.SkatingDistanceSortEnum[v]);\n\nexport const ShotLocationCategory = type\n .enumerated(\n ...(Object.keys(\n EDGE.ShotLocationCategoryEnum,\n ) as (keyof typeof EDGE.ShotLocationCategoryEnum)[]),\n )\n .pipe((v) => EDGE.ShotLocationCategoryEnum[v]);\n\nexport const ZoneTimeSort = type\n .enumerated(\n ...(Object.keys(\n EDGE.ZoneTimeSortEnum,\n ) as (keyof typeof EDGE.ZoneTimeSortEnum)[]),\n )\n .pipe((v) => EDGE.ZoneTimeSortEnum[v]);\n\n/** utility types */\n\nexport const BaseParams = type({\n season: Season.or('undefined').pipe((v) => v ?? NHL.CURRENT.SEASON),\n gameType: GameType.or('undefined').pipe(\n (v) => v ?? NHL.GameTypeEnum.REG,\n ),\n});\n\nexport const SeasonAndGameType = type({\n season: Season.or('undefined').optional(),\n gameType: GameType.or('undefined').optional(),\n});\n\nexport const PlayerParams = BaseParams.merge({\n playerId: PlayerId,\n season: Season,\n});\n\nexport const TeamParams = BaseParams.merge({\n teamId: TeamId,\n});\n\nexport const top10Params = BaseParams.merge({\n position: PositionFilter.default('ALL'),\n strength: SkatersStrength.default('ALL'),\n});\n\nexport const DraftParams = type({\n year: Year.or('undefined').pipe((v) => v ?? NHL.CURRENT.YEAR),\n round: DraftRound.or('undefined').optional(),\n});\n\nexport const GameIdAndEventId = type({\n gameId: GameId,\n eventId: EventId,\n});\n\nexport const TeamAndSeasonParams = type({\n team: TeamAbbrev,\n season: Season.or('undefined').pipe((v) => v ?? NHL.CURRENT.SEASON),\n});\n\nexport const SeriesAndSeasonParams = type({\n seriesLetter: SeriesLetter,\n season: Season.or('undefined').pipe((v) => v ?? NHL.CURRENT.SEASON),\n});\n\nexport const SeriesParams = type({\n seriesLetter: SeriesLetter,\n year: Year.or('undefined').pipe((v) => v ?? NHL.CURRENT.YEAR),\n});\n\nexport const ScheduleParams = type({\n team: TeamAbbrev,\n date: NHLDate.or('undefined').pipe((v) => v ?? getCurrentDate()),\n period: type('\"week\" | \"month\" | undefined').pipe((v) => v ?? 'week'),\n});\n","/**\n * Helper to construct API path with parameters\n */\nexport function route(\n template: string,\n params: Record<string, string | number | undefined>,\n): string {\n let route = template;\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n route = route.replace(`{${key}}`, String(value));\n }\n return route;\n}\n","/**\n * Game-related API endpoints\n */\nimport nhlClient from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type {\n GamecenterBoxscore,\n GamecenterLanding,\n GamecenterPlayByPlay,\n GamecenterReports,\n LeagueSchedule,\n NetworkTVSchedule,\n PlayoffBracket,\n PlayoffSeries,\n PlayoffSeriesSchedule,\n PPTReplayEvent,\n PPTReplayGoal,\n ScheduleCalendar,\n WhereToWatch,\n WSCGameStory,\n WSCPlayByPlay,\n} from '#/types/responses/gamecenter/index.ts';\nimport {\n getCurrentDate,\n getCurrentSeason,\n getCurrentYear,\n} from '#/utils/date.ts';\nimport {\n GameId,\n GameIdAndEventId,\n isParseError,\n NHLDate,\n Season,\n SeriesAndSeasonParams,\n Year,\n} from '#/utils/schemas.ts';\nimport { route } from '#/utils/utils.ts';\n\nconst _paths = {\n schedule: 'schedule/{date}',\n scheduleCalendar: 'schedule-calendar/{date}',\n playoffBracket: 'playoff-bracket/{year}',\n playoffSeries: 'playoff-series/{season}',\n playoffSeriesSchedule: 'schedule/playoff-series/{season}/{seriesLetter}',\n gamecenter: {\n playByPlay: 'gamecenter/{gameId}/play-by-play',\n reports: 'gamecenter/{gameId}/right-rail',\n landing: 'gamecenter/{gameId}/landing',\n boxscore: 'gamecenter/{gameId}/boxscore',\n },\n wsc: {\n gameStory: 'wsc/game-story/{gameId}',\n playByPlay: 'wsc/play-by-play/{gameId}',\n },\n pptReplay: {\n goal: 'ppt-replay/{gameId}/goal/{eventId}',\n event: 'ppt-replay/{date}',\n },\n whereToWatch: 'where-to-watch',\n networkTVSchedule: 'network/tv-schedule/{date}',\n};\n\n/**\n * Get play-by-play data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to play-by-play data\n */\nexport const playByPlay = (\n gameId: string | number,\n): Promise<APIResponse<GamecenterPlayByPlay>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.gamecenter.playByPlay,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.gamecenter.playByPlay, { gameId: parsedGameId }),\n );\n};\n\n/**\n * Get reports data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to reports data\n * @note The official endpoint name is 'right-rail', as it is used\n * to populate the right rail UI component of the NHL website. The\n * function has been renamed to 'reports' for clarity.\n */\nexport const reports = (\n gameId: string | number,\n): Promise<APIResponse<GamecenterReports>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.gamecenter.reports,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.gamecenter.reports, { gameId: parsedGameId }),\n );\n};\n/**\n * Get landing page data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to landing page data\n */\nexport const landing = (\n gameId: string | number,\n): Promise<APIResponse<GamecenterLanding>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.gamecenter.landing,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.gamecenter.landing, { gameId: parsedGameId }),\n );\n};\n/**\n * Get boxscore data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to boxscore data\n */\nexport const boxscore = (\n gameId: string | number,\n): Promise<APIResponse<GamecenterBoxscore>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.gamecenter.boxscore,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.gamecenter.boxscore, { gameId: parsedGameId }),\n );\n};\n\nexport const wsc = {\n /**\n * Get game story data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to game story data\n */\n gameStory: (\n gameId: number | string,\n ): Promise<APIResponse<WSCGameStory>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.wsc.gameStory,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.wsc.gameStory, { gameId: parsedGameId }),\n );\n },\n\n /**\n * Get play-by-play data for a specific game\n * @param gameId - The unique identifier for the game\n * @returns Promise resolving to play-by-play data\n */\n playByPlay: (\n gameId: number | string,\n ): Promise<APIResponse<WSCPlayByPlay>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.wsc.playByPlay,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.wsc.playByPlay, { gameId: parsedGameId }),\n );\n },\n};\n\n/**\n * Access PPT replay related endpoints\n */\nexport const pptReplay = {\n /**\n * Get goal replay data for a specific game and event\n * @param gameId - The unique identifier for the game\n * @param eventId - The unique identifier for the event\n * @returns Promise resolving to goal replay data\n */\n goal: (\n gameId: number | string,\n eventId: number | string,\n ): Promise<APIResponse<PPTReplayGoal>> => {\n const parsed = GameIdAndEventId({ gameId, eventId });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.pptReplay.goal,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.pptReplay.goal, { gameId, eventId }),\n );\n },\n\n /**\n * Get event replay data for a specific date\n * @param date - Date to get event replay data for (Date object or ISO date string)\n * @returns Promise resolving to event replay data\n */\n event: async (\n date: Date | string,\n ): Promise<APIResponse<PPTReplayEvent>> => {\n const parsedDate = NHLDate(date);\n if (isParseError(parsedDate)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedDate.summary, {\n endpoint: _paths.pptReplay.event,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.pptReplay.event, { date: parsedDate }),\n );\n },\n};\n\n/**\n * Access schedule related endpoints\n */\nexport const schedule = (\n date?: Date | string,\n): Promise<APIResponse<LeagueSchedule>> => {\n const parsedDate = NHLDate(date ?? getCurrentDate());\n if (isParseError(parsedDate)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedDate.summary, {\n endpoint: _paths.schedule,\n }),\n });\n }\n return nhlClient.get(route(_paths.schedule, { date: parsedDate }));\n};\n\n/**\n * Access schedule calendar related endpoints\n */\nexport const scheduleCalendar = (\n date?: Date | string,\n): Promise<APIResponse<ScheduleCalendar>> => {\n const parsedDate = NHLDate(date);\n if (isParseError(parsedDate)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedDate.summary, {\n endpoint: _paths.scheduleCalendar,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.scheduleCalendar, { date: parsedDate }),\n );\n};\n\n/**\n * Access playoff bracket related endpoints\n */\nexport const playoffBracket = (\n year?: string,\n): Promise<APIResponse<PlayoffBracket>> => {\n const parsedYear = Year(year ?? getCurrentYear());\n if (isParseError(parsedYear)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedYear.summary, {\n endpoint: _paths.playoffBracket,\n }),\n });\n }\n return nhlClient.get(route(_paths.playoffBracket, { year: parsedYear }));\n};\n\n/**\n * Access playoff series related endpoints\n */\nexport const playoffSeries = (\n season?: string,\n): Promise<APIResponse<PlayoffSeries>> => {\n const parsedSeason = Season(season ?? getCurrentSeason());\n if (isParseError(parsedSeason)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedSeason.summary, {\n endpoint: _paths.playoffSeries,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.playoffSeries, { season: parsedSeason }),\n );\n};\n\n/**\n * Access playoff series schedule related endpoints\n */\nexport const playoffSeriesSchedule = (\n seriesLetter: string,\n season?: string,\n): Promise<APIResponse<PlayoffSeriesSchedule>> => {\n const parsed = SeriesAndSeasonParams({\n seriesLetter,\n season: season ?? getCurrentSeason(),\n });\n\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.playoffSeriesSchedule,\n }),\n });\n }\n // series letter is a single character from A to O (/[a-oA-O]/)\n // Are series letters assigned in a pre determined manner?\n return nhlClient.get(route(_paths.playoffSeriesSchedule, parsed));\n};\n\n/**\n * Access where-to-watch related endpoints\n */\nexport const whereToWatch = (): Promise<APIResponse<WhereToWatch>> =>\n nhlClient.get(_paths.whereToWatch);\n\n/**\n * Access network related endpoints\n */\n/**\n * Get TV schedule data for a specific date\n * @param date - Date to get TV schedule data for (optional)\n * @returns Promise resolving to TV schedule data\n */\nexport const networkTVSchedule = (\n date?: Date | string,\n): Promise<APIResponse<NetworkTVSchedule>> => {\n const parsedDate = NHLDate(date ?? getCurrentDate());\n if (isParseError(parsedDate)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedDate.summary, {\n endpoint: _paths.networkTVSchedule,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.networkTVSchedule, { date: parsedDate }),\n );\n};\n","/**\n * @module api/misc\n * @description Miscellaneous NHL API endpoints for meta information, location data, and other utility functions\n */\n\nimport nhlClient from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type {\n GameMeta,\n LocationInfo,\n NHLSeasons,\n PartnerGameInfo,\n PlayoffSeriesMeta,\n PostalCodeInfo,\n} from '#/types/responses/gamecenter/index.ts';\nimport {\n CountryCode,\n GameId,\n isParseError,\n PostalCode,\n SeriesParams,\n} from '#/utils/schemas.ts';\nimport { route } from '#/utils/utils.ts';\n\nconst _paths = {\n season: 'season',\n metaPlayoffSeries: 'meta/playoff-series/{year}/{seriesLetter}',\n metaGame: 'meta/game/{gameId}',\n postalLookup: 'postal-lookup/{postalCode}',\n location: 'location',\n partnerGame: 'partner-game/{countryCode}/now',\n};\n\n// returns a basic array of all valid NHL seasons\nexport const seasons = (): Promise<APIResponse<NHLSeasons>> => {\n return nhlClient.get(_paths.season);\n};\n\nexport const meta = {\n /**\n * Get meta information for a playoff series\n *\n * @param year - The year in YYYY format\n * @param seriesLetter - Single letter identifier for the playoff series\n * @returns Promise resolving to playoff series meta information\n */\n playoffSeries: (\n seriesLetter: string,\n year?: number | string,\n ): Promise<APIResponse<PlayoffSeriesMeta>> => {\n const parsed = SeriesParams({ year, seriesLetter });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.metaPlayoffSeries,\n }),\n });\n }\n return nhlClient.get(route(_paths.metaPlayoffSeries, parsed));\n },\n\n /**\n * Get meta information for a specific game\n *\n * @param gameId - The unique game identifier\n * @returns Promise resolving to game meta information\n */\n game: (gameId: string | number): Promise<APIResponse<GameMeta>> => {\n const parsedGameId = GameId(gameId);\n if (isParseError(parsedGameId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedGameId.summary, {\n endpoint: _paths.metaGame,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.metaGame, { gameId: parsedGameId }),\n );\n },\n};\n\n/**\n * Lookup information based on postal code\n *\n * @param postalCode - The postal/zip code to lookup\n * @returns Promise resolving to postal code information\n */\nexport const postalLookup = (\n postalCode: string,\n): Promise<APIResponse<PostalCodeInfo>> => {\n const parsedPostalCode = PostalCode(postalCode);\n if (isParseError(parsedPostalCode)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedPostalCode.summary, {\n endpoint: _paths.postalLookup,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.postalLookup, { postalCode: parsedPostalCode }),\n );\n};\n\n/**\n * Get location information\n *\n * @returns Promise resolving to the location determined by the API\n * (assumed to be based on the user's IP address)\n */\nexport const location = (): Promise<APIResponse<LocationInfo>> => {\n return nhlClient.get(_paths.location);\n};\n\n/**\n * Get partner game information for a specific country\n *\n * @param countryCode - The two-letter country code (e.g. 'ca', 'se', 'cz', etc.)\n * @returns Promise resolving to partner game information\n */\nexport const partnerGame = (\n countryCode: string,\n): Promise<APIResponse<PartnerGameInfo>> => {\n const parsedCountryCode = CountryCode(countryCode);\n if (isParseError(parsedCountryCode)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedCountryCode.summary, {\n endpoint: _paths.partnerGame,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.partnerGame, { countryCode: parsedCountryCode }),\n );\n};\n","/**\n *\n */\n\nimport nhlClient, { createNHLClient } from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type {\n GoalieStatsLeaders,\n PlayerGameLog,\n PlayerLanding,\n PlayerSearchResult,\n PlayerSpotlight,\n SkaterStatsLeaders,\n} from '#/types/responses/gamecenter/index.ts';\nimport { BaseParams, isParseError, PlayerId } from '#/utils/schemas.ts';\nimport { route } from '#/utils/utils.ts';\n\nconst _paths = {\n landing: 'player/{playerId}/landing',\n gameLog: 'player/{playerId}/game-log/{season}/{gameType}',\n spotlight: 'player-spotlight',\n statsLeaders: {\n skaters: 'skater-stats-leaders/{season}/{gameType}',\n goalies: 'goalie-stats-leaders/{season}/{gameType}',\n },\n playerSearch: 'https://search.d3.nhle.com/api/v1/search/player',\n};\n\nconst nhlPlayerSearch = createNHLClient(_paths.playerSearch);\nconst searchUrlParams = { culture: 'en', q: '' };\n\n/**\n * Get player landing information\n * @param playerId - The unique player identifier\n * @returns Promise resolving to player landing information\n */\nexport const landing = (\n playerId: number | string,\n): Promise<APIResponse<PlayerLanding>> => {\n const parsedPlayerId = PlayerId(playerId);\n if (isParseError(parsedPlayerId)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsedPlayerId.summary, {\n endpoint: _paths.landing,\n }),\n });\n }\n return nhlClient.get(\n route(_paths.landing, { playerId: parsedPlayerId }),\n );\n};\n\nexport const gameLog = (\n playerId: number | string,\n season?: number | string,\n gameType?: number | string,\n): Promise<APIResponse<PlayerGameLog>> => {\n const Parser = BaseParams.merge({\n playerId: PlayerId,\n });\n const parsed = Parser({ playerId, season, gameType });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.gameLog,\n }),\n });\n }\n return nhlClient.get(route(_paths.gameLog, parsed));\n};\n\nexport const spotlight = (): Promise<APIResponse<PlayerSpotlight>> => {\n return nhlClient.get(_paths.spotlight);\n};\n\nexport const search = (\n query: string,\n): Promise<APIResponse<PlayerSearchResult>> => {\n return nhlPlayerSearch.get('', {\n ...searchUrlParams,\n q: query,\n });\n};\n\n/**\n * Access stats leaders related endpoints\n */\nexport const statsLeaders = {\n /**\n * Get skater stats leaders\n * @param season - The season identifier (optional)\n * @param gameType - The game type identifier (optional)\n * @returns Promise resolving to skater stats leaders\n */\n skaters: (\n season?: number | string,\n gameType?: number | string,\n ): Promise<APIResponse<SkaterStatsLeaders>> => {\n const parsed = BaseParams({ season, gameType });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.statsLeaders.skaters,\n }),\n });\n }\n return nhlClient.get(route(_paths.statsLeaders.skaters, parsed));\n },\n\n /**\n * Get goalie stats leaders\n * @param season - The season identifier (optional)\n * @param gameType - The game type identifier (optional)\n * @returns Promise resolving to goalie stats leaders\n */\n goalies: (\n season?: number | string,\n gameType?: number | string,\n ): Promise<APIResponse<GoalieStatsLeaders>> => {\n const parsed = BaseParams({ season, gameType });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.statsLeaders.goalies,\n }),\n });\n }\n return nhlClient.get(route(_paths.statsLeaders.goalies, parsed));\n },\n};\n","import nhlClient from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type { NHLScore, NHLScoreboard, TeamAbbrev } from '#/types/index.ts';\nimport { getCurrentDate } from '#/utils/date.ts';\nimport {\n isParseError,\n NHLDate,\n TeamAbbrev as Team,\n} from '#/utils/schemas.ts';\nimport { route } from '#/utils/utils.ts';\n\nconst _paths = {\n score: 'score/{date}',\n scoreboard: {\n now: 'scoreboard/now',\n byTeam: 'scoreboard/{team}/now',\n byDate: 'scoreboard/{date}',\n },\n};\n\n/**\n * Access score related endpoints\n */\n/**\n * Get scores for a specific date\n * @param date - Date to get scores for (Date object or ISO date string)\n * @returns Promise resolving to scores for the specified date\n */\nexport const score = (\n date?: Date | string,\n): Promise<APIResponse<NHLScore>> => {\n const parsed = NHLDate(date ?? getCurrentDate());\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.score,\n }),\n });\n }\n return nhlClient.get(route(_paths.score, { date: parsed }));\n};\n\n/**\n * Access scoreboard related endpoints\n */\n\nexport const scoreboard = (): Promise<APIResponse<NHLScoreboard>> =>\n nhlClient.get<NHLScoreboard>(_paths.scoreboard.now);\n/**\n * Get scoreboard data for a specific team\n * @param team - The team abbreviation\n * @returns Promise resolving to scoreboard data for the specified team\n */\nscoreboard.team = async (\n team: TeamAbbrev,\n): Promise<APIResponse<NHLScoreboard>> => {\n const parsed = Team(team);\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.scoreboard.byTeam,\n }),\n });\n }\n return nhlClient.get<NHLScoreboard>(\n route(_paths.scoreboard.byTeam, { team: parsed }),\n );\n};\n/**\n * Get scoreboard data for a specific date\n * @param date - Date to get scoreboard data for (Date object or ISO date string)\n * @returns Promise resolving to scoreboard data for the specified date\n */\nscoreboard.date = async (\n date: Date | string,\n): Promise<APIResponse<NHLScoreboard>> => {\n const parsed = NHLDate(date);\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: _paths.scoreboard.byDate,\n }),\n });\n }\n return nhlClient.get<NHLScoreboard>(\n route(_paths.scoreboard.byDate, { date: parsed }),\n );\n};\n","import nhlClient from '#/client/index.ts';\nimport type { APIResponse } from '#/client/types.ts';\nimport { ValidationError } from '#/errors/index.ts';\nimport type {\n NHLMonth,\n NHLStandings,\n NHLStandingsSeason,\n TeamProspects,\n TeamRoster,\n TeamRosterSeasons,\n TeamScheduleMonth,\n TeamScheduleSeason,\n TeamScheduleWeek,\n TeamStats,\n TeamStatsSeason,\n} from '#/types/index.ts';\nimport { getCurrentDate } from '#/utils/date.ts';\nimport {\n BaseParams,\n isParseError,\n NHLDate,\n ScheduleParams,\n TeamAbbrev,\n TeamAndSeasonParams,\n} from '#/utils/schemas.ts';\nimport { route } from '../../utils/utils.ts';\n\nconst paths = {\n rosterSeasons: 'roster-season/{team}',\n roster: 'roster/{team}/{season}',\n prospects: 'prospects/{team}',\n clubStats: 'club-stats/{team}/{season}/{gameType}',\n clubStatsSeason: 'club-stats-season/{team}',\n standings: 'standings/{date}',\n standingsSeason: 'standings-season',\n clubSchedule: 'club-schedule/{team}/{period}/{date}',\n clubScheduleSeason: 'club-schedule-season/{team}/{season}',\n};\n\n/**\n * Access roster seasons related endpoints\n */\nexport const rosterSeasons = (\n team: string,\n): Promise<APIResponse<TeamRosterSeasons>> => {\n const parsed = TeamAbbrev(team);\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.rosterSeasons,\n }),\n });\n }\n return nhlClient.get(route(paths.rosterSeasons, { team: parsed }));\n};\n\n/**\n * Access roster related endpoints\n */\nexport const roster = (\n team: string,\n season?: string | number,\n): Promise<APIResponse<TeamRoster>> => {\n const parsed = TeamAndSeasonParams({ team, season });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.roster,\n }),\n });\n }\n return nhlClient.get(route(paths.roster, parsed));\n};\n\n/**\n * Access prospects related endpoints\n */\nexport const prospects = (\n team: string,\n): Promise<APIResponse<TeamProspects>> => {\n const parsed = TeamAbbrev(team);\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.prospects,\n }),\n });\n }\n return nhlClient.get(route(paths.prospects, { team: parsed }));\n};\n\n/**\n * Access club stats related endpoints\n */\nexport const clubStats = (\n team: string,\n season?: string | number,\n gameType?: string | number,\n): Promise<APIResponse<TeamStats>> => {\n const Parser = BaseParams.merge({\n team: TeamAbbrev,\n });\n const parsed = Parser({ team, season, gameType });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.clubStats,\n }),\n });\n }\n return nhlClient.get(route(paths.clubStats, parsed));\n};\n\n/**\n * Access club stats season related endpoints\n */\nexport const clubStatsSeason = (\n team: string,\n): Promise<APIResponse<TeamStatsSeason>> => {\n const parsed = TeamAbbrev(team);\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.clubStatsSeason,\n }),\n });\n }\n return nhlClient.get(route(paths.clubStatsSeason, { team: parsed }));\n};\n\n/**\n * Access standings related endpoints\n */\nexport const standings = (\n date?: Date | string,\n): Promise<APIResponse<NHLStandings>> => {\n const parsed = NHLDate(date ?? getCurrentDate());\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.standings,\n }),\n });\n }\n return nhlClient.get(route(paths.standings, { date: parsed }));\n};\n\n/**\n * Access standings season related endpoints\n */\nexport const standingsSeason = (): Promise<\n APIResponse<NHLStandingsSeason>\n> => {\n return nhlClient.get(paths.standingsSeason);\n};\n\n/**\n * Access club schedule related endpoints\n */\nconst clubSchedule = (\n team: string,\n date?: Date | string,\n period?: 'week' | 'month',\n): Promise<APIResponse<TeamScheduleWeek | TeamScheduleMonth>> => {\n const parsed = ScheduleParams({ team, date, period });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.clubSchedule,\n }),\n });\n }\n if (period === 'month') {\n parsed.date = parsed.date?.slice(0, 7); // 'YYYY-MM'\n }\n return nhlClient.get(route(paths.clubSchedule, parsed));\n};\n\n/**\n * Access club schedule season related endpoints\n */\nconst clubScheduleSeason = (\n team: string,\n season?: number,\n): Promise<APIResponse<TeamScheduleSeason>> => {\n const parsed = TeamAndSeasonParams({ team, season });\n if (isParseError(parsed)) {\n return Promise.resolve({\n status: 'error',\n error: new ValidationError(parsed.summary, {\n endpoint: paths.clubScheduleSeason,\n }),\n });\n }\n return nhlClient.get(route(paths.clubScheduleSeason, parsed));\n};\n\nexport const schedule = {\n /** Returns the full season schedule for the provided team and season\n * @param team - The team abbreviation for the desired team\n * @param season - The specific season (e.g. 20222023); if not provided, defaults to the current season.\n * @returns A promise that resolves to the full season schedule for the specified team and season\n * @example\n * ```ts\n * // Get the full season schedule for the Boston Bruins for the 2022-2023 season\n * schedule.season('BOS', 20222023).then((data) => {\n * console.log(data);\n * });\n * ```\n */\n season: clubScheduleSeason,\n\n /**\n * Get the team schedule for any seven-day period\n * @param team - The team abbreviation\n * @param date - The date indicating the start of the seven-day period.\n * If not provided, defaults to the current date. format: 'YYYY-MM'\n * @returns A promise that resolves to the club schedule for the specified week\n *\n * @example\n * ```ts\n * import { schedule } from 'nhle-api';\n *\n * // Get the schedule for the Chicago Blackhawks for the week of November 4, 2023\n * // This returns the schedule from November 4 to November 10, 2023\n * schedule.week('CHI', '2023-11-04').then((data) => {\n * console.log(data);\n * });\n * ```\n */\n week: (\n team: string,\n date?: Date | string,\n ): Promise<APIResponse<TeamScheduleWeek>> =>\n clubSchedule(team, date, 'week'),\n\n /**\n * Get the team schedule for any month\n * @param team - The team abbreviation\n * @param date - The date indicating the month to get the schedule for.\n * If not provided, defaults to the current month. format: 'YYYY-MM'\n * @returns A promise that resolves to the club schedule for the specified month\n *\n * @example\n * ```ts\n * import { schedule } from 'nhle-api';\n *\n * // Get the schedule for the Toronto Maple Leafs for November 2023\n * schedule.month('TOR', '2023-11').then((data) => {\n * console.log(data);\n * });\n * ```\n */\n month: (\n team: string,\n date?: NHLMonth,\n ): Promise<APIResponse<TeamScheduleMonth>> =>\n clubSchedule(team, date, 'month'),\n};\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nhle-api",
|
|
3
|
+
"version": "0.5.1",
|
|
4
|
+
"description": "A modern NHLe API wrapper written in TypeScript.",
|
|
5
|
+
"main": "lib/index.cjs",
|
|
6
|
+
"module": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./lib/index.d.ts",
|
|
12
|
+
"require": "./lib/index.cjs",
|
|
13
|
+
"import": "./lib/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"lib",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE",
|
|
20
|
+
"CHANGELOG.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "bunx tsup",
|
|
24
|
+
"dev": "bunx tsup --watch",
|
|
25
|
+
"typecheck": "bunx tsc --noEmit",
|
|
26
|
+
"test": "bun test",
|
|
27
|
+
"test:watch": "bun test --watch",
|
|
28
|
+
"prepublishOnly": "bun run build",
|
|
29
|
+
"wadl:check": "bun scripts/check-wadl.ts"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"nhl",
|
|
33
|
+
"api",
|
|
34
|
+
"edge",
|
|
35
|
+
"stats",
|
|
36
|
+
"hockey",
|
|
37
|
+
"sports",
|
|
38
|
+
"typescript"
|
|
39
|
+
],
|
|
40
|
+
"author": "jbru",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/spiflicate/nhle-api.git"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@biomejs/biome": "2.3.4",
|
|
48
|
+
"@types/bun": "^1.3.1",
|
|
49
|
+
"msw": "^2.12.0",
|
|
50
|
+
"tsup": "^8.5.0",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"arktype": "^2.1.25"
|
|
55
|
+
}
|
|
56
|
+
}
|