api-invoke 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/{chunk-TXAOTXB4.js → chunk-576QTR6M.js} +2 -2
- package/dist/chunk-576QTR6M.js.map +1 -0
- package/dist/index.cjs +12 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/parser-2SYVX2KD.js +3 -0
- package/dist/{parser-PMZEKQPK.js.map → parser-2SYVX2KD.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-TXAOTXB4.js.map +0 -1
- package/dist/parser-PMZEKQPK.js +0 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/types.ts","../src/core/errors.ts","../src/adapters/graphql/introspection.ts","../src/adapters/graphql/query-builder.ts","../src/adapters/graphql/parser.ts","../src/core/executor.ts","../src/core/sse.ts","../src/core/url-builder.ts","../src/core/auth.ts","../src/adapters/openapi/parser.ts","../src/adapters/openapi/base-url.ts","../src/adapters/openapi/security.ts","../src/adapters/raw/parser.ts","../src/core/detection.ts","../src/client.ts","../src/index.ts","../src/core/auth-config.ts","../src/middleware/retry.ts","../src/middleware/cors-proxy.ts","../src/middleware/logging.ts","../src/middleware/oauth-refresh.ts","../src/adapters/manual/builder.ts","../src/adapters/graphql/errors.ts"],"names":["HttpMethod","ParamLocation","AuthType","SpecFormat","HeaderName","ContentType","ApiInvokeError","ErrorKind","API_INVOKE_ERROR_NAME","result","body","parseError","SwaggerParser","parseGraphQLSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Core types for api-invoke.\n * Spec-agnostic — these work with any API format (OpenAPI, GraphQL, raw URL, manual builder).\n * All enums use `as const` objects for autocomplete + extensibility.\n */\n\nimport { ErrorKind } from './errors'\n\n// === Constants ===\n\n/** Standard HTTP methods supported by api-invoke. */\nexport const HttpMethod = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n HEAD: 'HEAD',\n OPTIONS: 'OPTIONS',\n} as const\nexport type HttpMethod = (typeof HttpMethod)[keyof typeof HttpMethod]\n\n/** Where a parameter is located in the HTTP request. */\nexport const ParamLocation = {\n PATH: 'path',\n QUERY: 'query',\n HEADER: 'header',\n COOKIE: 'cookie',\n} as const\nexport type ParamLocation = (typeof ParamLocation)[keyof typeof ParamLocation]\n\n/** Supported authentication types. */\nexport const AuthType = {\n BEARER: 'bearer',\n BASIC: 'basic',\n API_KEY: 'apiKey',\n QUERY_PARAM: 'queryParam',\n OAUTH2: 'oauth2',\n COOKIE: 'cookie',\n} as const\nexport type AuthType = (typeof AuthType)[keyof typeof AuthType]\n\n/** Detected API specification format. */\nexport const SpecFormat = {\n OPENAPI_3: 'openapi-3',\n OPENAPI_2: 'openapi-2',\n RAW_URL: 'raw-url',\n MANUAL: 'manual',\n GRAPHQL: 'graphql',\n} as const\nexport type SpecFormat = (typeof SpecFormat)[keyof typeof SpecFormat]\n\n/** Well-known HTTP header names used internally. */\nexport const HeaderName = {\n ACCEPT: 'Accept',\n AUTHORIZATION: 'Authorization',\n CONTENT_TYPE: 'Content-Type',\n COOKIE: 'Cookie',\n} as const\nexport type HeaderName = (typeof HeaderName)[keyof typeof HeaderName]\n\n// === Parsed API (spec-agnostic) ===\n\n/**\n * A parsed API specification, normalized into a spec-agnostic format.\n * This is the central data model — all adapters (OpenAPI, GraphQL, raw URL, manual builder) produce this shape.\n */\nexport interface ParsedAPI {\n /** Human-readable API title (e.g. 'Petstore API'). */\n title: string\n /** API version string from the spec (e.g. '1.0.0'). */\n version: string\n /** Base URL for all operations (e.g. 'https://api.example.com/v1'). */\n baseUrl: string\n /** All available API operations extracted from the spec. */\n operations: Operation[]\n /** Authentication schemes declared in the spec. */\n authSchemes: AuthScheme[]\n /** Which adapter produced this ParsedAPI. */\n specFormat: SpecFormat | string\n /** Raw spec version string from the spec (e.g. '3.0.3', '2.0'). Only set for OpenAPI specs. */\n rawSpecVersion?: string\n}\n\n/**\n * A single API operation (endpoint + method).\n * Produced by parsing a spec or using the manual builder.\n */\nexport interface Operation {\n /** Unique identifier for this operation (e.g. 'listUsers', 'get_users'). */\n id: string\n /** URL path template with placeholders (e.g. '/users/{userId}'). */\n path: string\n /** HTTP method (e.g. 'GET', 'POST'). */\n method: HttpMethod | string\n /** Short summary of what this operation does. */\n summary?: string\n /** Longer description of the operation's behavior. */\n description?: string\n /** Parameters accepted by this operation (path, query, header, cookie). */\n parameters: Parameter[]\n /** Request body definition, if the operation accepts one. */\n requestBody?: RequestBody\n /** Primary response schema for the operation's success case. For OpenAPI specs, this is the first 2xx schema found (see parser for priority). Useful for code generation or validation. */\n responseSchema?: unknown\n /** Success and default response schemas keyed by HTTP status code (e.g. '200', '201', 'default'). Codes without schemas (e.g. 204 No Content) are omitted. Error codes (4xx/5xx) are not extracted. */\n responseSchemas?: Record<string, unknown>\n /** Primary response content type (e.g. 'application/json', 'application/xml'). Used as the default Accept header. */\n responseContentType?: ContentType | string\n /** Error response descriptions keyed by HTTP status code (e.g. '404' → 'User not found'). Extracted from 4xx/5xx responses in the spec. */\n errorHints?: Record<string, string>\n /** Tags for grouping operations (e.g. ['users', 'admin']). */\n tags: string[]\n /**\n * Custom body builder for protocol adapters (e.g., GraphQL).\n * When set and no explicit 'body' key is in args, the executor calls this instead of flat-arg assembly to construct the request body.\n * Receives the full args map and returns the body data to be serialized.\n */\n buildBody?: (args: Record<string, unknown>) => unknown\n}\n\n/**\n * A parameter accepted by an API operation.\n */\nexport interface Parameter {\n /** Parameter name as used in the request (e.g. 'userId', 'page'). */\n name: string\n /** Where this parameter appears in the request. */\n in: ParamLocation\n /** Whether this parameter must be provided. Path parameters are always required. */\n required: boolean\n /** Human-readable description of the parameter. */\n description: string\n /** Type and constraint information for this parameter. */\n schema: ParameterSchema\n}\n\n/**\n * Type and constraint information for a parameter.\n */\nexport interface ParameterSchema {\n /** Data type (e.g. 'string', 'integer', 'boolean', 'array'). */\n type: string\n /** Format hint (e.g. 'int32', 'date-time', 'email', 'uuid'). */\n format?: string\n /** Allowed values for this parameter. */\n enum?: unknown[]\n /** Default value used when the parameter is not provided. */\n default?: unknown\n /** Example value for documentation and testing. */\n example?: unknown\n /** Minimum value for numeric parameters. */\n minimum?: number\n /** Maximum value for numeric parameters. */\n maximum?: number\n /** Maximum length for string parameters. */\n maxLength?: number\n /** Element schema for array parameters. */\n items?: ParameterSchema\n}\n\n/** Well-known MIME content types. */\nexport const ContentType = {\n JSON: 'application/json',\n FORM_URLENCODED: 'application/x-www-form-urlencoded',\n MULTIPART: 'multipart/form-data',\n XML: 'application/xml',\n OCTET_STREAM: 'application/octet-stream',\n TEXT: 'text/plain',\n SSE: 'text/event-stream',\n} as const\nexport type ContentType = (typeof ContentType)[keyof typeof ContentType]\n\n/**\n * Request body definition for an operation.\n */\nexport interface RequestBody {\n /** Whether the request body is required for this operation. */\n required: boolean\n /** Human-readable description of the request body. */\n description?: string\n /** Content type for the request body (e.g. 'application/json'). */\n contentType: ContentType | string\n /** Schema describing the request body structure. */\n schema: RequestBodySchema\n}\n\n/**\n * Schema for a request body, with flattened top-level properties for easy access.\n */\nexport interface RequestBodySchema {\n /** Top-level type (usually 'object'). */\n type: string\n /** Original unprocessed schema from the spec. Useful for advanced use cases like code generation. */\n raw: unknown\n /** Flattened top-level properties, keyed by property name. Only present when type is 'object'. */\n properties?: Record<string, RequestBodyProperty>\n /** Names of required properties. */\n required?: string[]\n}\n\n/**\n * A single property within a request body schema.\n */\nexport interface RequestBodyProperty {\n /** Data type (e.g. 'string', 'integer', 'boolean'). */\n type: string\n /** Format hint (e.g. 'date-time', 'email'). */\n format?: string\n /** Human-readable description of this property. */\n description?: string\n /** Allowed values for this property. */\n enum?: unknown[]\n /** Default value for this property. */\n default?: unknown\n /** Example value for documentation and testing. */\n example?: unknown\n /** True when this property is an object or array with nested structure. Useful for UI rendering decisions. */\n nested?: boolean\n}\n\n// === Authentication ===\n\n/**\n * An authentication scheme declared in the API spec.\n * Describes how the API expects credentials to be provided, but does not contain actual credentials.\n */\nexport interface AuthScheme {\n /** Scheme name from the spec (e.g. 'bearerAuth', 'api_key'). */\n name: string\n /** Mapped auth type, or null if the scheme is unsupported. */\n authType: AuthType | null\n /** Additional scheme-specific metadata (e.g. header name for API keys, OAuth2 URLs). */\n metadata: Record<string, string>\n /** Human-readable description of the auth scheme. */\n description: string\n}\n\n/**\n * Credentials for authenticating API requests.\n * Discriminated union on `type` — use the `AuthType` constants to construct.\n *\n * @example\n * // Bearer token\n * const auth: Auth = { type: AuthType.BEARER, token: 'sk-...' }\n *\n * @example\n * // API key in a header\n * const auth: Auth = { type: AuthType.API_KEY, location: ParamLocation.HEADER, name: 'X-API-Key', value: 'my-key' }\n */\nexport type Auth =\n | { type: typeof AuthType.BEARER; token: string }\n | { type: typeof AuthType.BASIC; username: string; password: string }\n | { type: typeof AuthType.API_KEY; location: typeof ParamLocation.HEADER | typeof ParamLocation.QUERY; name: string; value: string }\n | { type: typeof AuthType.OAUTH2; accessToken: string; refreshToken?: string; tokenUrl?: string; clientId?: string; clientSecret?: string }\n | { type: typeof AuthType.COOKIE; name: string; value: string }\n\n// === Execution ===\n\n/**\n * A fully constructed HTTP request ready to be sent (or previewed).\n * Produced by {@link buildRequest} and included in execution results for debugging.\n */\nexport interface BuiltRequest {\n /** HTTP method (e.g. 'GET', 'POST'). */\n method: HttpMethod | string\n /** Fully resolved URL with path and query parameters substituted. */\n url: string\n /** Request headers including auth, content-type, and accept. */\n headers: Record<string, string>\n /** Serialized request body, if present. String for JSON/form-urlencoded, FormData for multipart. */\n body?: string | FormData\n}\n\n/**\n * Subset of {@link ErrorKind} that can appear on {@link ExecutionResult.errorKind}.\n * Only HTTP-response errors — client-side errors (CORS, NETWORK, TIMEOUT) always throw regardless of `throwOnHttpError`.\n */\nexport type ResultErrorKind = typeof ErrorKind.AUTH | typeof ErrorKind.RATE_LIMIT | typeof ErrorKind.HTTP\n\n/**\n * Result of executing an API operation.\n * Contains the parsed response data, status, headers, timing, and the original request for debugging.\n */\nexport interface ExecutionResult {\n /** HTTP status code (e.g. 200, 404, 500). */\n status: number\n /** Parsed response body. JSON responses are parsed to objects; binary responses are ArrayBuffers; others attempt JSON parsing before falling back to strings. */\n data: unknown\n /** Response content type from the Content-Type header (e.g. 'application/json', 'text/xml'). */\n contentType: string\n /** Response headers as a flat key-value map. */\n headers: Record<string, string>\n /** The request that was sent, useful for debugging and logging. */\n request: BuiltRequest\n /** Request duration in milliseconds (from send to response headers received, before body parsing). */\n elapsedMs: number\n /** Set when `throwOnHttpError` is false and the response is an error. Allows programmatic error classification without throwing. */\n errorKind?: ResultErrorKind\n}\n\n// === Streaming ===\n\n/**\n * A parsed Server-Sent Event.\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n */\nexport interface SSEEvent {\n /** Event type (e.g. 'message', 'error'). Absent when no `event:` field was set in the stream. */\n event?: string\n /** Event payload. For JSON-encoded events, this is the raw string — parse it with `JSON.parse()`. */\n data: string\n /** Last event ID. Per spec, values containing U+0000 NULL are ignored by the parser. */\n id?: string\n /** Reconnection time in milliseconds. Must be a non-negative integer per spec. */\n retry?: number\n}\n\n/**\n * Result of a streaming API call. Errors always throw before this object is constructed,\n * so `status` is guaranteed to be 2xx. The `stream` is single-use — iterating it twice\n * will fail since the underlying ReadableStream reader can only be consumed once.\n * Unlike `ExecutionResult`, `elapsedMs` measures time to receive the response headers (not total stream consumption time)\n * and `errorKind` is absent (errors throw, no non-throwing mode for streams).\n */\nexport interface StreamingExecutionResult {\n /** HTTP status code (guaranteed 2xx). */\n status: number\n /** Async iterable of SSE events. Single-use — can only be iterated once. */\n stream: AsyncIterable<SSEEvent>\n /** Response content type (expected: 'text/event-stream'). */\n contentType: string\n /** Response headers as a flat key-value map. */\n headers: Record<string, string>\n /** The request that was sent. */\n request: BuiltRequest\n /** Time-to-first-byte in milliseconds (not total stream consumption time). */\n elapsedMs: number\n}\n\n// === Enricher ===\n\n/**\n * Post-processing hook that transforms a ParsedAPI after parsing.\n * Useful for adding custom operations, modifying base URLs, or injecting metadata.\n */\nexport interface Enricher {\n /** Enricher name for identification in logs and debugging. */\n readonly name: string\n /**\n * Transform the parsed API. May return a new object or modify in place.\n * Can be async for enrichers that need to fetch external data.\n */\n enrichAPI(api: ParsedAPI): ParsedAPI | Promise<ParsedAPI>\n}\n\n// === Client Options ===\n\n/**\n * Configuration options for {@link ApiInvokeClient} and {@link createClient}.\n */\nexport interface ClientOptions {\n /** Original spec URL, used for base URL fallback when the spec has no servers/host field. */\n specUrl?: string\n /** Default authentication credentials for all operations. Can be overridden per-call. */\n auth?: Auth | Auth[]\n /** Middleware pipeline applied to every request/response (e.g. logging, CORS proxy). */\n middleware?: Middleware[]\n /** Custom fetch implementation. Defaults to `globalThis.fetch`. Useful for testing or wrapping with {@link withRetry}. */\n fetch?: typeof globalThis.fetch\n /** Post-parse enricher that transforms the ParsedAPI before client construction. */\n enricher?: Enricher\n /** Default timeout in milliseconds for all operations. 0 = no timeout (default). */\n timeoutMs?: number\n}\n\n// === Middleware ===\n\n/**\n * Middleware hook for intercepting requests and responses.\n * All hooks are optional — implement only the ones you need.\n */\nexport interface Middleware {\n /** Middleware name for identification in logs and debugging. */\n name?: string\n /**\n * Called before each request is sent. Can modify the URL and request init.\n * Middleware runs in order — later middleware sees changes from earlier ones.\n */\n onRequest?(url: string, init: RequestInit): { url: string; init: RequestInit } | Promise<{ url: string; init: RequestInit }>\n /**\n * Called after receiving a response. Can transform or replace the response.\n * Runs in order — later middleware sees the response from earlier ones.\n */\n onResponse?(response: Response): Response | Promise<Response>\n /**\n * Called when a fetch error occurs (network failure, CORS, timeout).\n * For logging/monitoring only — cannot recover from the error.\n * Exceptions thrown by this handler are suppressed (logged as warnings).\n */\n onError?(error: Error): void\n}\n","/**\n * Classified API errors with human/agent-readable suggestions.\n * Each error has a `kind` for programmatic handling and `retryable` for retry logic.\n */\n\n/**\n * Error classification constants. Use with {@link ApiInvokeError.kind} for programmatic error handling.\n *\n * @example\n * ```ts\n * if (error.kind === ErrorKind.RATE_LIMIT) {\n * // Wait and retry\n * }\n * ```\n */\nexport const ErrorKind = {\n CORS: 'cors',\n NETWORK: 'network',\n AUTH: 'auth',\n HTTP: 'http',\n PARSE: 'parse',\n RATE_LIMIT: 'rate-limit',\n TIMEOUT: 'timeout',\n GRAPHQL: 'graphql',\n} as const\nexport type ErrorKind = (typeof ErrorKind)[keyof typeof ErrorKind]\n\n/** Error name constant used on all ApiInvokeError instances. Useful for cross-realm `instanceof` checks. */\nexport const API_INVOKE_ERROR_NAME = 'ApiInvokeError' as const\n\n/**\n * Structured error thrown by api-invoke for all API failures.\n * Includes a machine-readable `kind`, a human-readable `suggestion`, and a `retryable` flag.\n *\n * @example\n * ```ts\n * try {\n * await client.execute('getUser', { userId: 123 })\n * } catch (error) {\n * if (error instanceof ApiInvokeError) {\n * console.log(error.kind) // 'auth', 'network', 'rate-limit', etc.\n * console.log(error.suggestion) // Human-readable recovery advice\n * console.log(error.retryable) // Whether retrying might succeed\n * }\n * }\n * ```\n */\nexport class ApiInvokeError extends Error {\n /** Error classification for programmatic handling. */\n readonly kind: ErrorKind | string\n /** HTTP status code, if the error originated from an HTTP response. */\n readonly status?: number\n /** Human-readable suggestion for how to resolve this error. */\n readonly suggestion: string\n /** Whether retrying the request might succeed (e.g. true for rate limits, network errors). */\n readonly retryable: boolean\n /** Response body from the API (when available). May be parsed JSON, a string, or binary data depending on the response content type. */\n readonly responseBody?: unknown\n\n constructor(opts: {\n kind: ErrorKind | string\n message: string\n suggestion: string\n retryable?: boolean\n status?: number\n responseBody?: unknown\n }) {\n super(opts.message)\n this.name = API_INVOKE_ERROR_NAME\n this.kind = opts.kind\n this.suggestion = opts.suggestion\n this.retryable = opts.retryable ?? false\n this.status = opts.status\n this.responseBody = opts.responseBody\n }\n}\n\n/**\n * Create a CORS error for when a browser request is blocked by the same-origin policy.\n * @param url - The URL that was blocked\n * @returns An `ApiInvokeError` with `kind: 'cors'` and `retryable: false`\n */\nexport function corsError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.CORS,\n message: `Cannot access ${url} — blocked by CORS policy.`,\n suggestion: 'This API does not allow browser requests. Use a CORS proxy or server-side execution.',\n retryable: false,\n })\n}\n\n/**\n * Create a network error for connection failures.\n * @param url - The URL that failed to connect\n * @returns An `ApiInvokeError` with `kind: 'network'` and `retryable: true`\n */\nexport function networkError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.NETWORK,\n message: `Network error while fetching ${url}.`,\n suggestion: 'Check your internet connection and verify the URL is correct.',\n retryable: true,\n })\n}\n\n/**\n * Create an authentication/authorization error (401 or 403).\n * @param url - The URL that returned the error\n * @param status - HTTP status code (401 or 403)\n * @param responseBody - Parsed response body, if available\n * @returns An `ApiInvokeError` with `kind: 'auth'` and `retryable: false`\n */\nexport function authError(url: string, status: 401 | 403, responseBody?: unknown): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: status === 401\n ? `Authentication failed for ${url} (401)`\n : `Authorization denied for ${url} (403)`,\n suggestion: status === 401\n ? 'Check your credentials. The server rejected your authentication.'\n : 'Your credentials are valid but you lack permission for this resource.',\n retryable: false,\n status,\n responseBody,\n })\n}\n\n/**\n * Create an HTTP error for non-2xx responses (excluding 401/403 which use {@link authError}).\n * Status 429 is classified as `kind: 'rate-limit'`; all others as `kind: 'http'`.\n * @param url - The URL that returned the error\n * @param status - HTTP status code\n * @param statusText - HTTP status text (e.g. 'Not Found')\n * @param responseBody - Parsed response body, if available\n * @returns An `ApiInvokeError` with `retryable: true` for 429 and 5xx status codes\n */\nexport function httpError(url: string, status: number, statusText: string, responseBody?: unknown): ApiInvokeError {\n const retryable = status === 429 || status >= 500\n const kind = status === 429 ? ErrorKind.RATE_LIMIT : ErrorKind.HTTP\n\n let suggestion: string\n if (status === 404) {\n suggestion = 'The endpoint was not found. Check the URL path.'\n } else if (status === 429) {\n suggestion = 'Rate limited. Wait and retry.'\n } else if (status >= 500) {\n suggestion = 'The API server is having issues. Try again later.'\n } else {\n suggestion = `The API returned an error (${status}). Verify the request.`\n }\n\n return new ApiInvokeError({\n kind,\n message: `API returned ${status} ${statusText} for ${url}.`,\n suggestion,\n retryable,\n status,\n responseBody,\n })\n}\n\n/**\n * Create a parse error for when the response body cannot be read as the expected format.\n * @param url - The URL that returned the unparseable response\n * @param expectedType - The expected format (default: 'JSON')\n * @returns An `ApiInvokeError` with `kind: 'parse'` and `retryable: false`\n */\nexport function parseError(url: string, expectedType = 'JSON'): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `Failed to parse response from ${url} as ${expectedType}.`,\n suggestion: `The API response body could not be read as ${expectedType}. Verify the endpoint returns the expected content type.`,\n retryable: false,\n })\n}\n\n/**\n * Create a GraphQL error for when the response contains errors and no data (total failure).\n * @param messages - Joined error messages from the GraphQL response\n * @param status - HTTP status code (usually 200 for GraphQL)\n * @param responseBody - Full GraphQL response body\n * @returns An `ApiInvokeError` with `kind: 'graphql'` and `retryable: false`\n */\nexport function graphqlError(messages: string, status?: number, responseBody?: unknown): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.GRAPHQL,\n message: `GraphQL errors: ${messages}`,\n suggestion: 'Check the query and variables for correctness.',\n retryable: false,\n status,\n responseBody,\n })\n}\n\n/**\n * Create a timeout error for when a request exceeds the configured `timeoutMs`.\n * @param url - The URL that timed out\n * @returns An `ApiInvokeError` with `kind: 'timeout'` and `retryable: true`\n */\nexport function timeoutError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.TIMEOUT,\n message: `Request to ${url} timed out.`,\n suggestion: 'The server took too long to respond. Try again or increase the timeout.',\n retryable: true,\n })\n}\n","/**\n * GraphQL introspection query and types for parsing introspection results.\n * Based on the GraphQL specification's introspection system.\n */\n\n/** GraphQL type kinds from the introspection system. */\nexport const TypeKind = {\n SCALAR: 'SCALAR',\n OBJECT: 'OBJECT',\n ENUM: 'ENUM',\n INPUT_OBJECT: 'INPUT_OBJECT',\n NON_NULL: 'NON_NULL',\n LIST: 'LIST',\n UNION: 'UNION',\n INTERFACE: 'INTERFACE',\n} as const\nexport type TypeKind = (typeof TypeKind)[keyof typeof TypeKind]\n\n/** Introspection query covering types, fields, args, and enums. Omits possibleTypes and directives for simplicity. */\nexport const INTROSPECTION_QUERY = `query IntrospectionQuery {\n __schema {\n queryType { name }\n mutationType { name }\n subscriptionType { name }\n types {\n kind name description\n fields(includeDeprecated: false) {\n name description\n args { name description type { ...TypeRef } defaultValue }\n type { ...TypeRef }\n }\n inputFields { name description type { ...TypeRef } defaultValue }\n enumValues(includeDeprecated: false) { name description }\n }\n }\n}\nfragment TypeRef on __Type {\n kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } }\n}`\n\nexport interface IntrospectionResult {\n data: { __schema: IntrospectionSchema }\n}\n\nexport interface IntrospectionSchema {\n queryType: { name: string } | null\n mutationType: { name: string } | null\n subscriptionType: { name: string } | null\n types: IntrospectionType[]\n}\n\nexport interface IntrospectionType {\n kind: TypeKind | string\n name: string\n description?: string | null\n fields?: IntrospectionField[] | null\n inputFields?: IntrospectionInputValue[] | null\n enumValues?: Array<{ name: string; description?: string | null }> | null\n}\n\nexport interface IntrospectionField {\n name: string\n description?: string | null\n args: IntrospectionInputValue[]\n type: IntrospectionTypeRef\n}\n\nexport interface IntrospectionInputValue {\n name: string\n description?: string | null\n type: IntrospectionTypeRef\n defaultValue?: string | null\n}\n\nexport interface IntrospectionTypeRef {\n kind: TypeKind | string\n name: string | null\n ofType?: IntrospectionTypeRef | null\n}\n","/**\n * Generates GraphQL query strings from introspection type information.\n * Produces depth-limited selection sets that cover scalar fields and nested objects.\n */\n\nimport { TypeKind } from './introspection'\nimport type { IntrospectionField, IntrospectionInputValue, IntrospectionType, IntrospectionTypeRef } from './introspection'\n\nconst DEFAULT_MAX_DEPTH = 2\n\n/**\n * Format a GraphQL type reference as a human-readable string.\n *\n * @example\n * formatTypeRef({ kind: 'NON_NULL', name: null, ofType: { kind: 'SCALAR', name: 'String', ofType: null } })\n * // => 'String!'\n */\nexport function formatTypeRef(ref: IntrospectionTypeRef): string {\n if (ref.kind === TypeKind.NON_NULL) {\n return ref.ofType ? `${formatTypeRef(ref.ofType)}!` : 'unknown!'\n }\n if (ref.kind === TypeKind.LIST) {\n return ref.ofType ? `[${formatTypeRef(ref.ofType)}]` : '[unknown]'\n }\n return ref.name ?? 'unknown'\n}\n\n/**\n * Unwrap NON_NULL and LIST wrappers to find the base (named) type.\n */\nexport function unwrapType(ref: IntrospectionTypeRef): IntrospectionTypeRef {\n let current = ref\n while ((current.kind === TypeKind.NON_NULL || current.kind === TypeKind.LIST) && current.ofType) {\n current = current.ofType\n }\n return current\n}\n\n/**\n * Check if a type reference is non-null (required).\n */\nexport function isNonNull(ref: IntrospectionTypeRef): boolean {\n return ref.kind === TypeKind.NON_NULL\n}\n\n/**\n * Build a GraphQL query/mutation string from introspection field data.\n *\n * @param operationType - 'query' or 'mutation'\n * @param field - The root field from the Query/Mutation type\n * @param typeMap - Map of type names to their introspection definitions\n * @param maxDepth - Maximum depth for nested field selection (default: 2)\n * @returns A complete GraphQL query string\n */\nexport function buildQueryString(\n operationType: 'query' | 'mutation',\n field: IntrospectionField,\n typeMap: Map<string, IntrospectionType>,\n maxDepth: number = DEFAULT_MAX_DEPTH,\n): string {\n const varDefs = buildVariableDefinitions(field.args)\n const fieldArgs = buildFieldArguments(field.args)\n const selection = buildSelectionSet(field.type, typeMap, maxDepth, new Set())\n\n const varPart = varDefs ? `(${varDefs})` : ''\n const argPart = fieldArgs ? `(${fieldArgs})` : ''\n const selPart = selection ? ` ${selection}` : ''\n\n return `${operationType} ${field.name}${varPart} { ${field.name}${argPart}${selPart} }`\n}\n\nfunction buildVariableDefinitions(args: IntrospectionInputValue[]): string {\n if (args.length === 0) return ''\n return args.map(a => `$${a.name}: ${formatTypeRef(a.type)}`).join(', ')\n}\n\nfunction buildFieldArguments(args: IntrospectionInputValue[]): string {\n if (args.length === 0) return ''\n return args.map(a => `${a.name}: $${a.name}`).join(', ')\n}\n\nfunction buildSelectionSet(\n typeRef: IntrospectionTypeRef,\n typeMap: Map<string, IntrospectionType>,\n depth: number,\n visited: Set<string>,\n): string {\n const base = unwrapType(typeRef)\n if (!base.name) return ''\n\n const type = typeMap.get(base.name)\n if (!type || !type.fields) return ''\n\n if (base.kind === TypeKind.UNION || base.kind === TypeKind.INTERFACE) {\n return buildUnionSelection(type, typeMap, depth, visited)\n }\n\n if (base.kind !== TypeKind.OBJECT) return ''\n\n // Prevent circular references\n if (visited.has(base.name)) return ''\n visited.add(base.name)\n\n const fields: string[] = []\n for (const f of type.fields) {\n const fieldBase = unwrapType(f.type)\n if (fieldBase.kind === TypeKind.SCALAR || fieldBase.kind === TypeKind.ENUM) {\n fields.push(f.name)\n } else if (depth > 0 && (fieldBase.kind === TypeKind.OBJECT || fieldBase.kind === TypeKind.UNION || fieldBase.kind === TypeKind.INTERFACE)) {\n const nested = buildSelectionSet(f.type, typeMap, depth - 1, new Set(visited))\n if (nested) {\n fields.push(`${f.name} ${nested}`)\n }\n }\n }\n\n visited.delete(base.name)\n\n if (fields.length === 0) return ''\n return `{ ${fields.join(' ')} }`\n}\n\nfunction buildUnionSelection(\n type: IntrospectionType,\n typeMap: Map<string, IntrospectionType>,\n depth: number,\n visited: Set<string>,\n): string {\n // For unions/interfaces, we need the possibleTypes — but introspection query\n // doesn't include them by default. Fall back to __typename only.\n // A more complete introspection query could include possibleTypes.\n return '{ __typename }'\n}\n","/**\n * GraphQL adapter — parses introspection schemas into ParsedAPI.\n * Accepts a live endpoint URL (runs introspection) or an introspection JSON object.\n */\n\nimport type { ParsedAPI, Operation, RequestBody, RequestBodyProperty } from '../../core/types'\nimport { HttpMethod, ContentType, SpecFormat } from '../../core/types'\nimport { ApiInvokeError, ErrorKind } from '../../core/errors'\nimport { INTROSPECTION_QUERY, TypeKind } from './introspection'\nimport type { IntrospectionSchema, IntrospectionType, IntrospectionField, IntrospectionInputValue, IntrospectionTypeRef } from './introspection'\nimport { buildQueryString, unwrapType, isNonNull, formatTypeRef } from './query-builder'\n\n/** Options for parsing a GraphQL schema. */\nexport interface GraphQLParseOptions {\n /** GraphQL endpoint URL. Strongly recommended when input is introspection JSON — without it, baseUrl defaults to '/graphql' (a relative path). Inferred automatically when input is a URL string. */\n endpoint?: string\n /** Custom fetch implementation for introspection queries. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** Maximum depth for auto-generated query selection sets. Default: 2. */\n maxDepth?: number\n}\n\n/**\n * Parse a GraphQL schema into a ParsedAPI.\n *\n * @param input - Either an endpoint URL (string starting with http) or an introspection result object.\n * URL: runs introspection query against the endpoint.\n * Object: expects `{ data: { __schema: ... } }` or `{ __schema: ... }` shape.\n * @param options - Configuration options.\n * @returns A ParsedAPI with one operation per query/mutation/subscription field.\n */\nexport async function parseGraphQLSchema(\n input: string | object,\n options?: GraphQLParseOptions,\n): Promise<ParsedAPI> {\n const maxDepth = options?.maxDepth ?? 2\n\n let schema: IntrospectionSchema\n let endpoint: string\n\n if (typeof input === 'string') {\n if (!input.startsWith('http')) {\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: 'GraphQL input must be an endpoint URL (starting with http) or an introspection JSON object. SDL parsing is not yet supported.',\n suggestion: 'Pass a URL like \"https://api.example.com/graphql\" or an introspection result object.',\n retryable: false,\n })\n }\n endpoint = options?.endpoint ?? input\n schema = await fetchIntrospection(input, options?.fetch)\n } else {\n schema = extractSchema(input)\n endpoint = options?.endpoint ?? '/graphql'\n }\n\n const path = extractPath(endpoint)\n const typeMap = buildTypeMap(schema.types)\n const operations: Operation[] = []\n\n // Parse query fields\n if (schema.queryType?.name) {\n const queryType = typeMap.get(schema.queryType.name)\n if (queryType?.fields) {\n for (const field of queryType.fields) {\n operations.push(buildOperation(field, 'query', path, typeMap, maxDepth))\n }\n }\n }\n\n // Parse mutation fields\n if (schema.mutationType?.name) {\n const mutationType = typeMap.get(schema.mutationType.name)\n if (mutationType?.fields) {\n for (const field of mutationType.fields) {\n operations.push(buildOperation(field, 'mutation', path, typeMap, maxDepth))\n }\n }\n }\n\n // Parse subscription fields — tagged for discovery but not executable via HTTP (subscriptions require WebSocket). No buildBody hook is set.\n if (schema.subscriptionType?.name) {\n const subType = typeMap.get(schema.subscriptionType.name)\n if (subType?.fields) {\n for (const field of subType.fields) {\n operations.push(buildOperation(field, 'subscription', path, typeMap, maxDepth))\n }\n }\n }\n\n const title = extractTitle(endpoint, schema)\n\n return {\n title,\n version: '1.0.0',\n baseUrl: extractBaseUrl(endpoint),\n operations,\n authSchemes: [],\n specFormat: SpecFormat.GRAPHQL,\n }\n}\n\n/** Run an introspection query against a live GraphQL endpoint. */\nasync function fetchIntrospection(\n url: string,\n fetchFn?: typeof globalThis.fetch,\n): Promise<IntrospectionSchema> {\n const doFetch = fetchFn ?? globalThis.fetch\n let response: Response\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: INTROSPECTION_QUERY }),\n })\n } catch (err) {\n throw new ApiInvokeError({\n kind: ErrorKind.NETWORK,\n message: `Failed to fetch GraphQL introspection from ${url}: ${err instanceof Error ? err.message : String(err)}`,\n suggestion: 'Check the endpoint URL and your network connection.',\n retryable: true,\n })\n }\n\n if (!response.ok) {\n throw new ApiInvokeError({\n kind: ErrorKind.HTTP,\n message: `GraphQL introspection failed with HTTP ${response.status} from ${url}.`,\n suggestion: 'Verify the endpoint supports introspection and is accessible.',\n retryable: response.status >= 500,\n status: response.status,\n })\n }\n\n let json: Record<string, unknown>\n const cloned = response.clone()\n try {\n json = await response.json() as Record<string, unknown>\n } catch (err) {\n let body: string | undefined\n try { body = (await cloned.text()).slice(0, 200) } catch { /* ignore */ }\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `GraphQL introspection response from ${url} is not valid JSON${err instanceof Error ? `: ${err.message}` : ''}.`,\n suggestion: `The endpoint returned a non-JSON response${body ? ` (starts with: \"${body}\")` : ''}. Verify it is a GraphQL endpoint.`,\n retryable: false,\n })\n }\n return extractSchema(json)\n}\n\n/** Extract __schema from an introspection result object. */\nfunction extractSchema(obj: object): IntrospectionSchema {\n const record = obj as Record<string, unknown>\n\n // Shape: { __schema: ... }\n if (record.__schema && typeof record.__schema === 'object') {\n return record.__schema as IntrospectionSchema\n }\n\n // Shape: { data: { __schema: ... } }\n if (record.data && typeof record.data === 'object') {\n const data = record.data as Record<string, unknown>\n if (data.__schema && typeof data.__schema === 'object') {\n return data.__schema as IntrospectionSchema\n }\n }\n\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: 'Invalid GraphQL introspection result: expected { __schema: ... } or { data: { __schema: ... } }.',\n suggestion: 'Pass a valid introspection result object or a URL to a GraphQL endpoint.',\n retryable: false,\n })\n}\n\n/** Build a type lookup map from introspection types. */\nfunction buildTypeMap(types: IntrospectionType[]): Map<string, IntrospectionType> {\n const map = new Map<string, IntrospectionType>()\n for (const type of types) {\n map.set(type.name, type)\n }\n return map\n}\n\n/** Extract URL path from an endpoint URL. */\nfunction extractPath(endpoint: string): string {\n try {\n return new URL(endpoint).pathname\n } catch {\n return '/graphql'\n }\n}\n\n/** Extract base URL (origin) from an endpoint URL. */\nfunction extractBaseUrl(endpoint: string): string {\n try {\n const url = new URL(endpoint)\n return url.origin\n } catch {\n return ''\n }\n}\n\n/** Generate a title from the endpoint URL or schema info. */\nfunction extractTitle(endpoint: string, _schema: IntrospectionSchema): string {\n try {\n const url = new URL(endpoint)\n return `GraphQL API (${url.hostname})`\n } catch {\n return 'GraphQL API'\n }\n}\n\n/** Build an Operation from an introspection field. */\nfunction buildOperation(\n field: IntrospectionField,\n operationType: 'query' | 'mutation' | 'subscription',\n path: string,\n typeMap: Map<string, IntrospectionType>,\n maxDepth: number,\n): Operation {\n const id = operationType === 'mutation' ? `mutation_${field.name}`\n : operationType === 'subscription' ? `subscription_${field.name}`\n : field.name\n const tags = [operationType]\n\n const queryString = operationType !== 'subscription'\n ? buildQueryString(operationType as 'query' | 'mutation', field, typeMap, maxDepth)\n : undefined\n\n const requestBody = buildRequestBody(field.args, typeMap)\n const responseSchema = buildResponseSchema(field.type, typeMap)\n\n const operation: Operation = {\n id,\n path,\n method: HttpMethod.POST,\n summary: field.description ?? `GraphQL ${operationType}: ${field.name}`,\n parameters: [],\n requestBody,\n responseSchema,\n tags,\n }\n\n if (queryString) {\n const argNames = new Set(field.args.map(a => a.name))\n operation.buildBody = (args: Record<string, unknown>) => {\n const variables: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(args)) {\n if (argNames.has(k)) variables[k] = v\n }\n return { query: queryString, variables }\n }\n }\n\n return operation\n}\n\n/** Build a RequestBody from GraphQL field arguments. */\nfunction buildRequestBody(\n args: IntrospectionInputValue[],\n typeMap: Map<string, IntrospectionType>,\n): RequestBody | undefined {\n if (args.length === 0) return undefined\n\n const properties: Record<string, RequestBodyProperty> = {}\n const required: string[] = []\n\n for (const arg of args) {\n properties[arg.name] = mapInputValueToProperty(arg, typeMap)\n if (isNonNull(arg.type)) {\n required.push(arg.name)\n }\n }\n\n return {\n required: required.length > 0,\n contentType: ContentType.JSON,\n schema: {\n type: 'object',\n raw: { type: 'object', properties },\n properties,\n required: required.length > 0 ? required : undefined,\n },\n }\n}\n\n/** Map a GraphQL input value to a RequestBodyProperty. */\nfunction mapInputValueToProperty(\n input: IntrospectionInputValue,\n typeMap: Map<string, IntrospectionType>,\n): RequestBodyProperty {\n const base = unwrapType(input.type)\n const description = input.description\n ? `${input.description} (${formatTypeRef(input.type)})`\n : formatTypeRef(input.type)\n\n // Check if the type ref has a LIST wrapper in its chain\n const isList = isListType(input.type)\n\n if (base.kind === TypeKind.SCALAR) {\n const mapped = mapScalarType(base.name ?? 'String')\n const prop: RequestBodyProperty = {\n type: isList ? 'array' : mapped.type,\n description,\n }\n if (mapped.format) prop.format = mapped.format\n if (input.defaultValue != null) prop.default = input.defaultValue\n return prop\n }\n\n if (base.kind === TypeKind.ENUM) {\n const enumType = typeMap.get(base.name ?? '')\n const enumValues = enumType?.enumValues?.map(e => e.name)\n return {\n type: isList ? 'array' : 'string',\n description,\n enum: enumValues,\n }\n }\n\n if (base.kind === TypeKind.INPUT_OBJECT) {\n return {\n type: isList ? 'array' : 'object',\n description,\n nested: true,\n }\n }\n\n // Fallback for unknown types\n return { type: 'string', description }\n}\n\n/** Check if a type ref contains a LIST wrapper. */\nfunction isListType(ref: IntrospectionTypeRef): boolean {\n let current: IntrospectionTypeRef | null | undefined = ref\n while (current) {\n if (current.kind === TypeKind.LIST) return true\n current = current.ofType\n }\n return false\n}\n\n/** Map a GraphQL scalar type name to a JSON Schema type. */\nfunction mapScalarType(name: string): { type: string; format?: string } {\n switch (name) {\n case 'String':\n case 'ID':\n return { type: 'string' }\n case 'Int':\n return { type: 'integer' }\n case 'Float':\n return { type: 'number' }\n case 'Boolean':\n return { type: 'boolean' }\n default:\n // Custom scalars (DateTime, JSON, etc.) → string\n return { type: 'string', format: name.toLowerCase() }\n }\n}\n\n/** Build a response schema from the field's return type. */\nfunction buildResponseSchema(\n typeRef: IntrospectionTypeRef,\n typeMap: Map<string, IntrospectionType>,\n): unknown {\n const base = unwrapType(typeRef)\n if (!base.name) return undefined\n\n if (base.kind === TypeKind.SCALAR) {\n const mapped = mapScalarType(base.name)\n return { type: mapped.type, format: mapped.format }\n }\n\n if (base.kind === TypeKind.ENUM) {\n const enumType = typeMap.get(base.name)\n return { type: 'string', enum: enumType?.enumValues?.map(e => e.name) }\n }\n\n if (base.kind === TypeKind.OBJECT) {\n const objType = typeMap.get(base.name)\n if (!objType?.fields) return { type: 'object' }\n\n const properties: Record<string, unknown> = {}\n for (const f of objType.fields) {\n const fieldBase = unwrapType(f.type)\n if (fieldBase.kind === TypeKind.SCALAR) {\n properties[f.name] = mapScalarType(fieldBase.name ?? 'String')\n } else if (fieldBase.kind === TypeKind.ENUM) {\n properties[f.name] = { type: 'string' }\n } else {\n properties[f.name] = { type: 'object' }\n }\n }\n return { type: 'object', properties }\n }\n\n return { type: 'object' }\n}\n","/**\n * HTTP request execution with body serialization (JSON, form-urlencoded, multipart) and error classification.\n * Pluggable: uses global fetch by default, can be overridden.\n */\n\nimport type { Auth, BuiltRequest, ExecutionResult, Middleware, Operation, SSEEvent, StreamingExecutionResult } from './types'\nimport { ContentType, HeaderName, HttpMethod } from './types'\nimport { parseSSE } from './sse'\nimport { buildUrl, extractHeaderParams, extractCookieParams } from './url-builder'\nimport { injectAuth } from './auth'\nimport {\n API_INVOKE_ERROR_NAME,\n ErrorKind,\n authError,\n corsError,\n httpError,\n networkError,\n parseError,\n timeoutError,\n} from './errors'\n\nconst ABORT_ERROR_NAME = 'AbortError'\nconst OPAQUE_RESPONSE_TYPE = 'opaque'\nconst NO_CORS_MODE = 'no-cors'\nconst JSON_SUFFIX = '+json'\nconst XML_SUBTYPE = '/xml'\nconst XML_SUFFIX = '+xml'\n\n/**\n * Options for {@link buildRequest} — only request-construction concerns, no runtime/execution options.\n */\nexport interface BuildRequestOptions {\n /** Authentication credentials to inject into the request. */\n auth?: Auth | Auth[]\n /** Override the Accept header. Defaults to `operation.responseContentType` or `'application/json'`. */\n accept?: string\n}\n\n/**\n * Options for {@link executeOperation} and {@link executeOperationStream}.\n * Extends {@link BuildRequestOptions} with runtime and execution concerns.\n */\nexport interface ExecuteOptions extends BuildRequestOptions {\n /** Middleware pipeline applied to the request/response. */\n middleware?: Middleware[]\n /** Custom fetch implementation. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** If false, return ExecutionResult for all HTTP errors instead of throwing. Client-side errors (CORS, network, timeout) always throw regardless. Default: true. */\n throwOnHttpError?: boolean\n /** Timeout in milliseconds. 0 = no timeout (default). */\n timeoutMs?: number\n /** AbortSignal to cancel the request. */\n signal?: AbortSignal\n /** Redirect behavior passed to fetch. Unset by default (fetch implementations typically default to 'follow'). */\n redirect?: RequestInit['redirect']\n /** Extra headers to merge into the request. Applied after buildRequest, so they override spec-derived headers. */\n headers?: Record<string, string>\n}\n\nexport type { BuiltRequest }\n\n/**\n * Build a request without executing it (dry-run / preview).\n * Validates parameters, assembles the body, and injects auth — but does not send.\n *\n * @param baseUrl - Base URL for the API (e.g. 'https://api.example.com/v1')\n * @param operation - The operation to build a request for\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Auth and accept header overrides\n * @returns A fully constructed request ready to inspect or send manually\n * @throws {Error} If required parameters are missing\n * @throws {TypeError} If the URL is malformed when using query-based API key auth\n */\nexport function buildRequest(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: BuildRequestOptions = {},\n): BuiltRequest {\n // Validate required parameters\n const missing = operation.parameters\n .filter(p => p.required && args[p.name] === undefined)\n .map(p => p.name)\n if (missing.length > 0) {\n throw new Error(\n `Missing required parameter${missing.length > 1 ? 's' : ''}: ${missing.join(', ')} for operation \"${operation.id}\"`\n )\n }\n\n // Build URL and headers\n let url = buildUrl(baseUrl, operation, args)\n const method = operation.method.toUpperCase()\n\n const accept = options.accept || operation.responseContentType || ContentType.JSON\n const headers: Record<string, string> = {\n [HeaderName.ACCEPT]: accept,\n ...extractHeaderParams(operation.parameters, args),\n }\n\n // Inject cookie parameters as Cookie header\n const cookieHeader = extractCookieParams(operation.parameters, args)\n if (cookieHeader) {\n headers[HeaderName.COOKIE] = cookieHeader\n }\n\n // Assemble body: explicit 'body' arg > buildBody hook (protocol adapters) > flat-arg assembly\n let bodyData = args['body']\n const allowsBody = method !== HttpMethod.GET && method !== HttpMethod.HEAD && method !== HttpMethod.OPTIONS\n if (!bodyData && operation.buildBody && allowsBody) {\n bodyData = operation.buildBody(args)\n } else if (!bodyData && operation.requestBody && allowsBody) {\n const bodyProps = operation.requestBody.schema.properties\n if (bodyProps) {\n const assembled: Record<string, unknown> = {}\n for (const propName of Object.keys(bodyProps)) {\n if (args[propName] !== undefined) {\n assembled[propName] = args[propName]\n }\n }\n if (Object.keys(assembled).length > 0) {\n bodyData = assembled\n }\n }\n }\n\n // Serialize body based on content type\n let body: string | FormData | undefined\n if (bodyData && allowsBody) {\n const contentType = operation.requestBody?.contentType ?? ContentType.JSON\n\n if (contentType === ContentType.FORM_URLENCODED) {\n const params = new URLSearchParams()\n const obj = typeof bodyData === 'object' && bodyData !== null ? bodyData as Record<string, unknown> : {}\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value))\n }\n }\n body = params.toString()\n headers[HeaderName.CONTENT_TYPE] = ContentType.FORM_URLENCODED\n } else if (contentType === ContentType.MULTIPART) {\n if (typeof bodyData !== 'object' || bodyData === null) {\n throw new Error(\n `Multipart/form-data body for operation \"${operation.id}\" must be an object, got ${typeof bodyData}`\n )\n }\n const formData = new FormData()\n const obj = bodyData as Record<string, unknown>\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) continue\n if (value instanceof Blob) {\n const filename = value instanceof File ? value.name : key\n formData.append(key, value, filename)\n } else if (value instanceof ArrayBuffer) {\n formData.append(key, new Blob([value]), key)\n } else if (ArrayBuffer.isView(value)) {\n formData.append(key, new Blob([new Uint8Array(value.buffer as ArrayBuffer, value.byteOffset, value.byteLength)]), key)\n } else {\n formData.append(key, String(value))\n }\n }\n body = formData\n // Do NOT set Content-Type — fetch auto-sets it with the multipart boundary\n } else {\n body = typeof bodyData === 'string' ? bodyData : JSON.stringify(bodyData)\n headers[HeaderName.CONTENT_TYPE] = ContentType.JSON\n }\n }\n\n // Inject auth\n if (options.auth) {\n const authed = injectAuth(url, headers, options.auth)\n url = authed.url\n Object.assign(headers, authed.headers)\n }\n\n return { method, url, headers, body }\n}\n\n/**\n * Shared fetch pipeline: buildRequest → extra headers → abort signal → request middleware → fetch → response middleware.\n * Used by both executeOperation() and executeOperationStream().\n */\nasync function executeFetch(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions,\n): Promise<{ response: Response; request: BuiltRequest; headers: Record<string, string>; elapsedMs: number }> {\n const fetchFn = options.fetch ?? globalThis.fetch\n\n let { method, url, headers, body } = buildRequest(baseUrl, operation, args, {\n auth: options.auth,\n accept: options.accept,\n })\n\n // Merge extra headers (overrides spec-derived headers)\n if (options.headers) {\n Object.assign(headers, options.headers)\n }\n\n // Build abort signal (timeout + caller signal)\n let signal: AbortSignal | undefined = options.signal\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n let abortHandler: (() => void) | undefined\n\n if (options.timeoutMs && options.timeoutMs > 0) {\n const controller = new AbortController()\n timeoutId = setTimeout(() => controller.abort(), options.timeoutMs)\n\n if (options.signal) {\n // Combine caller signal with timeout signal\n abortHandler = () => controller.abort()\n options.signal.addEventListener('abort', abortHandler, { once: true })\n }\n signal = controller.signal\n }\n\n let init: RequestInit = { method, headers, body, signal, redirect: options.redirect }\n\n // Apply request middleware\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onRequest) {\n const result = await mw.onRequest(url, init)\n url = result.url\n init = result.init\n }\n }\n }\n\n // Execute\n const start = performance.now()\n let response: Response\n\n try {\n response = await fetchFn(url, init)\n } catch (error) {\n if (timeoutId) clearTimeout(timeoutId)\n if (abortHandler && options.signal) options.signal.removeEventListener('abort', abortHandler)\n\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onError) {\n const normalized = error instanceof Error ? error : new Error(String(error))\n try { mw.onError(normalized) } catch (mwError) {\n console.warn(`[api-invoke] middleware \"${mw.name ?? 'unnamed'}\" onError handler threw (suppressed):`, mwError)\n }\n }\n }\n }\n\n // Abort errors (timeout or caller cancellation)\n if (error instanceof DOMException && error.name === ABORT_ERROR_NAME) {\n if (options.timeoutMs && options.timeoutMs > 0) {\n throw timeoutError(url)\n }\n throw error // Caller-initiated abort — re-throw as-is\n }\n\n if (error instanceof TypeError) {\n // TypeError: Failed to fetch — CORS or network issue\n // Heuristic: try no-cors to distinguish (browser-only, skip in Node.js)\n if (typeof window !== 'undefined') {\n try {\n const probe = await fetchFn(url, { mode: NO_CORS_MODE })\n if (probe.type === OPAQUE_RESPONSE_TYPE) throw corsError(url)\n } catch (probeError) {\n // Re-throw if the probe identified a CORS error; swallow other probe failures\n if (probeError instanceof Error && probeError.name === API_INVOKE_ERROR_NAME) throw probeError\n }\n }\n throw networkError(url)\n }\n throw networkError(url)\n }\n\n if (timeoutId) clearTimeout(timeoutId)\n if (abortHandler && options.signal) options.signal.removeEventListener('abort', abortHandler)\n const elapsedMs = Math.round(performance.now() - start)\n\n // Apply response middleware\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onResponse) {\n response = await mw.onResponse(response)\n }\n }\n }\n\n // Collect response headers\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n\n return { response, request: { method, url, headers, body }, headers: responseHeaders, elapsedMs }\n}\n\n/**\n * Execute an API call for an operation with arguments.\n * Builds the URL, injects auth, applies middleware, and classifies errors.\n *\n * @param baseUrl - Base URL for the API\n * @param operation - The operation to execute\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Execution options (auth, middleware, fetch, timeout, error behavior)\n * @returns The execution result with parsed response data\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and (by default) HTTP errors\n */\nexport async function executeOperation(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions = {},\n): Promise<ExecutionResult> {\n const { response, request, headers: responseHeaders, elapsedMs } = await executeFetch(baseUrl, operation, args, options)\n const { method, url, headers, body } = request\n\n // Parse response body based on content type\n // Handles JSON (including +json variants like application/vnd.api+json), binary, XML, and unknown types (JSON attempted, falling back to text)\n let data: unknown\n const contentType = response.headers.get(HeaderName.CONTENT_TYPE) || ''\n if (contentType.includes(ContentType.JSON) || contentType.includes(JSON_SUFFIX)) {\n const cloned = response.clone()\n try {\n data = await response.json()\n } catch (jsonError) {\n if (options.throwOnHttpError !== false) throw parseError(url)\n console.warn('[api-invoke] JSON parse failed, falling back to text:', jsonError)\n try {\n data = await cloned.text()\n } catch {\n // Body unreadable is a client-side failure — throw even in non-throwing mode\n throw parseError(url)\n }\n }\n } else if (isBinaryContentType(contentType)) {\n try {\n data = await response.arrayBuffer()\n } catch {\n throw parseError(url, 'binary')\n }\n } else if (contentType.includes(XML_SUBTYPE) || contentType.includes(XML_SUFFIX)) {\n try {\n data = await response.text()\n } catch {\n throw parseError(url, 'XML')\n }\n } else {\n let text: string\n try {\n text = await response.text()\n } catch {\n throw parseError(url, 'text')\n }\n // Try JSON parsing for responses without proper content-type\n try {\n data = JSON.parse(text)\n } catch {\n data = text\n }\n }\n\n const result: ExecutionResult = {\n status: response.status,\n data,\n contentType,\n headers: responseHeaders,\n request: { method, url, headers, body },\n elapsedMs,\n }\n\n // Check for HTTP errors\n if (options.throwOnHttpError !== false) {\n if (response.status === 401 || response.status === 403) {\n throw authError(url, response.status as 401 | 403, data)\n }\n if (!response.ok) {\n throw httpError(url, response.status, response.statusText, data)\n }\n } else if (!response.ok) {\n // Non-throwing mode: classify the error for programmatic handling\n if (response.status === 401 || response.status === 403) {\n result.errorKind = ErrorKind.AUTH\n } else if (response.status === 429) {\n result.errorKind = ErrorKind.RATE_LIMIT\n } else {\n result.errorKind = ErrorKind.HTTP\n }\n }\n\n return result\n}\n\n/**\n * Execute a raw HTTP request without an API spec (Tier 3: zero spec).\n * Still provides error classification, response parsing, and timing.\n *\n * @param url - Full URL to request\n * @param options - Request options (method, headers, body, auth, middleware)\n * @returns The execution result with parsed response data\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and (by default) HTTP errors\n */\nexport async function executeRaw(\n url: string,\n options: {\n method?: string\n headers?: Record<string, string>\n body?: string\n auth?: Auth | Auth[]\n middleware?: Middleware[]\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n signal?: AbortSignal\n accept?: string\n redirect?: RequestInit['redirect']\n } = {},\n): Promise<ExecutionResult> {\n // Create a synthetic operation for the raw request\n const operation: Operation = {\n id: 'raw',\n path: '',\n method: options.method ?? HttpMethod.GET,\n parameters: [],\n tags: [],\n }\n\n return executeOperation(url, operation, { body: options.body }, {\n auth: options.auth,\n middleware: options.middleware,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n accept: options.accept,\n redirect: options.redirect,\n headers: options.headers,\n })\n}\n\n/**\n * Execute an API call and return a streaming async iterable of SSE events.\n * Errors always throw (no non-throwing mode for streams).\n *\n * @param baseUrl - Base URL for the API\n * @param operation - The operation to execute\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Execution options, plus optional `onEvent` callback for each SSE event\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and HTTP errors\n */\nexport async function executeOperationStream(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions & { onEvent?: (event: SSEEvent) => void } = {},\n): Promise<StreamingExecutionResult> {\n // Default Accept to SSE when not explicitly set\n const streamOptions: ExecuteOptions = {\n ...options,\n accept: options.accept ?? operation.responseContentType ?? ContentType.SSE,\n }\n\n const { response, request, headers: responseHeaders, elapsedMs } = await executeFetch(baseUrl, operation, args, streamOptions)\n\n // Always throw on HTTP errors for streams\n if (!response.ok) {\n let body: unknown\n try {\n const text = await response.text()\n try { body = JSON.parse(text) } catch { body = text }\n } catch (readError) {\n body = `[api-invoke: failed to read error response body: ${readError instanceof Error ? readError.message : String(readError)}]`\n }\n if (response.status === 401 || response.status === 403) {\n throw authError(request.url, response.status as 401 | 403, body)\n }\n throw httpError(request.url, response.status, response.statusText, body)\n }\n\n if (!response.body) {\n throw parseError(request.url, 'SSE (response body is null)')\n }\n\n const contentType = response.headers.get(HeaderName.CONTENT_TYPE) || ''\n\n // Warn if the response is not SSE — the server may have ignored the Accept header\n if (contentType && !contentType.includes('text/event-stream')) {\n console.warn(`[api-invoke] Expected content-type text/event-stream but got \"${contentType}\" — SSE parsing may produce unexpected results`)\n }\n\n // Wrap SSE parser with optional onEvent callback\n let stream: AsyncIterable<SSEEvent> = parseSSE(response.body)\n if (options.onEvent) {\n const inner = stream\n const onEvent = options.onEvent\n stream = (async function* () {\n for await (const event of inner) {\n try {\n onEvent(event)\n } catch (callbackError) {\n throw new Error(\n `onEvent callback threw for event \"${event.event ?? 'message'}\": ${callbackError instanceof Error ? callbackError.message : String(callbackError)}`,\n { cause: callbackError },\n )\n }\n yield event\n }\n })()\n }\n\n return {\n status: response.status,\n stream,\n contentType,\n headers: responseHeaders,\n request,\n elapsedMs,\n }\n}\n\n/**\n * Execute a raw streaming HTTP request without an API spec (Tier 3: zero spec).\n * Returns an async iterable of SSE events.\n *\n * @param url - Full URL to request\n * @param options - Request options (method, headers, body, auth, middleware, onEvent callback)\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and HTTP errors\n */\nexport async function executeRawStream(\n url: string,\n options: {\n method?: string\n headers?: Record<string, string>\n body?: string\n auth?: Auth | Auth[]\n middleware?: Middleware[]\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n signal?: AbortSignal\n accept?: string\n redirect?: RequestInit['redirect']\n onEvent?: (event: SSEEvent) => void\n } = {},\n): Promise<StreamingExecutionResult> {\n const operation: Operation = {\n id: 'raw-stream',\n path: '',\n method: options.method ?? HttpMethod.POST,\n parameters: [],\n tags: [],\n }\n\n return executeOperationStream(url, operation, { body: options.body }, {\n auth: options.auth,\n middleware: options.middleware,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n accept: options.accept,\n redirect: options.redirect,\n headers: options.headers,\n onEvent: options.onEvent,\n })\n}\n\nconst BINARY_CONTENT_PATTERNS = [\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n 'audio/',\n 'image/',\n 'video/',\n]\n\nfunction isBinaryContentType(contentType: string): boolean {\n return BINARY_CONTENT_PATTERNS.some(p => contentType.includes(p))\n}\n","import type { SSEEvent } from './types'\n\n/**\n * Parse a Server-Sent Events stream into an async iterable of events.\n * Implements the WHATWG SSE parsing algorithm.\n *\n * @param body - ReadableStream from a fetch response (e.g. `response.body`)\n * @returns Async generator yielding parsed {@link SSEEvent} objects\n * @throws {Error} If the stream contains invalid UTF-8 data\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncGenerator<SSEEvent> {\n const reader = body.getReader()\n const decoder = new TextDecoder('utf-8', { fatal: true })\n let buffer = ''\n\n // Event accumulator\n let eventType: string | undefined\n let dataLines: string[] = []\n let id: string | undefined\n let retry: number | undefined\n let hasData = false\n\n function buildEvent(): SSEEvent {\n const event: SSEEvent = { data: dataLines.join('\\n') }\n if (eventType !== undefined) event.event = eventType\n if (id !== undefined) event.id = id\n if (retry !== undefined) event.retry = retry\n return event\n }\n\n function resetAccumulator(): void {\n eventType = undefined\n dataLines = []\n id = undefined\n retry = undefined\n hasData = false\n }\n\n function processLine(line: string): SSEEvent | undefined {\n // Empty line: dispatch event\n if (line === '') {\n if (hasData) {\n const event = buildEvent()\n resetAccumulator()\n return event\n }\n resetAccumulator()\n return undefined\n }\n\n // Comment\n if (line[0] === ':') return undefined\n\n // Parse field\n const colonIdx = line.indexOf(':')\n let field: string\n let value: string\n\n if (colonIdx === -1) {\n field = line\n value = ''\n } else {\n field = line.slice(0, colonIdx)\n // Strip one leading space after colon per spec\n value = line[colonIdx + 1] === ' ' ? line.slice(colonIdx + 2) : line.slice(colonIdx + 1)\n }\n\n switch (field) {\n case 'data':\n dataLines.push(value)\n hasData = true\n break\n case 'event':\n eventType = value\n break\n case 'id':\n // Per WHATWG spec, ignore id fields containing U+0000 NULL\n if (!value.includes('\\0')) id = value\n break\n case 'retry': {\n // Per WHATWG spec, retry must consist of only ASCII digits (non-negative integer)\n const n = parseInt(value, 10)\n if (!isNaN(n) && n >= 0 && String(n) === value) retry = n\n break\n }\n // Unknown fields are ignored per spec\n }\n\n return undefined\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n try {\n buffer += decoder.decode(value, { stream: true })\n } catch (decodeError) {\n throw new Error('SSE stream contains invalid UTF-8 data', { cause: decodeError })\n }\n\n // Split on \\r\\n, \\r, or \\n — handle all line endings\n // Process complete lines, keep incomplete last segment in buffer\n // If buffer ends with \\r, keep it — next chunk may start with \\n (CRLF)\n let startIdx = 0\n const limit = buffer.length - (buffer[buffer.length - 1] === '\\r' ? 1 : 0)\n for (let i = 0; i < limit; i++) {\n if (buffer[i] === '\\r' || buffer[i] === '\\n') {\n const line = buffer.slice(startIdx, i)\n // Skip \\n after \\r (CRLF)\n if (buffer[i] === '\\r' && buffer[i + 1] === '\\n') i++\n startIdx = i + 1\n\n const event = processLine(line)\n if (event) yield event\n }\n }\n buffer = buffer.slice(startIdx)\n }\n\n // Flush remaining buffer\n try {\n buffer += decoder.decode()\n } catch (decodeError) {\n throw new Error('SSE stream contains invalid UTF-8 data', { cause: decodeError })\n }\n if (buffer.length > 0) {\n const event = processLine(buffer)\n if (event) yield event\n }\n // Dispatch any accumulated event at stream end\n if (hasData) yield buildEvent()\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * URL and parameter construction utilities.\n * Handles path parameter interpolation, query params, header params, cookie params, and slash normalization.\n */\n\nimport type { Operation, Parameter } from './types'\nimport { ParamLocation } from './types'\n\n/**\n * Build a full URL from base URL, operation path, and arguments.\n * Handles path parameter interpolation, query parameter serialization, and slash normalization.\n *\n * @param baseUrl - Base URL for the API (e.g. 'https://api.example.com/v1')\n * @param operation - The operation containing path template and parameter definitions\n * @param args - Key-value pairs for path and query parameters\n * @returns Fully resolved URL string with parameters substituted\n */\nexport function buildUrl(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n): string {\n // Interpolate path parameters\n let path = operation.path\n for (const param of operation.parameters) {\n if (param.in === ParamLocation.PATH && args[param.name] !== undefined) {\n path = path.replace(\n `{${param.name}}`,\n encodeURIComponent(String(args[param.name])),\n )\n }\n }\n\n // Join base URL and path, avoiding double slashes\n const fullBase = baseUrl.replace(/\\/$/, '')\n const fullPath = path.startsWith('/') ? path : `/${path}`\n const url = new URL(`${fullBase}${fullPath}`)\n\n // Append query parameters (with defaults, array/object serialization)\n for (const param of operation.parameters) {\n if (param.in === ParamLocation.QUERY) {\n const value = args[param.name] ?? param.schema.default\n if (value !== undefined && value !== null) {\n serializeQueryParam(url, param.name, value)\n }\n }\n }\n\n return url.toString()\n}\n\n/**\n * Derive a base URL from a spec URL by stripping the filename.\n * e.g., `\"https://api.example.com/v1/openapi.json\"` → `\"https://api.example.com/v1\"`\n *\n * @param specUrl - URL pointing to an API spec file\n * @returns Base URL with the filename removed, or empty string if the URL is invalid\n */\nexport function deriveBaseUrl(specUrl: string): string {\n try {\n const u = new URL(specUrl)\n u.pathname = u.pathname.replace(/\\/[^/]*$/, '')\n const base = u.origin + u.pathname\n return base.replace(/\\/$/, '')\n } catch {\n return ''\n }\n}\n\n/**\n * Extract header parameters from operation args.\n *\n * @param parameters - Operation parameter definitions\n * @param args - Key-value pairs of argument values\n * @returns Headers object with only the header-type parameters that have values\n */\nexport function extractHeaderParams(\n parameters: Parameter[],\n args: Record<string, unknown>,\n): Record<string, string> {\n const headers: Record<string, string> = {}\n for (const param of parameters) {\n if (param.in === ParamLocation.HEADER && args[param.name] !== undefined) {\n headers[param.name] = String(args[param.name])\n }\n }\n return headers\n}\n\n/**\n * Extract cookie parameters from operation args as a Cookie header value.\n * Uses schema defaults when the arg is not explicitly supplied.\n *\n * @param parameters - Operation parameter definitions\n * @param args - Key-value pairs of argument values\n * @returns Cookie header string (e.g. 'name=value; other=val'), or undefined if no cookie params are present\n */\nexport function extractCookieParams(\n parameters: Parameter[],\n args: Record<string, unknown>,\n): string | undefined {\n const cookies: string[] = []\n for (const param of parameters) {\n if (param.in === ParamLocation.COOKIE) {\n const value = args[param.name] ?? param.schema.default\n if (value !== undefined && value !== null) {\n cookies.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(String(value))}`)\n }\n }\n }\n return cookies.length > 0 ? cookies.join('; ') : undefined\n}\n\n/**\n * Serialize a query parameter value onto a URL.\n * Arrays use comma-separated format (OpenAPI \"form\" style, explode=false).\n * Objects use comma-separated key,value pairs (OpenAPI \"form\" style, explode=false).\n * DeepObject style (e.g. filter[key]=value) is not yet supported.\n */\nfunction serializeQueryParam(url: URL, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n url.searchParams.set(name, value.map(String).join(','))\n } else if (typeof value === 'object' && value !== null) {\n const pairs = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => {\n if (typeof v === 'object' && v !== null) {\n throw new Error(\n `Cannot serialize nested object for query parameter \"${name}.${k}\". Only flat key-value objects are supported.`\n )\n }\n if (typeof v === 'symbol' || typeof v === 'function') {\n throw new Error(\n `Cannot serialize ${typeof v} value for query parameter \"${name}.${k}\". Use a string or number.`\n )\n }\n return `${k},${String(v)}`\n })\n url.searchParams.set(name, pairs.join(','))\n } else {\n url.searchParams.set(name, String(value))\n }\n}\n","/**\n * Authentication injection into HTTP requests.\n * Supports Bearer, Basic, API Key (header/query), OAuth2, and Cookie.\n */\n\nimport type { Auth } from './types'\nimport { AuthType, HeaderName, ParamLocation } from './types'\nimport { ApiInvokeError, ErrorKind } from './errors'\n\n/**\n * A request with authentication applied (URL may be modified for query-based auth).\n */\nexport interface AuthenticatedRequest {\n /** URL, potentially modified with query-based auth parameters. */\n url: string\n /** Headers with auth credentials injected. */\n headers: Record<string, string>\n}\n\n/**\n * Inject authentication credentials into a request URL and headers.\n * Accepts a single Auth or an array for composing multiple schemes (e.g. API key + bearer).\n *\n * @param url - The request URL\n * @param headers - Existing request headers (shallow-copied internally)\n * @param auth - Credentials to inject (single or array)\n * @returns New URL and headers with auth applied\n */\nexport function injectAuth(\n url: string,\n headers: Record<string, string>,\n auth: Auth | Auth[],\n): AuthenticatedRequest {\n if (Array.isArray(auth)) {\n // Apply auth schemes in order. Later entries override earlier ones for the same header (e.g. Authorization), but cookie auth appends.\n let result: AuthenticatedRequest = { url, headers: { ...headers } }\n for (const a of auth) {\n result = injectAuth(result.url, result.headers, a)\n }\n return result\n }\n\n const result = { url, headers: { ...headers } }\n\n switch (auth.type) {\n case AuthType.BEARER:\n result.headers[HeaderName.AUTHORIZATION] = `Bearer ${auth.token}`\n break\n\n case AuthType.BASIC: {\n // btoa is available in all modern browsers and Node 16+\n const encoded = btoa(`${auth.username}:${auth.password}`)\n result.headers[HeaderName.AUTHORIZATION] = `Basic ${encoded}`\n break\n }\n\n case AuthType.API_KEY:\n if (auth.location === ParamLocation.HEADER) {\n result.headers[auth.name] = auth.value\n } else if (auth.location === ParamLocation.QUERY) {\n const u = new URL(url)\n u.searchParams.set(auth.name, auth.value)\n result.url = u.toString()\n }\n break\n\n case AuthType.OAUTH2:\n result.headers[HeaderName.AUTHORIZATION] = `Bearer ${auth.accessToken}`\n break\n\n case AuthType.COOKIE: {\n const existing = result.headers[HeaderName.COOKIE]\n const cookie = `${encodeURIComponent(auth.name)}=${encodeURIComponent(auth.value)}`\n result.headers[HeaderName.COOKIE] = existing ? `${existing}; ${cookie}` : cookie\n break\n }\n }\n\n return result\n}\n\n/** Result from an OAuth2 token refresh. */\nexport interface OAuth2TokenResult {\n /** The new access token. */\n accessToken: string\n /** A new refresh token, if the server issued one. */\n refreshToken?: string\n /** Token lifetime in seconds, if provided by the server. */\n expiresIn?: number\n}\n\n/**\n * Exchange a refresh token for a new access token at the OAuth2 token endpoint.\n *\n * @param tokenUrl - The OAuth2 token endpoint URL\n * @param refreshToken - The refresh token to exchange\n * @param options - Optional client credentials, scopes, and custom fetch\n * @returns The new token set\n * @throws {ApiInvokeError} With `kind: 'auth'` if the token endpoint returns a non-OK response or the response is missing `access_token`\n * @throws {ApiInvokeError} With `kind: 'parse'` if the response body is not valid JSON\n */\nexport async function refreshOAuth2Token(\n tokenUrl: string,\n refreshToken: string,\n options?: {\n clientId?: string\n clientSecret?: string\n scopes?: string[]\n fetch?: typeof globalThis.fetch\n },\n): Promise<OAuth2TokenResult> {\n const fetchFn = options?.fetch ?? globalThis.fetch\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n if (options?.clientId) body.set('client_id', options.clientId)\n if (options?.clientSecret) body.set('client_secret', options.clientSecret)\n if (options?.scopes?.length) body.set('scope', options.scopes.join(' '))\n\n const response = await fetchFn(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!response.ok) {\n let errorDetail = ''\n try {\n const body = await response.text()\n errorDetail = body ? `: ${body.slice(0, 500)}` : ''\n } catch (bodyReadError) {\n errorDetail = ` (error body unreadable: ${bodyReadError instanceof Error ? bodyReadError.message : String(bodyReadError)})`\n }\n throw new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: `OAuth2 token refresh failed: ${response.status} ${response.statusText}${errorDetail}`,\n suggestion: 'Check the refresh token, client credentials, and token endpoint URL.',\n retryable: response.status >= 500,\n status: response.status,\n })\n }\n\n let data: Record<string, unknown>\n try {\n data = await response.json() as Record<string, unknown>\n } catch (parseError) {\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `OAuth2 token refresh succeeded (${response.status}) but response body is not valid JSON`,\n suggestion: 'The token endpoint returned a non-JSON response. Verify the endpoint URL.',\n retryable: false,\n })\n }\n\n const accessToken = data.access_token\n if (typeof accessToken !== 'string' || !accessToken) {\n throw new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: `OAuth2 token refresh response missing required \"access_token\" field. Got keys: [${Object.keys(data).join(', ')}]`,\n suggestion: 'The token endpoint response did not include a valid access_token. Verify the endpoint and grant type.',\n retryable: false,\n })\n }\n\n return {\n accessToken,\n refreshToken: typeof data.refresh_token === 'string' && data.refresh_token ? data.refresh_token : undefined,\n expiresIn: typeof data.expires_in === 'number' ? data.expires_in : undefined,\n }\n}\n\n/**\n * Mask credential values for safe logging. Shows the auth type and a redacted value.\n *\n * @param auth - The auth credentials to mask\n * @returns A human-readable string with sensitive values replaced by `***`\n */\nexport function maskAuth(auth: Auth): string {\n switch (auth.type) {\n case AuthType.BEARER: {\n if (auth.token.length <= 4) return 'Bearer ***'\n return `Bearer ${auth.token.substring(0, 4)}***`\n }\n case AuthType.BASIC:\n return `Basic ${auth.username}:***`\n case AuthType.API_KEY:\n return `${auth.name}: ***`\n case AuthType.OAUTH2:\n return `OAuth2 ***`\n case AuthType.COOKIE:\n return `Cookie ${auth.name}=***`\n }\n}\n","/**\n * Parse OpenAPI 2.0/3.x specs into the spec-agnostic ParsedAPI format.\n * Extracted and consolidated from api2aux/semantic-analysis.\n */\n\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\nimport type {\n ParsedAPI,\n Operation,\n Parameter,\n ParameterSchema,\n RequestBody,\n RequestBodySchema,\n RequestBodyProperty,\n} from '../../core/types'\nimport { ContentType, ParamLocation, SpecFormat } from '../../core/types'\nimport { extractOpenAPI3BaseUrl, extractSwagger2BaseUrl } from './base-url'\nimport { mapSecuritySchemes } from './security'\nimport { deriveBaseUrl } from '../../core/url-builder'\n\n/** Standard HTTP methods parsed from OpenAPI path items. */\nconst SUPPORTED_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'] as const\n\n/**\n * Normalize an OpenAPI schema type field to a single type string.\n * Handles 3.1 type arrays (e.g. `[\"string\", \"null\"]`) by picking the first non-null entry,\n * passes through plain strings, and falls back to the provided default for missing/unrecognized values.\n *\n * @param type - The type field from an OpenAPI schema (string, array, or undefined)\n * @param fallback - Fallback type when the value is missing or unrecognized (default: 'string')\n * @returns A single type string\n */\nexport function normalizeType(type: unknown, fallback = 'string'): string {\n if (Array.isArray(type)) {\n const nonNull = type.filter((t: string) => t !== 'null')\n return nonNull[0] ?? fallback\n }\n if (typeof type === 'string') return type\n return fallback\n}\n\n/**\n * Parse an OpenAPI 2.0 (Swagger) or 3.x spec into a spec-agnostic {@link ParsedAPI}.\n * Handles dereferencing, operation extraction, auth scheme mapping, and base URL resolution.\n *\n * @param specUrlOrObject - URL string pointing to a spec, or a pre-parsed spec object\n * @param options - Parse options\n * @param options.specUrl - Original spec URL (used for base URL fallback when spec has no servers/host field)\n * @returns A normalized ParsedAPI with all operations, auth schemes, and metadata\n * @throws {Error} If the spec cannot be fetched, parsed, or dereferenced\n */\nexport async function parseOpenAPISpec(\n specUrlOrObject: string | object,\n options?: { specUrl?: string },\n): Promise<ParsedAPI> {\n try {\n let apiRaw: unknown\n try {\n apiRaw = await SwaggerParser.dereference(specUrlOrObject as string)\n } catch {\n // Fallback: parse without resolving $refs (handles specs with broken references)\n apiRaw = await SwaggerParser.parse(specUrlOrObject as string)\n }\n const api = apiRaw as unknown as OpenAPIV3.Document | OpenAPIV2.Document\n\n const isOpenAPI3 = 'openapi' in api\n const specVersion = isOpenAPI3\n ? (api as OpenAPIV3.Document).openapi\n : (api as OpenAPIV2.Document).swagger\n\n const title = api.info.title\n const version = api.info.version\n\n const sourceUrl = options?.specUrl ?? (typeof specUrlOrObject === 'string' ? specUrlOrObject : undefined)\n\n let baseUrl = isOpenAPI3\n ? extractOpenAPI3BaseUrl(api as OpenAPIV3.Document, sourceUrl)\n : extractSwagger2BaseUrl(api as OpenAPIV2.Document)\n\n // Fallback: derive base URL from spec URL when spec doesn't provide one\n if (!baseUrl && sourceUrl) {\n baseUrl = deriveBaseUrl(sourceUrl)\n }\n\n const operations = extractOperations(api, isOpenAPI3)\n\n // Fix path overlap: when the resolved base URL has a path (e.g., /api/1)\n // and operation paths also start with that path (e.g., /api/1/metastore/...),\n // strip the overlapping prefix from operation paths to avoid duplication.\n if (baseUrl) {\n try {\n const basePath = new URL(baseUrl).pathname.replace(/\\/$/, '')\n if (basePath && basePath !== '/') {\n const allOverlap = operations.length > 0 && operations.every(\n op => op.path === basePath || op.path.startsWith(basePath + '/')\n )\n if (allOverlap) {\n for (const op of operations) {\n op.path = op.path.slice(basePath.length) || '/'\n }\n }\n }\n } catch { /* ignore invalid base URL */ }\n }\n\n const authSchemes = extractSecuritySchemes(api, isOpenAPI3)\n\n return {\n title,\n version,\n baseUrl,\n operations,\n authSchemes,\n specFormat: isOpenAPI3 ? SpecFormat.OPENAPI_3 : SpecFormat.OPENAPI_2,\n rawSpecVersion: specVersion,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n const urlInfo = typeof specUrlOrObject === 'string' ? ` from ${specUrlOrObject}` : ''\n throw new Error(`Failed to parse OpenAPI spec${urlInfo}: ${message}`, { cause: error })\n }\n}\n\nfunction extractOperations(\n api: OpenAPIV3.Document | OpenAPIV2.Document,\n isOpenAPI3: boolean,\n): Operation[] {\n const operations: Operation[] = []\n if (!api.paths) return operations\n\n for (const [path, pathItem] of Object.entries(api.paths)) {\n if (!pathItem) continue\n const pathLevelParams = 'parameters' in pathItem ? pathItem.parameters ?? [] : []\n\n for (const method of SUPPORTED_METHODS) {\n if (!(method in pathItem) || !(pathItem as Record<string, unknown>)[method]) continue\n\n const op = (pathItem as Record<string, unknown>)[method] as OpenAPIV3.OperationObject | OpenAPIV2.OperationObject\n const operationParams = op.parameters ?? []\n const allParams = [...pathLevelParams, ...operationParams].filter(\n (p) => (p as { in: string }).in !== 'body', // 'body' is a Swagger 2.0-specific location, not in ParamLocation\n )\n\n const parameters = allParams.map((param) =>\n parseParameter(param as OpenAPIV3.ParameterObject | OpenAPIV2.Parameter, isOpenAPI3),\n )\n\n const requestBody = extractRequestBody(op, isOpenAPI3)\n const { primary: responseSchema, all: responseSchemas } = extractResponseSchemas(op, isOpenAPI3)\n const responseContentType = extractResponseContentType(op, isOpenAPI3)\n const errorHints = extractErrorHints(op)\n\n // Generate a stable ID from operationId or method+path\n const id = op.operationId\n ?? `${method}_${path.replace(/[{}\\/]/g, '_').replace(/^_|_$/g, '').replace(/_+/g, '_')}`\n\n operations.push({\n id,\n path,\n method: method.toUpperCase(),\n summary: op.summary,\n description: op.description,\n parameters,\n requestBody,\n responseSchema,\n responseSchemas: Object.keys(responseSchemas).length > 0 ? responseSchemas : undefined,\n responseContentType,\n errorHints,\n tags: op.tags ?? [],\n })\n }\n }\n\n return operations\n}\n\nfunction parseParameter(\n param: OpenAPIV3.ParameterObject | OpenAPIV2.Parameter,\n isOpenAPI3: boolean,\n): Parameter {\n const name = param.name\n const location = param.in as ParamLocation\n const required = param.required ?? location === ParamLocation.PATH\n const description = param.description ?? ''\n\n let schema: ParameterSchema\n\n if (isOpenAPI3) {\n const p = param as OpenAPIV3.ParameterObject\n const s = p.schema as OpenAPIV3.SchemaObject | undefined\n schema = {\n type: normalizeType(s?.type),\n format: s?.format,\n enum: s?.enum,\n default: s?.default,\n example: p.example ?? s?.example,\n minimum: s?.minimum,\n maximum: s?.maximum,\n maxLength: s?.maxLength,\n // TODO: extract s?.items for array parameters (ParameterSchema.items)\n }\n } else {\n const p = param as OpenAPIV2.GeneralParameterObject\n schema = {\n type: ('type' in p ? p.type : undefined) ?? 'string',\n format: 'format' in p ? p.format : undefined,\n enum: 'enum' in p ? p.enum : undefined,\n default: 'default' in p ? p.default : undefined,\n example: 'x-example' in p ? (p as Record<string, unknown>)['x-example'] : undefined,\n minimum: 'minimum' in p ? p.minimum : undefined,\n maximum: 'maximum' in p ? p.maximum : undefined,\n maxLength: 'maxLength' in p ? p.maxLength : undefined,\n // TODO: extract p.items for array parameters (ParameterSchema.items)\n }\n }\n\n return { name, in: location, required, description, schema }\n}\n\n/** Content types to try, in priority order. */\nconst CONTENT_TYPE_PRIORITY = [\n ContentType.JSON,\n ContentType.FORM_URLENCODED,\n ContentType.MULTIPART,\n ContentType.XML,\n ContentType.TEXT,\n ContentType.OCTET_STREAM,\n] as const\n\nfunction extractRequestBody(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): RequestBody | undefined {\n if (isOpenAPI3) {\n const op = operation as OpenAPIV3.OperationObject\n if (!op.requestBody) return undefined\n const body = op.requestBody as OpenAPIV3.RequestBodyObject\n if (!body.content) return undefined\n\n // Try content types in priority order\n for (const ct of CONTENT_TYPE_PRIORITY) {\n const mediaType = body.content[ct]\n if (mediaType?.schema) {\n return {\n required: body.required ?? false,\n description: body.description,\n contentType: ct,\n schema: flattenSchema(mediaType.schema as OpenAPIV3.SchemaObject),\n }\n }\n }\n\n // Fallback: use the first available content type\n const firstKey = Object.keys(body.content)[0]\n if (firstKey) {\n const mediaType = body.content[firstKey]\n if (mediaType?.schema) {\n return {\n required: body.required ?? false,\n description: body.description,\n contentType: firstKey,\n schema: flattenSchema(mediaType.schema as OpenAPIV3.SchemaObject),\n }\n }\n }\n\n return undefined\n } else {\n const op = operation as OpenAPIV2.OperationObject\n const bodyParam = op.parameters?.find(\n (p: unknown) => (p as { in: string }).in === 'body',\n ) as OpenAPIV2.InBodyParameterObject | undefined\n if (!bodyParam?.schema) return undefined\n\n // Swagger 2.0: check operation-level consumes for content type\n const consumes = op.consumes ?? []\n let contentType: string = ContentType.JSON\n if (consumes.includes(ContentType.FORM_URLENCODED)) {\n contentType = ContentType.FORM_URLENCODED\n } else if (consumes.includes(ContentType.MULTIPART)) {\n contentType = ContentType.MULTIPART\n } else if (consumes.length > 0) {\n contentType = consumes[0]\n }\n\n return {\n required: bodyParam.required ?? false,\n description: bodyParam.description,\n contentType,\n schema: flattenSchema(bodyParam.schema as unknown as OpenAPIV3.SchemaObject),\n }\n }\n}\n\nfunction flattenSchema(schema: OpenAPIV3.SchemaObject): RequestBodySchema {\n const normalizedType = normalizeType(schema.type, 'object')\n const result: RequestBodySchema = {\n type: normalizedType,\n raw: schema,\n }\n\n if (normalizedType === 'object' && schema.properties) {\n result.properties = {}\n result.required = schema.required\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const prop = propSchema as OpenAPIV3.SchemaObject\n const propType = normalizeType(prop.type)\n const isNested = propType === 'object' || propType === 'array'\n result.properties[name] = {\n type: propType,\n format: prop.format,\n description: prop.description,\n enum: prop.enum,\n default: prop.default,\n example: prop.example,\n nested: isNested || undefined,\n } satisfies RequestBodyProperty\n }\n }\n\n return result\n}\n\n/** Status codes to extract response schemas for (success + default). The primary schema is selected from the success codes in this list; 'default' is collected into responseSchemas but never used as primary. */\nconst RESPONSE_STATUS_CODES = ['200', '201', '202', '204', '2XX', 'default'] as const\n\nfunction extractResponseSchemas(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): { primary: unknown; all: Record<string, unknown> } {\n const responses = operation.responses\n if (!responses) return { primary: undefined, all: {} }\n\n const all: Record<string, unknown> = {}\n for (const code of RESPONSE_STATUS_CODES) {\n const resp = responses[code]\n if (!resp) continue\n\n let schema: unknown\n if (isOpenAPI3) {\n schema = (resp as OpenAPIV3.ResponseObject).content?.[ContentType.JSON]?.schema\n } else {\n schema = (resp as OpenAPIV2.ResponseObject).schema\n }\n if (schema) {\n all[code] = schema\n }\n }\n\n // Primary: first success schema found (204 is excluded since it typically has no body; 'default' is excluded since it often describes errors)\n const primary = all['200'] ?? all['201'] ?? all['202'] ?? all['2XX']\n return { primary, all }\n}\n\n/** Common error status codes to extract descriptions from. */\nconst ERROR_STATUS_CODES = ['400', '401', '403', '404', '409', '422', '429', '500'] as const\n\n/** Extract error response descriptions (not full schemas) for LLM hints. */\nfunction extractErrorHints(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n): Record<string, string> | undefined {\n const responses = operation.responses\n if (!responses) return undefined\n\n const hints: Record<string, string> = {}\n for (const code of ERROR_STATUS_CODES) {\n const resp = responses[code] as OpenAPIV3.ResponseObject | OpenAPIV2.ResponseObject | undefined\n if (!resp?.description) continue\n hints[code] = resp.description\n }\n\n return Object.keys(hints).length > 0 ? hints : undefined\n}\n\nfunction extractResponseContentType(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): string | undefined {\n // Determine response content type from the first available success response\n const responses = operation.responses\n if (!responses) return undefined\n\n const successResponse = responses['200'] ?? responses['201'] ?? responses['202']\n ?? responses['2XX']\n if (!successResponse) return undefined\n\n if (isOpenAPI3) {\n const resp = successResponse as OpenAPIV3.ResponseObject\n if (!resp.content) return undefined\n // Return first content type, preferring application/json\n const types = Object.keys(resp.content)\n if (types.includes(ContentType.JSON)) return ContentType.JSON\n return types[0]\n } else {\n // Swagger 2.0: check operation-level `produces`\n const op = operation as OpenAPIV2.OperationObject\n const produces = op.produces\n if (produces && produces.length > 0) {\n if (produces.includes(ContentType.JSON)) return ContentType.JSON\n return produces[0]\n }\n return undefined // No operation-level produces; caller falls back to default Accept header\n }\n}\n\nfunction extractSecuritySchemes(\n api: OpenAPIV3.Document | OpenAPIV2.Document,\n isOpenAPI3: boolean,\n) {\n if (isOpenAPI3) {\n const openapi3 = api as OpenAPIV3.Document\n const rawSchemes = openapi3.components?.securitySchemes ?? {}\n const schemes: Record<string, OpenAPIV3.SecuritySchemeObject> = {}\n for (const [name, scheme] of Object.entries(rawSchemes)) {\n if (scheme && !('$ref' in scheme)) {\n schemes[name] = scheme as OpenAPIV3.SecuritySchemeObject\n }\n }\n return mapSecuritySchemes(schemes)\n } else {\n const swagger2 = api as OpenAPIV2.Document\n return mapSecuritySchemes(swagger2.securityDefinitions ?? {})\n }\n}\n","/**\n * Base URL resolution for OpenAPI specs.\n * Handles servers array (3.x), host+basePath (2.0), and fallback to spec URL.\n */\n\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\n\n/**\n * Extract base URL from OpenAPI 3.x servers array.\n * Interpolates server variables using their default value or first enum value.\n * Resolves relative server URLs (e.g. \"/\", \"/api/v1\") against the spec URL when provided.\n * Returns '' when no server is defined or a relative URL can't be resolved.\n *\n * @param api - The parsed OpenAPI 3.x document\n * @param specUrl - Optional spec URL used to resolve relative server URLs\n */\nexport function extractOpenAPI3BaseUrl(api: OpenAPIV3.Document, specUrl?: string): string {\n const server = api.servers?.[0]\n if (!server) return ''\n\n let url = server.url\n\n // Interpolate server variables with defaults\n if (server.variables) {\n for (const [name, variable] of Object.entries(server.variables)) {\n const value = variable.default ?? variable.enum?.[0]\n if (value === undefined) return ''\n url = url.replaceAll(`{${name}}`, String(value))\n }\n }\n\n // Resolve relative server URLs against the spec URL\n if (url && !url.startsWith('http')) {\n if (!specUrl) return ''\n try {\n const resolved = new URL(url, specUrl)\n return resolved.origin + resolved.pathname.replace(/\\/$/, '')\n } catch {\n return ''\n }\n }\n\n return url\n}\n\n/**\n * Extract base URL from Swagger 2.0 host, basePath, and schemes.\n * Returns '' when host is missing (must be resolved by the consumer with spec URL).\n */\nexport function extractSwagger2BaseUrl(api: OpenAPIV2.Document): string {\n const host = api.host\n if (!host) return ''\n const scheme = api.schemes?.[0] ?? 'https'\n const basePath = api.basePath ?? ''\n return `${scheme}://${host}${basePath}`\n}\n","/**\n * Maps OpenAPI/Swagger security schemes to api-invoke auth types.\n */\n\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\nimport type { AuthScheme } from '../../core/types'\nimport { AuthType, ParamLocation } from '../../core/types'\n\n/**\n * Map OpenAPI/Swagger security scheme definitions to api-invoke's {@link AuthScheme} array.\n * Supports apiKey, http (bearer/basic), oauth2, and basic (Swagger 2.0) types.\n * Unsupported schemes (e.g. openIdConnect) are mapped with `authType: null`.\n *\n * @param schemes - Security scheme definitions from the spec\n * @returns Array of normalized auth schemes\n */\nexport function mapSecuritySchemes(\n schemes: Record<string, OpenAPIV3.SecuritySchemeObject | OpenAPIV2.SecuritySchemeObject>,\n): AuthScheme[] {\n const results: AuthScheme[] = []\n for (const [name, scheme] of Object.entries(schemes)) {\n results.push(mapSingleScheme(name, scheme))\n }\n return results\n}\n\nfunction mapSingleScheme(\n name: string,\n scheme: OpenAPIV3.SecuritySchemeObject | OpenAPIV2.SecuritySchemeObject,\n): AuthScheme {\n const baseDescription = scheme.description || name\n\n // apiKey type (both OpenAPI 3.x and Swagger 2.0)\n if (scheme.type === 'apiKey') {\n const apiKeyScheme = scheme as OpenAPIV3.ApiKeySecurityScheme | OpenAPIV2.SecuritySchemeApiKey\n if (apiKeyScheme.in === ParamLocation.HEADER) {\n return { name, authType: AuthType.API_KEY, metadata: { headerName: apiKeyScheme.name }, description: baseDescription }\n }\n if (apiKeyScheme.in === ParamLocation.QUERY) {\n return { name, authType: AuthType.QUERY_PARAM, metadata: { paramName: apiKeyScheme.name }, description: baseDescription }\n }\n if (apiKeyScheme.in === ParamLocation.COOKIE) {\n return { name, authType: AuthType.COOKIE, metadata: { cookieName: apiKeyScheme.name }, description: baseDescription }\n }\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: apiKey in \"${apiKeyScheme.in}\")` }\n }\n\n // http type (OpenAPI 3.x only)\n if (scheme.type === 'http') {\n const httpScheme = scheme as OpenAPIV3.HttpSecurityScheme\n if (httpScheme.scheme === AuthType.BEARER) {\n return { name, authType: AuthType.BEARER, metadata: {}, description: baseDescription }\n }\n if (httpScheme.scheme === AuthType.BASIC) {\n return { name, authType: AuthType.BASIC, metadata: {}, description: baseDescription }\n }\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: HTTP scheme \"${httpScheme.scheme}\")` }\n }\n\n // basic type (Swagger 2.0 only)\n if (scheme.type === 'basic') {\n return { name, authType: AuthType.BASIC, metadata: {}, description: baseDescription }\n }\n\n // oauth2\n if (scheme.type === 'oauth2') {\n const metadata: Record<string, string> = {}\n\n // OpenAPI 3.x: flows object\n let flowResolved = false\n if ('flows' in scheme) {\n const oauth3 = scheme as OpenAPIV3.OAuth2SecurityScheme\n const flow = oauth3.flows.authorizationCode\n ?? oauth3.flows.clientCredentials\n ?? oauth3.flows.implicit\n ?? oauth3.flows.password\n if (flow) {\n flowResolved = true\n if ('authorizationUrl' in flow && flow.authorizationUrl) metadata.authorizationUrl = flow.authorizationUrl\n if ('tokenUrl' in flow && flow.tokenUrl) metadata.tokenUrl = flow.tokenUrl\n if (flow.refreshUrl) metadata.refreshUrl = flow.refreshUrl\n if (flow.scopes && Object.keys(flow.scopes).length > 0) {\n metadata.scopes = Object.keys(flow.scopes).join(',')\n }\n }\n }\n\n // Swagger 2.0: flat fields (use generic access since union types vary)\n if ('flow' in scheme) {\n flowResolved = true\n const oauth2 = scheme as unknown as Record<string, unknown>\n if (typeof oauth2.authorizationUrl === 'string') metadata.authorizationUrl = oauth2.authorizationUrl\n if (typeof oauth2.tokenUrl === 'string') metadata.tokenUrl = oauth2.tokenUrl\n const scopes = oauth2.scopes as Record<string, string> | undefined\n if (scopes && Object.keys(scopes).length > 0) {\n metadata.scopes = Object.keys(scopes).join(',')\n }\n }\n\n const description = flowResolved\n ? baseDescription\n : `${baseDescription} (OAuth2 detected but no supported flow found)`\n return { name, authType: AuthType.OAUTH2, metadata, description }\n }\n\n // openIdConnect\n if (scheme.type === 'openIdConnect') {\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: OpenID Connect)` }\n }\n\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: unknown scheme type)` }\n}\n","/**\n * Raw URL adapter — creates a ParsedAPI from one or more plain URL endpoints (no spec).\n * Supports custom methods, IDs, and summaries per endpoint.\n * Auto-detects query parameters as configurable operation parameters.\n */\n\nimport type { ParsedAPI, Operation, Parameter } from '../../core/types'\nimport { HttpMethod, ParamLocation, SpecFormat } from '../../core/types'\n\n/**\n * A raw URL endpoint definition (no spec required).\n */\nexport interface RawEndpoint {\n /** Full URL for the endpoint (must be absolute). */\n url: string\n /** HTTP method. Default: 'GET'. */\n method?: string\n /** Custom operation ID. Auto-generated from method + path if omitted. */\n id?: string\n /** Short summary. Defaults to `'{METHOD} {hostname}{path}'`. */\n summary?: string\n}\n\n/**\n * Parse a raw URL into a {@link ParsedAPI} with a single operation.\n * Query parameters from the URL become configurable operation parameters.\n * Repeated keys (e.g. `?tags=a&tags=b`) and bracket notation (e.g. `?ids[]=1&ids[]=2`) produce array-typed parameters.\n *\n * @param url - Absolute URL (e.g. 'https://api.example.com/users?page=1')\n * @returns A ParsedAPI with a single operation (defaults to GET)\n * @throws {Error} If the URL is not a valid absolute URL\n */\nexport function parseRawUrl(url: string): ParsedAPI {\n return parseRawUrls([{ url }])\n}\n\n/**\n * Parse multiple raw URL endpoints into a single {@link ParsedAPI}.\n * All endpoints must share the same origin. Query parameters become configurable operation parameters.\n * Repeated keys and bracket notation (e.g. `?ids[]=1&ids[]=2`) produce array-typed parameters.\n * Nested brackets (e.g. `[][]`) are flattened to a 1D array. Indexed brackets (e.g. `[0]`, `[1]`) are not recognized.\n *\n * @param endpoints - Array of raw endpoint definitions\n * @returns A ParsedAPI with one operation per endpoint\n * @throws {Error} If endpoints is empty, URLs are invalid, or origins don't match\n */\nexport function parseRawUrls(endpoints: RawEndpoint[]): ParsedAPI {\n if (endpoints.length === 0) {\n throw new Error('At least one endpoint is required')\n }\n\n // Derive baseUrl from first endpoint\n let firstParsed: URL\n try {\n firstParsed = new URL(endpoints[0].url)\n } catch {\n throw new Error(`Invalid URL \"${endpoints[0].url}\". Expected an absolute URL like \"https://api.example.com/path\".`)\n }\n const baseUrl = firstParsed.origin\n\n const operations: Operation[] = endpoints.map((ep) => {\n let parsed: URL\n try {\n parsed = new URL(ep.url)\n } catch {\n throw new Error(`Invalid URL \"${ep.url}\". Expected an absolute URL like \"https://api.example.com/path\".`)\n }\n\n if (parsed.origin !== firstParsed.origin) {\n throw new Error(\n `All endpoints must share the same origin. Got \"${parsed.origin}\" but expected \"${firstParsed.origin}\"`\n )\n }\n const method = (ep.method ?? HttpMethod.GET).toUpperCase()\n const pathname = parsed.pathname\n\n const parameters: Parameter[] = []\n\n // Group query entries by parameter name, merging repeated keys and normalizing bracket notation (e.g. tags[] → tags)\n const entries = new Map<string, { values: string[]; isBracket: boolean }>()\n for (const [rawKey, value] of parsed.searchParams.entries()) {\n const name = rawKey.replace(/(\\[\\])+$/, '')\n const isBracket = name !== rawKey\n if (!name) continue // bare bracket key (e.g. \"[]\") has no usable parameter name\n const existing = entries.get(name)\n if (existing) {\n existing.values.push(value)\n existing.isBracket = existing.isBracket || isBracket\n } else {\n entries.set(name, { values: [value], isBracket })\n }\n }\n\n // Build parameters — repeated keys or bracket notation become arrays.\n // Note: url-builder serializes arrays as comma-separated (e.g. tags=a%2Cb), not repeated keys.\n for (const [name, { values, isBracket }] of entries) {\n const isArray = values.length > 1 || isBracket\n parameters.push({\n name,\n in: ParamLocation.QUERY,\n required: false,\n description: isArray\n ? `Default: ${JSON.stringify(values)}`\n : `Default: ${values[0]}`,\n schema: isArray\n ? { type: 'array', default: values, items: { type: 'string' } }\n : { type: 'string', default: values[0] },\n })\n }\n\n const id = ep.id\n ?? `${method.toLowerCase()}_${pathname.replace(/^\\//, '').replace(/[\\/]/g, '_') || 'root'}`\n\n return {\n id,\n path: pathname,\n method,\n summary: ep.summary ?? `${method} ${parsed.hostname}${pathname}`,\n parameters,\n tags: [],\n }\n })\n\n return {\n title: firstParsed.hostname,\n version: '1.0.0',\n baseUrl,\n operations,\n authSchemes: [],\n specFormat: SpecFormat.RAW_URL,\n }\n}\n","/**\n * Heuristics for detecting API spec formats from URLs and content.\n * Used by `createClient()` for auto-detection and available for consumers\n * that implement their own detection pipelines.\n */\n\n/**\n * Detect if a URL likely points to an OpenAPI/Swagger spec by URL pattern.\n * Checks for common spec file extensions and path patterns.\n *\n * @param url - Absolute URL to check\n * @returns `true` if the URL matches a known spec URL pattern\n */\nexport function isSpecUrl(url: string): boolean {\n const lower = url.toLowerCase()\n return (\n lower.endsWith('/openapi.json') ||\n lower.endsWith('/openapi.yaml') ||\n lower.endsWith('/openapi.yml') ||\n lower.endsWith('/swagger.json') ||\n lower.endsWith('/swagger.yaml') ||\n lower.endsWith('/swagger.yml') ||\n lower.endsWith('/spec.json') ||\n lower.endsWith('/spec.yaml') ||\n lower.endsWith('/spec.yml') ||\n lower.endsWith('/api-docs') ||\n lower.endsWith('/api-docs.json') ||\n lower.endsWith('/api-docs.yaml') ||\n lower.endsWith('/v2/api-docs') ||\n lower.endsWith('/v3/api-docs') ||\n lower.includes('swagger') ||\n lower.includes('openapi')\n )\n}\n\n/**\n * Detect if a parsed JSON object is an OpenAPI/Swagger spec by checking\n * for the required top-level `openapi` (3.x) or `swagger` (2.0) key.\n *\n * @param data - Parsed JSON value to check\n * @returns `true` if the data looks like an OpenAPI/Swagger spec\n */\nexport function isSpecContent(data: unknown): data is Record<string, unknown> {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return false\n const obj = data as Record<string, unknown>\n return typeof obj.openapi === 'string' || typeof obj.swagger === 'string'\n}\n\n/**\n * Detect if a URL likely points to a GraphQL endpoint by URL pattern.\n * Checks for common GraphQL path suffixes.\n *\n * @param url - Absolute URL to check\n * @returns `true` if the URL matches a known GraphQL endpoint pattern\n */\nexport function isGraphQLUrl(url: string): boolean {\n try {\n return /\\/graphql(?:$|[\\/\\?#])/i.test(new URL(url).pathname)\n } catch {\n return false\n }\n}\n","/**\n * Main client — the public API for api-invoke.\n * Supports three tiers: full spec (OpenAPI/GraphQL), raw URL, and zero-spec execution.\n */\n\nimport type { ParsedAPI, Operation, Auth, AuthScheme, ExecutionResult, StreamingExecutionResult, SSEEvent, ClientOptions, Middleware } from './core/types'\nimport { executeOperation, executeOperationStream } from './core/executor'\nimport { parseOpenAPISpec } from './adapters/openapi/parser'\nimport { parseRawUrl } from './adapters/raw/parser'\nimport { isSpecUrl, isSpecContent, isGraphQLUrl } from './core/detection'\n\n/**\n * Heuristic: detect if a parsed JSON object looks like a GraphQL introspection result.\n */\nfunction isGraphQLIntrospection(obj: Record<string, unknown>): boolean {\n if (obj.__schema !== undefined) return true\n if (typeof obj.data === 'object' && obj.data !== null && '__schema' in (obj.data as object)) return true\n return false\n}\n\n/**\n * High-level API client. Wraps a {@link ParsedAPI} and provides methods to execute operations by ID.\n * Created via {@link createClient} (recommended) or by constructing directly with a `ParsedAPI`.\n *\n * @example\n * ```ts\n * const client = await createClient('https://petstore.swagger.io/v2/swagger.json')\n * const result = await client.execute('getInventory')\n * console.log(result.data)\n * ```\n */\nexport class ApiInvokeClient {\n /** The parsed API specification backing this client. */\n readonly api: ParsedAPI\n private auth: Auth | Auth[] | undefined\n private middleware: Middleware[]\n private fetchFn: typeof globalThis.fetch\n private timeoutMs: number\n\n /**\n * @param api - Parsed API specification (from any adapter)\n * @param options - Client configuration (auth, middleware, fetch, timeout)\n */\n constructor(api: ParsedAPI, options: ClientOptions = {}) {\n this.api = api\n this.auth = options.auth\n this.middleware = options.middleware ?? []\n this.fetchFn = options.fetch ?? globalThis.fetch\n this.timeoutMs = options.timeoutMs ?? 0\n }\n\n /** The resolved base URL for this API. */\n get baseUrl(): string {\n return this.api.baseUrl\n }\n\n /** All available operations from the parsed spec. */\n get operations(): Operation[] {\n return this.api.operations\n }\n\n /** Authentication schemes declared in the spec. Useful for building auth UIs. */\n get authSchemes(): AuthScheme[] {\n return this.api.authSchemes\n }\n\n /**\n * Set authentication credentials for all subsequent requests.\n * @param auth - Single credential or array for composing multiple schemes\n */\n setAuth(auth: Auth | Auth[]): void {\n this.auth = auth\n }\n\n /**\n * Clear authentication credentials.\n */\n clearAuth(): void {\n this.auth = undefined\n }\n\n /**\n * Find an operation by its ID.\n * @param operationId - The operation ID to search for (e.g. 'listUsers', 'get_users_userId')\n * @returns The operation, or undefined if not found\n */\n findOperation(operationId: string): Operation | undefined {\n return this.api.operations.find((op) => op.id === operationId)\n }\n\n /**\n * Execute an operation by ID with arguments.\n *\n * @param operationId - The operation ID from the parsed spec\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Per-call overrides for auth, accept header, error behavior, and redirect mode\n * @returns The execution result with status, parsed data, and response metadata\n * @throws {ApiInvokeError} For network, CORS, timeout, and (by default) HTTP errors\n * @throws {Error} If the operation ID is not found\n *\n * @example\n * ```ts\n * const result = await client.execute('getUser', { userId: 123 })\n * console.log(result.status, result.data)\n * ```\n */\n async execute(\n operationId: string,\n args: Record<string, unknown> = {},\n options?: { auth?: Auth | Auth[]; accept?: string; throwOnHttpError?: boolean; redirect?: RequestInit['redirect'] },\n ): Promise<ExecutionResult> {\n const operation = this.findOperation(operationId)\n if (!operation) {\n throw new Error(`Operation \"${operationId}\" not found. Available: ${this.api.operations.map((o) => o.id).join(', ')}`)\n }\n\n return executeOperation(this.api.baseUrl, operation, args, {\n auth: options?.auth ?? this.auth,\n middleware: this.middleware,\n fetch: this.fetchFn,\n timeoutMs: this.timeoutMs,\n accept: options?.accept,\n throwOnHttpError: options?.throwOnHttpError,\n redirect: options?.redirect,\n })\n }\n\n /**\n * Execute an operation as a stream, returning an async iterable of SSE events.\n * Errors always throw (no non-throwing mode for streams).\n *\n * @param operationId - The operation ID from the parsed spec\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Per-call overrides for auth, accept header, abort signal, and event callback. The client-level `timeoutMs` applies to the initial connection.\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, and HTTP errors\n * @throws {Error} If the operation ID is not found\n *\n * @example\n * ```ts\n * const result = await client.executeStream('chatCompletion', {\n * model: 'gpt-4', messages: [{ role: 'user', content: 'Hi' }], stream: true,\n * })\n * for await (const event of result.stream) {\n * console.log(event.data)\n * }\n * ```\n */\n async executeStream(\n operationId: string,\n args: Record<string, unknown> = {},\n options?: { auth?: Auth | Auth[]; accept?: string; signal?: AbortSignal; onEvent?: (event: SSEEvent) => void },\n ): Promise<StreamingExecutionResult> {\n const operation = this.findOperation(operationId)\n if (!operation) {\n throw new Error(`Operation \"${operationId}\" not found. Available: ${this.api.operations.map((o) => o.id).join(', ')}`)\n }\n\n return executeOperationStream(this.api.baseUrl, operation, args, {\n auth: options?.auth ?? this.auth,\n middleware: this.middleware,\n fetch: this.fetchFn,\n timeoutMs: this.timeoutMs,\n accept: options?.accept,\n signal: options?.signal,\n onEvent: options?.onEvent,\n })\n }\n\n}\n\n/**\n * Create a client from an OpenAPI spec URL, GraphQL endpoint, spec object, or raw API URL.\n *\n * Auto-detection logic:\n * - OpenAPI spec URL (e.g. ends with `/openapi.json`) → parsed spec with all operations\n * - GraphQL endpoint URL (path contains `/graphql`) → introspection query, one operation per field\n * - Raw URL → attempts content-based spec detection, falls back to single-operation raw mode\n * - GraphQL introspection object (`{ __schema }` or `{ data: { __schema } }`) → parsed directly\n * - OpenAPI spec object (parsed JSON/YAML) → parsed directly\n *\n * @param input - OpenAPI spec URL, GraphQL endpoint URL, raw API URL, or pre-parsed spec/introspection object\n * @param options - Client configuration (auth, middleware, fetch, enricher, timeout)\n * @returns A configured {@link ApiInvokeClient} ready to execute operations\n * @throws {Error} If the spec cannot be fetched or parsed\n *\n * @example\n * ```ts\n * // From OpenAPI spec URL\n * const client = await createClient('https://petstore.swagger.io/v2/swagger.json')\n *\n * // From GraphQL endpoint\n * const client = await createClient('https://countries.trevorblades.com/graphql')\n *\n * // From raw API URL\n * const client = await createClient('https://api.example.com/users?page=1')\n *\n * // From spec object\n * const client = await createClient(specJson, { auth: { type: 'bearer', token: 'sk-...' } })\n * ```\n */\nexport async function createClient(\n input: string | object,\n options: ClientOptions = {},\n): Promise<ApiInvokeClient> {\n let api: ParsedAPI\n\n if (typeof input === 'string') {\n if (isSpecUrl(input)) {\n api = await fetchAndParseSpec(input, options)\n } else if (isGraphQLUrl(input)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n api = await parseGraphQLSchema(input, { endpoint: input, fetch: options.fetch })\n } else {\n // URL doesn't match spec patterns — try content-based detection\n api = await tryContentDetection(input, options)\n }\n } else {\n const obj = input as Record<string, unknown>\n if (isGraphQLIntrospection(obj)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n api = await parseGraphQLSchema(input, { endpoint: options.specUrl, fetch: options.fetch })\n } else {\n // OpenAPI spec object passed directly\n api = await parseOpenAPISpec(input, { specUrl: options.specUrl })\n }\n }\n\n return finalize(api, options)\n}\n\nasync function fetchAndParseSpec(url: string, options: ClientOptions): Promise<ParsedAPI> {\n const fetchFn = options.fetch ?? globalThis.fetch\n const response = await fetchFn(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch spec: ${response.status} ${response.statusText}`)\n }\n const text = await response.text()\n let specObject: object\n try {\n specObject = JSON.parse(text)\n } catch {\n // YAML or other format — let SwaggerParser resolve the URL directly\n return parseOpenAPISpec(url, { specUrl: url })\n }\n return parseOpenAPISpec(specObject, { specUrl: url })\n}\n\n/**\n * Attempt content-based spec detection by fetching the URL and inspecting the response body.\n * Falls back to raw URL mode if the URL is unreachable or the response is not a recognized spec format.\n * If content IS detected as a spec, parse errors propagate (not swallowed).\n */\nasync function tryContentDetection(url: string, options: ClientOptions): Promise<ParsedAPI> {\n const fetchFn = options.fetch ?? globalThis.fetch\n\n let response: Response\n try {\n response = await fetchFn(url)\n } catch (error) {\n // Only fall back for network-class errors; re-throw programming errors\n if (error instanceof TypeError || (error instanceof DOMException && error.name === 'AbortError')) {\n return parseRawUrl(url)\n }\n throw error\n }\n\n if (!response.ok) {\n return parseRawUrl(url)\n }\n\n let text: string\n try {\n text = await response.text()\n } catch {\n // Body read failed (e.g. network interruption during streaming)\n return parseRawUrl(url)\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n // Not JSON (YAML is only detected by URL pattern, not content probe)\n return parseRawUrl(url)\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return parseRawUrl(url)\n }\n\n const obj = parsed as Record<string, unknown>\n if (isSpecContent(obj)) {\n // Content IS a spec — let parse errors propagate\n return parseOpenAPISpec(obj, { specUrl: url })\n }\n\n if (isGraphQLIntrospection(obj)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n return parseGraphQLSchema(obj, { endpoint: url, fetch: options.fetch })\n }\n\n return parseRawUrl(url)\n}\n\nasync function finalize(api: ParsedAPI, options: ClientOptions): Promise<ApiInvokeClient> {\n if (options.enricher) {\n api = await Promise.resolve(options.enricher.enrichAPI(api))\n }\n return new ApiInvokeClient(api, options)\n}\n","/**\n * api-invoke — Parse any API spec and execute operations.\n */\n\n// Main client\nexport { createClient, ApiInvokeClient } from './client'\n\n// Core types\nexport type {\n ParsedAPI,\n Operation,\n Parameter,\n ParameterSchema,\n RequestBody,\n RequestBodySchema,\n RequestBodyProperty,\n Auth,\n AuthScheme,\n ExecutionResult,\n ResultErrorKind,\n SSEEvent,\n StreamingExecutionResult,\n ClientOptions,\n Middleware,\n Enricher,\n} from './core/types'\n\n// Constants\nexport {\n HttpMethod,\n ParamLocation,\n AuthType,\n ContentType,\n HeaderName,\n SpecFormat,\n} from './core/types'\n\n// Errors\nexport {\n ApiInvokeError,\n API_INVOKE_ERROR_NAME,\n ErrorKind,\n corsError,\n networkError,\n authError,\n httpError,\n parseError,\n graphqlError,\n timeoutError,\n} from './core/errors'\n\n// Execution\nexport { executeOperation, executeRaw, executeOperationStream, executeRawStream, buildRequest } from './core/executor'\nexport type { ExecuteOptions, BuildRequestOptions, BuiltRequest } from './core/executor'\n\n// SSE parser (advanced usage)\nexport { parseSSE } from './core/sse'\n\n// Detection utilities\nexport { isSpecUrl, isSpecContent, isGraphQLUrl } from './core/detection'\n\n// URL utilities\nexport { buildUrl, deriveBaseUrl } from './core/url-builder'\n\n// Auth utilities\nexport { injectAuth, maskAuth, refreshOAuth2Token } from './core/auth'\nexport type { AuthenticatedRequest, OAuth2TokenResult } from './core/auth'\nexport { toAuth, AuthConfigType } from './core/auth-config'\nexport type { AuthConfig } from './core/auth-config'\n\n// Middleware\nexport { withRetry, corsProxy, logging, withOAuthRefresh } from './middleware'\nexport type { RetryOptions, CorsProxyOptions, LoggingOptions, OAuthRefreshOptions } from './middleware'\n\n// Adapters (for advanced usage)\nexport { parseOpenAPISpec } from './adapters/openapi/parser'\nexport { parseRawUrl, parseRawUrls } from './adapters/raw/parser'\nexport type { RawEndpoint } from './adapters/raw/parser'\nexport { defineAPI, APIBuilder } from './adapters/manual/builder'\nexport type { EndpointOptions, ParamDef, BodyDef, PropertyDef } from './adapters/manual/builder'\n\n// GraphQL adapter\nexport { parseGraphQLSchema } from './adapters/graphql/parser'\nexport type { GraphQLParseOptions } from './adapters/graphql/parser'\nexport { hasGraphQLErrors, getGraphQLErrors, throwOnGraphQLErrors } from './adapters/graphql/errors'\nexport type { GraphQLError } from './adapters/graphql/errors'\n","/**\n * Flat auth configuration for CLI consumers.\n * Converts simple config objects (from CLI args, env vars, config files)\n * into api-invoke's discriminated Auth union.\n */\n\nimport type { Auth } from './types'\nimport { AuthType, ParamLocation } from './types'\n\n/** Simplified auth type constants for flat configuration (CLI, env vars, config files). */\nexport const AuthConfigType = {\n BEARER: 'bearer',\n HEADER: 'header',\n API_KEY: 'apikey',\n NONE: 'none',\n} as const\nexport type AuthConfigType = (typeof AuthConfigType)[keyof typeof AuthConfigType]\n\n/**\n * Flat auth configuration for CLI consumers.\n * Unlike {@link Auth}, this is a single object with optional fields rather than a discriminated union.\n * Use {@link toAuth} to convert to the full `Auth` type.\n */\nexport interface AuthConfig {\n /** Auth type to use. */\n type: AuthConfigType\n /** Bearer token (used when `type` is 'bearer'). */\n token?: string\n /** Custom header name (used when `type` is 'header'). */\n headerName?: string\n /** Custom header value (used when `type` is 'header'). */\n headerValue?: string\n /** Query parameter name (used when `type` is 'apikey'). */\n paramName?: string\n /** Query parameter value (used when `type` is 'apikey'). */\n paramValue?: string\n}\n\n/**\n * Convert a flat {@link AuthConfig} to api-invoke's {@link Auth} discriminated union.\n * Returns undefined if required credentials are missing or type is `NONE`.\n *\n * @param config - Flat auth configuration\n * @returns The `Auth` object, or undefined if credentials are incomplete\n */\nexport function toAuth(config: AuthConfig): Auth | undefined {\n switch (config.type) {\n case AuthConfigType.BEARER:\n return config.token ? { type: AuthType.BEARER, token: config.token } : undefined\n case AuthConfigType.HEADER:\n return config.headerName && config.headerValue\n ? { type: AuthType.API_KEY, location: ParamLocation.HEADER, name: config.headerName, value: config.headerValue }\n : undefined\n case AuthConfigType.API_KEY:\n return config.paramName && config.paramValue\n ? { type: AuthType.API_KEY, location: ParamLocation.QUERY, name: config.paramName, value: config.paramValue }\n : undefined\n case AuthConfigType.NONE:\n return undefined\n }\n}\n","/**\n * Retry fetch wrapper — exponential backoff with Retry-After header support.\n *\n * Works by wrapping the fetch function rather than using middleware hooks,\n * since retry logic needs to re-execute the entire request.\n */\n\nexport interface RetryOptions {\n /** Max retry attempts (default: 3) */\n maxRetries?: number\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Max delay in ms (default: 30000) */\n maxDelayMs?: number\n /** Backoff multiplier (default: 2) */\n multiplier?: number\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number\n /** Which status codes to retry (default: [429, 500, 502, 503, 504]) */\n retryableStatuses?: number[]\n /** Called on each retry with attempt info */\n onRetry?: (attempt: number, delayMs: number, status?: number) => void\n}\n\nconst DEFAULT_RETRYABLE_STATUSES = [429, 500, 502, 503, 504]\n\n/**\n * Parse the Retry-After header value into milliseconds.\n * Supports both delay-seconds and HTTP-date formats.\n */\nfunction parseRetryAfter(value: string): number | undefined {\n // Try as seconds first\n const seconds = Number(value)\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * 1000\n }\n\n // Try as HTTP-date\n const date = Date.parse(value)\n if (!Number.isNaN(date)) {\n const delayMs = date - Date.now()\n return delayMs > 0 ? delayMs : 0\n }\n\n return undefined\n}\n\n/**\n * Calculate delay with exponential backoff and jitter.\n */\nfunction calculateDelay(\n attempt: number,\n initialDelayMs: number,\n multiplier: number,\n maxDelayMs: number,\n jitter: number,\n): number {\n const base = initialDelayMs * Math.pow(multiplier, attempt)\n const capped = Math.min(base, maxDelayMs)\n const jitterAmount = capped * jitter * (Math.random() * 2 - 1)\n return Math.max(0, Math.round(capped + jitterAmount))\n}\n\n/**\n * Create a fetch wrapper that retries on transient failures.\n * Implements exponential backoff with jitter, and respects the `Retry-After` header.\n *\n * @param options - Retry configuration (max retries, delays, retryable statuses)\n * @param baseFetch - Base fetch function to wrap. Defaults to `globalThis.fetch`.\n * @returns A fetch-compatible function with retry behavior\n *\n * @example\n * ```ts\n * const client = await createClient(url, {\n * fetch: withRetry({ maxRetries: 3 }),\n * })\n * ```\n *\n * @example\n * ```ts\n * // Wrap a custom fetch\n * const client = await createClient(url, {\n * fetch: withRetry({ maxRetries: 3 }, myCustomFetch),\n * })\n * ```\n */\nexport function withRetry(\n options: RetryOptions = {},\n baseFetch?: typeof globalThis.fetch,\n): typeof globalThis.fetch {\n const {\n maxRetries = 3,\n initialDelayMs = 1000,\n maxDelayMs = 30_000,\n multiplier = 2,\n jitter = 0.1,\n retryableStatuses = DEFAULT_RETRYABLE_STATUSES,\n onRetry,\n } = options\n\n const fetchFn = baseFetch ?? globalThis.fetch\n\n return async function retryFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n let lastError: Error | undefined\n let lastResponse: Response | undefined\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetchFn(input, init)\n\n if (retryableStatuses.includes(response.status) && attempt < maxRetries) {\n lastResponse = response\n\n // Check Retry-After header\n const retryAfter = response.headers.get('retry-after')\n let delayMs: number\n\n if (retryAfter) {\n const parsed = parseRetryAfter(retryAfter)\n delayMs = parsed !== undefined\n ? Math.min(parsed, maxDelayMs)\n : calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n } else {\n delayMs = calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n }\n\n onRetry?.(attempt + 1, delayMs, response.status)\n await sleep(delayMs)\n continue\n }\n\n return response\n } catch (error) {\n lastError = error as Error\n\n if (attempt < maxRetries) {\n const delayMs = calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n onRetry?.(attempt + 1, delayMs)\n await sleep(delayMs)\n continue\n }\n }\n }\n\n // All retries exhausted — return last response or throw last error\n if (lastResponse) return lastResponse\n throw lastError!\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * CORS proxy middleware — rewrites request URLs through a proxy.\n *\n * Useful when APIs block browser CORS requests. Supports custom\n * proxy URL patterns or the common `/api-proxy/{encodedUrl}` convention.\n */\n\nimport type { Middleware } from '../core/types'\n\nexport interface CorsProxyOptions {\n /**\n * URL rewrite function. Receives the original URL, returns the proxied URL.\n * Default: `/api-proxy/{encodeURIComponent(url)}`\n */\n rewrite?: (url: string) => string\n\n /**\n * Only proxy URLs matching this predicate.\n * Default: proxies all absolute HTTP(S) URLs.\n */\n shouldProxy?: (url: string) => boolean\n}\n\nfunction defaultRewrite(url: string): string {\n return `/api-proxy/${encodeURIComponent(url)}`\n}\n\nfunction defaultShouldProxy(url: string): boolean {\n return url.startsWith('http://') || url.startsWith('https://')\n}\n\n/**\n * Create a CORS proxy middleware that rewrites request URLs through a proxy server.\n * Useful when APIs block browser CORS requests.\n *\n * @param options - Proxy configuration (custom rewrite function, proxy filter)\n * @returns A {@link Middleware} that rewrites URLs through the proxy\n *\n * @example\n * ```ts\n * // Default: rewrites to /api-proxy/{encodedUrl}\n * const client = await createClient(url, {\n * middleware: [corsProxy()],\n * })\n * ```\n *\n * @example\n * ```ts\n * // Custom proxy URL\n * const client = await createClient(url, {\n * middleware: [corsProxy({\n * rewrite: (url) => `https://my-proxy.com/?url=${encodeURIComponent(url)}`,\n * })],\n * })\n * ```\n */\nexport function corsProxy(options: CorsProxyOptions = {}): Middleware {\n const rewrite = options.rewrite ?? defaultRewrite\n const shouldProxy = options.shouldProxy ?? defaultShouldProxy\n\n return {\n name: 'cors-proxy',\n onRequest(url, init) {\n if (shouldProxy(url)) {\n return { url: rewrite(url), init }\n }\n return { url, init }\n },\n }\n}\n","/**\n * Logging middleware — request/response logging with automatic secret masking.\n *\n * Masks Authorization headers, API keys in query strings, and other\n * sensitive values to prevent credential leakage in logs.\n */\n\nimport type { Middleware } from '../core/types'\nimport { HttpMethod } from '../core/types'\n\nexport interface LoggingOptions {\n /** Custom log function (default: console.log) */\n log?: (message: string) => void\n /** Log response bodies (default: false) */\n logBody?: boolean\n /** Additional header names to mask (always masks Authorization) */\n sensitiveHeaders?: string[]\n /** Query parameter names to mask (e.g., ['api_key', 'token']) */\n sensitiveParams?: string[]\n /** Label prefix for log messages (default: 'api-invoke') */\n prefix?: string\n}\n\nconst DEFAULT_SENSITIVE_HEADERS = ['authorization', 'x-api-key', 'cookie']\nconst DEFAULT_SENSITIVE_PARAMS = ['api_key', 'apikey', 'key', 'token', 'access_token']\n\n/**\n * Mask a header value, showing only the scheme for Authorization headers.\n */\nfunction maskHeaderValue(name: string, value: string): string {\n const lower = name.toLowerCase()\n if (lower === 'authorization') {\n const space = value.indexOf(' ')\n if (space > 0) {\n return `${value.substring(0, space)} ***`\n }\n return '***'\n }\n return '***'\n}\n\n/**\n * Mask sensitive query parameters in a URL.\n */\nfunction maskUrl(url: string, sensitiveParams: string[]): string {\n try {\n const parsed = new URL(url)\n let masked = false\n for (const param of sensitiveParams) {\n if (parsed.searchParams.has(param)) {\n parsed.searchParams.set(param, '***')\n masked = true\n }\n }\n return masked ? parsed.toString() : url\n } catch {\n return url\n }\n}\n\n/**\n * Extract and mask headers from RequestInit for logging.\n */\nfunction formatHeaders(\n init: RequestInit,\n sensitiveHeaders: string[],\n): Record<string, string> | undefined {\n const headers = init.headers\n if (!headers) return undefined\n\n const result: Record<string, string> = {}\n const sensitiveSet = new Set(sensitiveHeaders.map(h => h.toLowerCase()))\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n })\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n }\n } else {\n for (const [key, value] of Object.entries(headers)) {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Create a logging middleware that logs requests and responses.\n * Automatically masks sensitive headers (Authorization, cookies) and query parameters.\n *\n * @param options - Logging configuration (custom logger, body logging, sensitive fields)\n * @returns A {@link Middleware} that logs request/response details\n *\n * @example\n * ```ts\n * const client = await createClient(url, {\n * middleware: [logging()],\n * })\n * ```\n *\n * @example\n * ```ts\n * // Custom logger\n * const client = await createClient(url, {\n * middleware: [logging({ log: myLogger.info })],\n * })\n * ```\n */\nexport function logging(options: LoggingOptions = {}): Middleware {\n const {\n log = console.log,\n logBody = false,\n prefix = 'api-invoke',\n } = options\n\n const sensitiveHeaders = [\n ...DEFAULT_SENSITIVE_HEADERS,\n ...(options.sensitiveHeaders ?? []).map(h => h.toLowerCase()),\n ]\n const sensitiveParams = [\n ...DEFAULT_SENSITIVE_PARAMS,\n ...(options.sensitiveParams ?? []),\n ]\n\n let requestStart = 0\n\n return {\n name: 'logging',\n\n onRequest(url, init) {\n requestStart = performance.now()\n\n const maskedUrl = maskUrl(url, sensitiveParams)\n const method = (init.method ?? HttpMethod.GET).toUpperCase()\n const headers = formatHeaders(init, sensitiveHeaders)\n\n const parts = [`[${prefix}] → ${method} ${maskedUrl}`]\n if (headers) {\n parts.push(` headers: ${JSON.stringify(headers)}`)\n }\n if (logBody && init.body) {\n const bodyStr = typeof init.body === 'string' ? init.body : '<binary>'\n parts.push(` body: ${bodyStr}`)\n }\n log(parts.join('\\n'))\n\n return { url, init }\n },\n\n onResponse(response) {\n const elapsed = requestStart ? `${Math.round(performance.now() - requestStart)}ms` : '?ms'\n const status = response.status\n const statusText = response.statusText\n log(`[${prefix}] ← ${status} ${statusText} (${elapsed})`)\n return response\n },\n\n onError(error) {\n log(`[${prefix}] ✕ ${error.message}`)\n },\n }\n}\n","/**\n * OAuth2 token refresh fetch wrapper.\n * Intercepts 401 responses, refreshes the token, and retries the request.\n *\n * Note: Requests with `ReadableStream` bodies cannot be retried — if a stream body\n * is detected after a 401, the original response is returned with a warning.\n */\n\nimport { refreshOAuth2Token } from '../core/auth'\nimport type { OAuth2TokenResult } from '../core/auth'\n\n/** Configuration for the OAuth2 token refresh fetch wrapper ({@link withOAuthRefresh}). */\nexport interface OAuthRefreshOptions {\n /** OAuth2 token endpoint URL. */\n tokenUrl: string\n /** Refresh token to exchange for a new access token. */\n refreshToken: string\n /** OAuth2 client ID (if required by the token endpoint). */\n clientId?: string\n /** OAuth2 client secret (if required by the token endpoint). */\n clientSecret?: string\n /** OAuth2 scopes to request. */\n scopes?: string[]\n /** Called after a successful token refresh. Use this to persist the new tokens. May be async. */\n onTokenRefresh?: (tokens: OAuth2TokenResult) => void | Promise<void>\n}\n\n/**\n * Create a fetch wrapper that auto-refreshes OAuth2 tokens on 401 responses.\n * On a 401, exchanges the refresh token for a new access token and retries the original request.\n * Concurrent 401s are deduplicated — only one refresh and one `onTokenRefresh` callback fire per refresh cycle.\n *\n * @param options - Refresh configuration (token URL, refresh token, client credentials)\n * @param baseFetch - Base fetch function to wrap. Defaults to `globalThis.fetch`.\n * @returns A fetch-compatible function with auto-refresh behavior\n *\n * @example\n * ```ts\n * const client = await createClient(specUrl, {\n * auth: { type: AuthType.OAUTH2, accessToken: 'current-token' },\n * fetch: withOAuthRefresh({\n * tokenUrl: 'https://auth.example.com/token',\n * refreshToken: 'rt_...',\n * onTokenRefresh: (tokens) => saveTokens(tokens),\n * }),\n * })\n * ```\n */\nexport function withOAuthRefresh(\n options: OAuthRefreshOptions,\n baseFetch?: typeof globalThis.fetch,\n): typeof globalThis.fetch {\n const fetchFn = baseFetch ?? globalThis.fetch\n let currentRefreshToken = options.refreshToken\n let refreshPromise: Promise<OAuth2TokenResult> | null = null\n\n return async function oauthRefreshFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const response = await fetchFn(input, init)\n\n if (response.status !== 401) return response\n\n // Cannot retry requests with stream bodies — the stream was consumed on the first attempt\n if (\n init?.body instanceof ReadableStream ||\n (typeof init?.body === 'object' && init.body !== null && Symbol.asyncIterator in (init.body as object)) ||\n (typeof init?.body === 'object' && init.body !== null && typeof (init.body as { pipe?: unknown }).pipe === 'function')\n ) {\n console.warn(\n '[api-invoke] Cannot retry request with stream body after 401 — the stream was consumed. Use a string or Blob body for OAuth2-protected requests.',\n )\n return response\n }\n\n // Deduplicate concurrent refresh attempts — refresh + callback fire exactly once per cycle\n let tokens: OAuth2TokenResult\n try {\n if (!refreshPromise) {\n refreshPromise = refreshOAuth2Token(options.tokenUrl, currentRefreshToken, {\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n scopes: options.scopes,\n fetch: fetchFn,\n }).then(async (result) => {\n if (result.refreshToken) currentRefreshToken = result.refreshToken\n\n if (options.onTokenRefresh) {\n try {\n await options.onTokenRefresh(result)\n } catch (callbackError) {\n console.warn(\n '[api-invoke] onTokenRefresh callback threw — new tokens were NOT persisted. ' +\n 'The refreshed token is used for this request, but may be lost on restart.',\n callbackError,\n )\n }\n }\n\n return result\n }).finally(() => { refreshPromise = null })\n }\n tokens = await refreshPromise\n } catch (error) {\n // Refresh failed — return the original 401\n console.warn(\n '[api-invoke] OAuth2 token refresh failed, returning original 401.',\n error,\n )\n return response\n }\n\n // Retry original request with updated Authorization header\n // Merge headers from both the Request object (if input is a Request) and init\n let baseHeaders: Record<string, string> = {}\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { baseHeaders[key] = value })\n }\n const initHeaders: Record<string, string> =\n typeof init?.headers === 'object' && !Array.isArray(init.headers) && !(init.headers instanceof Headers)\n ? { ...(init.headers as Record<string, string>) }\n : Object.fromEntries(new Headers(init?.headers).entries())\n const existingHeaders: Record<string, string> = { ...baseHeaders, ...initHeaders }\n // Remove any existing authorization header (case-insensitive) before setting the new one\n for (const key of Object.keys(existingHeaders)) {\n if (key.toLowerCase() === 'authorization') delete existingHeaders[key]\n }\n existingHeaders['Authorization'] = `Bearer ${tokens.accessToken}`\n return fetchFn(input, { ...init, headers: existingHeaders })\n }\n}\n","/**\n * Manual API definition builder — define APIs without writing a full OpenAPI spec.\n * Supports multiple endpoints, methods, parameters, and request bodies.\n *\n * @example\n * ```ts\n * const api = defineAPI('My API')\n * .baseUrl('https://api.example.com')\n * .get('/users', { id: 'listUsers', summary: 'List all users' })\n * .post('/users', {\n * id: 'createUser',\n * body: { contentType: 'application/json', properties: { name: 'string', email: 'string' } },\n * })\n * .build()\n * ```\n */\n\nimport type { ParsedAPI, Operation, Parameter, RequestBody, RequestBodyProperty } from '../../core/types'\nimport { ContentType, HttpMethod, ParamLocation, SpecFormat } from '../../core/types'\n\n/**\n * Options for defining an endpoint in the manual builder.\n */\nexport interface EndpointOptions {\n /** Custom operation ID. Auto-generated from method + path if omitted (e.g. 'get_users'). */\n id?: string\n /** Short summary of what this endpoint does. */\n summary?: string\n /** Longer description of the endpoint's behavior. */\n description?: string\n /** Parameter definitions. Keys are parameter names; values are type strings (shorthand) or full {@link ParamDef} objects. Path parameters from `{placeholders}` are auto-detected. */\n params?: Record<string, ParamDef | string>\n /** Request body definition. */\n body?: BodyDef\n /** Expected response content type. Used as the default Accept header. */\n responseContentType?: ContentType | string\n /** Tags for grouping this endpoint. */\n tags?: string[]\n}\n\n/**\n * Parameter definition for the manual builder.\n * All fields are optional — defaults to a non-required query string parameter of type 'string'.\n */\nexport type ParamDef = {\n /** Where the parameter appears. Default: 'query' (path params are always forced to 'path'). */\n in?: ParamLocation\n /** Whether this parameter is required. Default: false (path params are always required). */\n required?: boolean\n /** Data type. Default: 'string'. */\n type?: string\n /** Human-readable description. */\n description?: string\n /** Default value when the parameter is not provided. */\n default?: unknown\n}\n\n/**\n * Request body definition for the manual builder.\n */\nexport type BodyDef = {\n /** Content type for the body. Default: 'application/json'. */\n contentType?: string\n /** Whether the body is required. Default: true. */\n required?: boolean\n /** Body properties. Keys are property names; values are type strings (shorthand) or full {@link PropertyDef} objects. */\n properties?: Record<string, string | PropertyDef>\n /** Names of required properties within the body. */\n requiredFields?: string[]\n}\n\n/**\n * Property definition within a request body.\n */\nexport type PropertyDef = {\n /** Data type (e.g. 'string', 'integer', 'boolean'). */\n type: string\n /** Human-readable description. */\n description?: string\n /** Format hint (e.g. 'date-time', 'email'). */\n format?: string\n /** Allowed values for this property. */\n enum?: unknown[]\n}\n\n/**\n * Fluent builder for manually defining APIs without an OpenAPI spec.\n * Use {@link defineAPI} to create an instance.\n *\n * @example\n * ```ts\n * const api = defineAPI('Users API')\n * .baseUrl('https://api.example.com')\n * .get('/users', { id: 'listUsers' })\n * .get('/users/{userId}', { id: 'getUser' })\n * .post('/users', { id: 'createUser', body: { properties: { name: 'string' } } })\n * .build()\n * ```\n */\nexport class APIBuilder {\n private _title: string\n private _version = '1.0.0'\n private _baseUrl = ''\n private _operations: Operation[] = []\n\n constructor(title: string) {\n this._title = title\n }\n\n /**\n * Set the API version string.\n * @param v - Version string (e.g. '2.0.0'). Default: '1.0.0'.\n */\n version(v: string): this {\n this._version = v\n return this\n }\n\n /**\n * Set the base URL for all endpoints.\n * @param url - Base URL (e.g. 'https://api.example.com/v1'). Required before calling {@link build}.\n */\n baseUrl(url: string): this {\n this._baseUrl = url\n return this\n }\n\n /** Add a GET endpoint. */\n get(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.GET, path, options)\n }\n\n /** Add a POST endpoint. */\n post(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.POST, path, options)\n }\n\n /** Add a PUT endpoint. */\n put(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.PUT, path, options)\n }\n\n /** Add a PATCH endpoint. */\n patch(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.PATCH, path, options)\n }\n\n /** Add a DELETE endpoint. */\n delete(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.DELETE, path, options)\n }\n\n /**\n * Add an endpoint with any HTTP method.\n * Path parameters are auto-detected from `{placeholder}` segments.\n *\n * @param method - HTTP method (e.g. 'GET', 'POST')\n * @param path - URL path template (e.g. '/users/{userId}')\n * @param options - Endpoint configuration\n */\n endpoint(method: string, path: string, options: EndpointOptions = {}): this {\n const id = options.id ?? `${method.toLowerCase()}_${path.replace(/[{}\\/]/g, '_').replace(/^_|_$/g, '').replace(/_+/g, '_')}`\n\n // Auto-detect path params from {param} placeholders\n const pathParamNames = [...path.matchAll(/\\{(\\w+)\\}/g)].map(m => m[1])\n\n const parameters: Parameter[] = []\n\n // Add path params from path template\n for (const name of pathParamNames) {\n const explicit = options.params?.[name]\n const def = typeof explicit === 'string'\n ? { type: explicit }\n : explicit ?? {}\n parameters.push({\n name,\n in: ParamLocation.PATH,\n required: true,\n description: def.description ?? '',\n schema: { type: def.type ?? 'string', default: def.default },\n })\n }\n\n // Add remaining params (query/header/cookie)\n if (options.params) {\n for (const [name, raw] of Object.entries(options.params)) {\n if (pathParamNames.includes(name)) continue // already added\n const def = typeof raw === 'string' ? { type: raw } : raw\n parameters.push({\n name,\n in: def.in ?? ParamLocation.QUERY,\n required: def.required ?? false,\n description: def.description ?? '',\n schema: { type: def.type ?? 'string', default: def.default },\n })\n }\n }\n\n // Build request body\n let requestBody: RequestBody | undefined\n if (options.body) {\n const properties: Record<string, RequestBodyProperty> = {}\n if (options.body.properties) {\n for (const [name, raw] of Object.entries(options.body.properties)) {\n if (typeof raw === 'string') {\n properties[name] = { type: raw }\n } else {\n properties[name] = {\n type: raw.type,\n description: raw.description,\n format: raw.format,\n enum: raw.enum,\n }\n }\n }\n }\n requestBody = {\n required: options.body.required ?? true,\n contentType: options.body.contentType ?? ContentType.JSON,\n schema: {\n type: 'object',\n raw: {},\n properties,\n required: options.body.requiredFields,\n },\n }\n }\n\n this._operations.push({\n id,\n path,\n method: method.toUpperCase(),\n summary: options.summary,\n description: options.description,\n parameters,\n requestBody,\n responseContentType: options.responseContentType,\n tags: options.tags ?? [],\n })\n\n return this\n }\n\n /**\n * Build the {@link ParsedAPI} from the configured endpoints.\n * @returns A ParsedAPI ready to use with {@link ApiInvokeClient}\n * @throws {Error} If `baseUrl` is not set or no endpoints are defined\n */\n build(): ParsedAPI {\n if (!this._baseUrl) {\n throw new Error('baseUrl is required. Call .baseUrl(\"https://...\") before .build().')\n }\n if (this._operations.length === 0) {\n throw new Error('At least one endpoint is required. Call .get(), .post(), etc. before .build().')\n }\n return {\n title: this._title,\n version: this._version,\n baseUrl: this._baseUrl,\n operations: [...this._operations],\n authSchemes: [],\n specFormat: SpecFormat.MANUAL,\n }\n }\n}\n\n/**\n * Create a new API builder with a fluent interface.\n *\n * @param title - Human-readable API title\n * @returns A new {@link APIBuilder} instance\n *\n * @example\n * ```ts\n * const api = defineAPI('My API')\n * .baseUrl('https://api.example.com')\n * .get('/health', { id: 'healthCheck' })\n * .build()\n * ```\n */\nexport function defineAPI(title: string): APIBuilder {\n return new APIBuilder(title)\n}\n","/**\n * GraphQL error detection and handling utilities.\n * GraphQL APIs return HTTP 200 even on errors — these helpers inspect the response body.\n */\n\nimport type { ExecutionResult } from '../../core/types'\nimport { graphqlError } from '../../core/errors'\n\n/** A single GraphQL error from the response `errors` array. */\nexport interface GraphQLError {\n message: string\n locations?: Array<{ line: number; column: number }>\n path?: Array<string | number>\n extensions?: Record<string, unknown>\n}\n\n/** Check if an ExecutionResult contains GraphQL errors. Returns true for both total and partial errors. Use {@link throwOnGraphQLErrors} to throw only on total failures (when `data` is null). */\nexport function hasGraphQLErrors(result: ExecutionResult): boolean {\n const body = result.data as Record<string, unknown> | null\n return body != null && Array.isArray(body.errors) && body.errors.length > 0\n}\n\n/** Extract GraphQL errors from an ExecutionResult. Returns empty array if none. */\nexport function getGraphQLErrors(result: ExecutionResult): GraphQLError[] {\n const body = result.data as Record<string, unknown> | null\n if (body != null && Array.isArray(body.errors)) return body.errors as GraphQLError[]\n return []\n}\n\n/**\n * Throw if the result has GraphQL errors and no data (total failure).\n * Partial errors (data + errors both present) do not throw — the caller decides how to handle them.\n */\nexport function throwOnGraphQLErrors(result: ExecutionResult): void {\n const body = result.data as Record<string, unknown> | null\n if (body == null || !Array.isArray(body.errors) || body.errors.length === 0) return\n if (body.data != null) return // Partial error — data is present\n\n const errors = body.errors as GraphQLError[]\n const messages = errors.map(e => e.message).join('; ')\n throw graphqlError(messages, result.status, body)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/errors.ts","../src/adapters/graphql/introspection.ts","../src/adapters/graphql/query-builder.ts","../src/adapters/graphql/parser.ts","../src/core/executor.ts","../src/core/sse.ts","../src/core/url-builder.ts","../src/core/auth.ts","../src/adapters/openapi/parser.ts","../src/adapters/openapi/base-url.ts","../src/adapters/openapi/security.ts","../src/adapters/raw/parser.ts","../src/core/detection.ts","../src/client.ts","../src/index.ts","../src/core/auth-config.ts","../src/middleware/retry.ts","../src/middleware/cors-proxy.ts","../src/middleware/logging.ts","../src/middleware/oauth-refresh.ts","../src/adapters/manual/builder.ts","../src/adapters/graphql/errors.ts"],"names":["HttpMethod","ParamLocation","AuthType","SpecFormat","HeaderName","ContentType","ApiInvokeError","ErrorKind","API_INVOKE_ERROR_NAME","result","body","parseError","SwaggerParser","parseGraphQLSchema"],"mappings":";;;;;;;;;;;;;;;;;;;AAWaA,2BAAA,CAAA,CAYAC,8BAAA,CAAA,CASAC,yBAAA,CAAA,CAWAC,2BAAA,CAAA,CAUAC,2BAAA,CAAA,CA+GAC;AApKb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAWO,IAAML,kBAAA,GAAa;AAAA,MACxB,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,KAAA;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAIO,IAAMC,qBAAA,GAAgB;AAAA,MAC3B,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAIO,IAAMC,gBAAA,GAAW;AAAA,MACtB,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,QAAA;AAAA,MACT,WAAA,EAAa,YAAA;AAAA,MACb,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAIO,IAAMC,kBAAA,GAAa;AAAA,MACxB,SAAA,EAAW,WAAA;AAAA,MACX,SAAA,EAAW,WAAA;AAAA,MACX,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAIO,IAAMC,kBAAA,GAAa;AAAA,MACxB,MAAA,EAAQ,QAAA;AAAA,MACR,aAAA,EAAe,eAAA;AAAA,MACf,YAAA,EAAc,cAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV;AA0GO,IAAMC,mBAAA,GAAc;AAAA,MACzB,IAAA,EAAM,kBAAA;AAAA,MACN,eAAA,EAAiB,mCAAA;AAAA,MACjB,SAAA,EAAW,qBAAA;AAAA,MACX,GAAA,EAAK,iBAAA;AAAA,MACL,YAAA,EAAc,0BAAA;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK;AAAA,KACP;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1FO,SAAS,UAAU,GAAA,EAA6B;AACrD,EAAA,OAAO,IAAIC,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,IAAA;AAAA,IAChB,OAAA,EAAS,iBAAiB,GAAG,CAAA,+BAAA,CAAA;AAAA,IAC7B,UAAA,EAAY,sFAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AAOO,SAAS,aAAa,GAAA,EAA6B;AACxD,EAAA,OAAO,IAAID,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,OAAA;AAAA,IAChB,OAAA,EAAS,gCAAgC,GAAG,CAAA,CAAA,CAAA;AAAA,IAC5C,UAAA,EAAY,+DAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AASO,SAAS,SAAA,CAAU,GAAA,EAAa,MAAA,EAAmB,YAAA,EAAwC;AAChG,EAAA,OAAO,IAAID,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,IAAA;AAAA,IAChB,SAAS,MAAA,KAAW,GAAA,GAChB,6BAA6B,GAAG,CAAA,MAAA,CAAA,GAChC,4BAA4B,GAAG,CAAA,MAAA,CAAA;AAAA,IACnC,UAAA,EAAY,MAAA,KAAW,GAAA,GACnB,kEAAA,GACA,uEAAA;AAAA,IACJ,SAAA,EAAW,KAAA;AAAA,IACX,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAWO,SAAS,SAAA,CAAU,GAAA,EAAa,MAAA,EAAgB,UAAA,EAAoB,YAAA,EAAwC;AACjH,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,GAAA,IAAO,MAAA,IAAU,GAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,KAAW,GAAA,GAAMA,iBAAA,CAAU,aAAaA,iBAAA,CAAU,IAAA;AAE/D,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,UAAA,GAAa,iDAAA;AAAA,EACf,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,IAAA,UAAA,GAAa,+BAAA;AAAA,EACf,CAAA,MAAA,IAAW,UAAU,GAAA,EAAK;AACxB,IAAA,UAAA,GAAa,mDAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,8BAA8B,MAAM,CAAA,sBAAA,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,IAAID,sBAAA,CAAe;AAAA,IACxB,IAAA;AAAA,IACA,SAAS,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,UAAU,QAAQ,GAAG,CAAA,CAAA,CAAA;AAAA,IACxD,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAQO,SAAS,UAAA,CAAW,GAAA,EAAa,YAAA,GAAe,MAAA,EAAwB;AAC7E,EAAA,OAAO,IAAIA,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,KAAA;AAAA,IAChB,OAAA,EAAS,CAAA,8BAAA,EAAiC,GAAG,CAAA,IAAA,EAAO,YAAY,CAAA,CAAA,CAAA;AAAA,IAChE,UAAA,EAAY,8CAA8C,YAAY,CAAA,wDAAA,CAAA;AAAA,IACtE,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AASO,SAAS,YAAA,CAAa,QAAA,EAAkB,MAAA,EAAiB,YAAA,EAAwC;AACtG,EAAA,OAAO,IAAID,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,OAAA;AAAA,IAChB,OAAA,EAAS,mBAAmB,QAAQ,CAAA,CAAA;AAAA,IACpC,UAAA,EAAY,gDAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAOO,SAAS,aAAa,GAAA,EAA6B;AACxD,EAAA,OAAO,IAAID,sBAAA,CAAe;AAAA,IACxB,MAAMC,iBAAA,CAAU,OAAA;AAAA,IAChB,OAAA,EAAS,cAAc,GAAG,CAAA,WAAA,CAAA;AAAA,IAC1B,UAAA,EAAY,yEAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AA/LaA,4BAaAC,sCAAA,CAAA,CAmBAF;AA/Cb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAeO,IAAMC,iBAAA,GAAY;AAAA,MACvB,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX;AAIO,IAAMC,6BAAA,GAAwB,gBAAA;AAmB9B,IAAMF,sBAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,MAE/B,IAAA;AAAA;AAAA,MAEA,MAAA;AAAA;AAAA,MAEA,UAAA;AAAA;AAAA,MAEA,SAAA;AAAA;AAAA,MAEA,YAAA;AAAA,MAET,YAAY,IAAA,EAOT;AACD,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,QAAA,IAAA,CAAK,IAAA,GAAOE,6BAAA;AACZ,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,QAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3EA,IAMa,QAAA,EAaA,mBAAA;AAnBb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAMO,IAAM,QAAA,GAAW;AAAA,MACtB,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,cAAA;AAAA,MACd,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW;AAAA,KACb;AAIO,IAAM,mBAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACF5B,SAAS,cAAc,GAAA,EAAmC;AAC/D,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,CAAS,QAAA,EAAU;AAClC,IAAA,OAAO,IAAI,MAAA,GAAS,CAAA,EAAG,cAAc,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,CAAA,GAAM,UAAA;AAAA,EACxD;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AAC9B,IAAA,OAAO,IAAI,MAAA,GAAS,CAAA,CAAA,EAAI,cAAc,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,CAAA,GAAM,WAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAI,IAAA,IAAQ,SAAA;AACrB;AAKO,SAAS,WAAW,GAAA,EAAiD;AAC1E,EAAA,IAAI,OAAA,GAAU,GAAA;AACd,EAAA,OAAA,CAAQ,OAAA,CAAQ,SAAS,QAAA,CAAS,QAAA,IAAY,QAAQ,IAAA,KAAS,QAAA,CAAS,IAAA,KAAS,OAAA,CAAQ,MAAA,EAAQ;AAC/F,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,EACpB;AACA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,UAAU,GAAA,EAAoC;AAC5D,EAAA,OAAO,GAAA,CAAI,SAAS,QAAA,CAAS,QAAA;AAC/B;AAWO,SAAS,gBAAA,CACd,aAAA,EACA,KAAA,EACA,OAAA,EACA,WAAmB,iBAAA,EACX;AACR,EAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,KAAA,CAAM,IAAI,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,CAAM,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,kBAAkB,KAAA,CAAM,IAAA,EAAM,SAAS,QAAA,kBAAU,IAAI,KAAK,CAAA;AAE5E,EAAA,MAAM,OAAA,GAAU,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA,GAAM,EAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAA;AAE9C,EAAA,OAAO,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,GAAG,OAAO,CAAA,EAAA,CAAA;AACrF;AAEA,SAAS,yBAAyB,IAAA,EAAyC;AACzE,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,EAAA,EAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACxE;AAEA,SAAS,oBAAoB,IAAA,EAAyC;AACpE,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD;AAEA,SAAS,iBAAA,CACP,OAAA,EACA,OAAA,EACA,KAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,EAAA;AAEvB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,QAAQ,OAAO,EAAA;AAElC,EAAA,IAAI,KAAK,IAAA,KAAS,QAAA,CAAS,SAAS,IAAA,CAAK,IAAA,KAAS,SAAS,SAAA,EAAW;AACpE,IAAA,OAAO,mBAAA,CAAiD,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,MAAA,EAAQ,OAAO,EAAA;AAG1C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,GAAG,OAAO,EAAA;AACnC,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAErB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3B,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,IAAI,UAAU,IAAA,KAAS,QAAA,CAAS,UAAU,SAAA,CAAU,IAAA,KAAS,SAAS,IAAA,EAAM;AAC1E,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACpB,CAAA,MAAA,IAAW,KAAA,GAAQ,CAAA,KAAM,SAAA,CAAU,SAAS,QAAA,CAAS,MAAA,IAAU,SAAA,CAAU,IAAA,KAAS,QAAA,CAAS,KAAA,IAAS,SAAA,CAAU,IAAA,KAAS,SAAS,SAAA,CAAA,EAAY;AAC1I,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA;AAC7E,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,IAAI,CAAA;AAExB,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA;AAC9B;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,OAAA,EACA,KAAA,EACA,OAAA,EACQ;AAIR,EAAA,OAAO,gBAAA;AACT;AApIA,IAQM,iBAAA;AARN,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAKA,IAAA,kBAAA,EAAA;AAGA,IAAM,iBAAA,GAAoB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACR1B,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA+BA,eAAsB,kBAAA,CACpB,OACA,OAAA,EACoB;AACpB,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AAEtC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAIF,sBAAA,CAAe;AAAA,QACvB,MAAMC,iBAAA,CAAU,KAAA;AAAA,QAChB,OAAA,EAAS,+HAAA;AAAA,QACT,UAAA,EAAY,sFAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AACA,IAAA,QAAA,GAAW,SAAS,QAAA,IAAY,KAAA;AAChC,IAAA,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,cAAc,KAAK,CAAA;AAC5B,IAAA,QAAA,GAAW,SAAS,QAAA,IAAY,UAAA;AAAA,EAClC;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,QAAQ,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AACzC,EAAA,MAAM,aAA0B,EAAC;AAGjC,EAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM;AAC1B,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,UAAU,IAAI,CAAA;AACnD,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,KAAA,MAAW,KAAA,IAAS,UAAU,MAAA,EAAQ;AACpC,QAAA,UAAA,CAAW,KAAK,cAAA,CAAe,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,cAAc,IAAA,EAAM;AAC7B,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,aAAa,IAAI,CAAA;AACzD,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,KAAA,MAAW,KAAA,IAAS,aAAa,MAAA,EAAQ;AACvC,QAAA,UAAA,CAAW,KAAK,cAAA,CAAe,KAAA,EAAO,YAAY,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,kBAAkB,IAAA,EAAM;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,iBAAiB,IAAI,CAAA;AACxD,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,QAAA,UAAA,CAAW,KAAK,cAAA,CAAe,KAAA,EAAO,gBAAgB,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,QAAgB,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,OAAA,EAAS,eAAe,QAAQ,CAAA;AAAA,IAChC,UAAA;AAAA,IACA,aAAa,EAAC;AAAA,IACd,YAAYJ,kBAAA,CAAW;AAAA,GACzB;AACF;AAGA,eAAe,kBAAA,CACb,KACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,OAAA,GAAU,WAAW,UAAA,CAAW,KAAA;AACtC,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,QAAQ,GAAA,EAAK;AAAA,MAC5B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,qBAAqB;AAAA,KACpD,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAIG,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,OAAA;AAAA,MAChB,OAAA,EAAS,CAAA,2CAAA,EAA8C,GAAG,CAAA,EAAA,EAAK,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,MAC/G,UAAA,EAAY,qDAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAID,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,IAAA;AAAA,MAChB,OAAA,EAAS,CAAA,uCAAA,EAA0C,QAAA,CAAS,MAAM,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,MAC9E,UAAA,EAAY,+DAAA;AAAA,MACZ,SAAA,EAAW,SAAS,MAAA,IAAU,GAAA;AAAA,MAC9B,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,MAAA,GAAS,SAAS,KAAA,EAAM;AAC9B,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AAAE,MAAA,IAAA,GAAA,CAAQ,MAAM,MAAA,CAAO,IAAA,EAAK,EAAG,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,IAAE,CAAA,CAAA,MAAQ;AAAA,IAAe;AACxE,IAAA,MAAM,IAAID,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,KAAA;AAAA,MAChB,OAAA,EAAS,CAAA,oCAAA,EAAuC,GAAG,CAAA,kBAAA,EAAqB,GAAA,YAAe,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA;AAAA,MACtH,YAAY,CAAA,yCAAA,EAA4C,IAAA,GAAO,CAAA,gBAAA,EAAmB,IAAI,OAAO,EAAE,CAAA,kCAAA,CAAA;AAAA,MAC/F,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AACA,EAAA,OAAO,cAAc,IAAI,CAAA;AAC3B;AAGA,SAAS,cAAc,GAAA,EAAkC;AACvD,EAAA,MAAM,MAAA,GAAS,GAAA;AAGf,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,OAAO,MAAA,CAAO,aAAa,QAAA,EAAU;AAC1D,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAClD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AACtD,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,MAAM,IAAID,sBAAA,CAAe;AAAA,IACvB,MAAMC,iBAAA,CAAU,KAAA;AAAA,IAChB,OAAA,EAAS,kGAAA;AAAA,IACT,UAAA,EAAY,0EAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AAGA,SAAS,aAAa,KAAA,EAA4D;AAChF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA+B;AAC/C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,QAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,UAAA;AAAA,EACT;AACF;AAGA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAGA,SAAS,YAAA,CAAa,UAAkB,OAAA,EAAsC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,CAAA,aAAA,EAAgB,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,aAAA;AAAA,EACT;AACF;AAGA,SAAS,cAAA,CACP,KAAA,EACA,aAAA,EACA,IAAA,EACA,SACA,QAAA,EACW;AACX,EAAA,MAAM,EAAA,GAAK,aAAA,KAAkB,UAAA,GAAa,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,CAAA,GACrD,aAAA,KAAkB,cAAA,GAAiB,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAI,KAC7D,KAAA,CAAM,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAC,aAAa,CAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,kBAAkB,cAAA,GAClC,gBAAA,CAAiB,eAAuC,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAA,GAChF,MAAA;AAEJ,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAE9D,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAQP,kBAAA,CAAW,IAAA;AAAA,IACnB,SAAS,KAAA,CAAM,WAAA,IAAe,WAAW,aAAa,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,CAAA;AAAA,IACrE,YAAY,EAAC;AAAA,IACb,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AACpD,IAAA,SAAA,CAAU,SAAA,GAAY,CAAC,IAAA,KAAkC;AACvD,MAAA,MAAM,YAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,SAAS,GAAA,CAAI,CAAC,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAU;AAAA,IACzC,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAGA,SAAS,gBAAA,CACP,MACA,OAAA,EACyB;AACzB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAE9B,EAAA,MAAM,aAAkD,EAAC;AACzD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,GAAI,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,SAAS,MAAA,GAAS,CAAA;AAAA,IAC5B,aAAaK,mBAAA,CAAY,IAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAW;AAAA,MAClC,UAAA;AAAA,MACA,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW;AAAA;AAC7C,GACF;AACF;AAGA,SAAS,uBAAA,CACP,OACA,OAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,GACtB,CAAA,EAAG,MAAM,WAAW,CAAA,EAAA,EAAK,aAAA,CAAc,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,CAAA,GAClD,aAAA,CAAc,MAAM,IAAI,CAAA;AAG5B,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAEpC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,MAAA,EAAQ;AACjC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAA;AAClD,IAAA,MAAM,IAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,MAAA,GAAS,OAAA,GAAU,MAAA,CAAO,IAAA;AAAA,MAChC;AAAA,KACF;AACA,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AACxC,IAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,IAAA,EAAM,IAAA,CAAK,UAAU,KAAA,CAAM,YAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,QAAQ,EAAE,CAAA;AAC5C,IAAA,MAAM,aAAa,QAAA,EAAU,UAAA,EAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AACxD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAS,OAAA,GAAU,QAAA;AAAA,MACzB,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,YAAA,EAAc;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAS,OAAA,GAAU,QAAA;AAAA,MACzB,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAGA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AACvC;AAGA,SAAS,WAAW,GAAA,EAAoC;AACtD,EAAA,IAAI,OAAA,GAAmD,GAAA;AACvD,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM,OAAO,IAAA;AAC3C,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,EACpB;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,cAAc,IAAA,EAAiD;AACtE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC1B,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,IAC3B,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC1B,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,IAC3B;AAEE,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,aAAY,EAAE;AAAA;AAE1D;AAGA,SAAS,mBAAA,CACP,SACA,OAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,MAAA;AAEvB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,MAAA,EAAQ;AACjC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,EACpD;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,YAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,EACxE;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,MAAA,EAAQ;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AAE9C,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACnC,MAAA,IAAI,SAAA,CAAU,IAAA,KAAS,QAAA,CAAS,MAAA,EAAQ;AACtC,QAAA,UAAA,CAAW,EAAE,IAAI,CAAA,GAAI,aAAA,CAAc,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AAC3C,QAAA,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,GAAI,EAAE,MAAM,QAAA,EAAS;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,GAAI,EAAE,MAAM,QAAA,EAAS;AAAA,MACxC;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAW;AAAA,EACtC;AAEA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AA/YA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAMA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAEA,IAAA,kBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJA,UAAA,EAAA;;;ACKA,gBAAuB,SAAS,IAAA,EAA4D;AAC1F,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,MAAM,UAAU,IAAI,WAAA,CAAY,SAAS,EAAE,KAAA,EAAO,MAAM,CAAA;AACxD,EAAA,IAAI,MAAA,GAAS,EAAA;AAGb,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,YAAsB,EAAC;AAC3B,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,SAAS,UAAA,GAAuB;AAC9B,IAAA,MAAM,QAAkB,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAE;AACrD,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,KAAA,GAAQ,SAAA;AAC3C,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,KAAA,CAAM,EAAA,GAAK,EAAA;AACjC,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,KAAA,GAAQ,KAAA;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,gBAAA,GAAyB;AAChC,IAAA,SAAA,GAAY,MAAA;AACZ,IAAA,SAAA,GAAY,EAAC;AACb,IAAA,EAAA,GAAK,MAAA;AACL,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ;AAEA,EAAA,SAAS,YAAY,IAAA,EAAoC;AAEvD,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,QAAA,gBAAA,EAAiB;AACjB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,gBAAA,EAAiB;AACjB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,MAAA;AAG5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAA,GAAQ,EAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAE9B,MAAA,KAAA,GAAQ,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,KAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,IACzF;AAEA,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,MAAA;AACH,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AACpB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MACF,KAAK,IAAA;AAEH,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,GAAG,EAAA,GAAK,KAAA;AAChC,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AAEZ,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,KAAA,EAAO,KAAA,GAAQ,CAAA;AACxD,QAAA;AAAA,MACF;AAAA;AAIF,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,IAAI;AACF,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,MAClD,SAAS,WAAA,EAAa;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,wCAAA,EAA0C,EAAE,KAAA,EAAO,aAAa,CAAA;AAAA,MAClF;AAKA,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,IAAU,MAAA,CAAO,OAAO,MAAA,GAAS,CAAC,CAAA,KAAM,IAAA,GAAO,CAAA,GAAI,CAAA,CAAA;AACxE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,IAAI,OAAO,CAAC,CAAA,KAAM,QAAQ,MAAA,CAAO,CAAC,MAAM,IAAA,EAAM;AAC5C,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,CAAC,CAAA;AAErC,UAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,GAAI,CAAC,MAAM,IAAA,EAAM,CAAA,EAAA;AAClD,UAAA,QAAA,GAAW,CAAA,GAAI,CAAA;AAEf,UAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,UAAA,IAAI,OAAO,MAAM,KAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI;AACF,MAAA,MAAA,IAAU,QAAQ,MAAA,EAAO;AAAA,IAC3B,SAAS,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,wCAAA,EAA0C,EAAE,KAAA,EAAO,aAAa,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,OAAA,QAAe,UAAA,EAAW;AAAA,EAChC,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;;;ACnIA,UAAA,EAAA;AAWO,SAAS,QAAA,CACd,OAAA,EACA,SAAA,EACA,IAAA,EACQ;AAER,EAAA,IAAI,OAAO,SAAA,CAAU,IAAA;AACrB,EAAA,KAAA,MAAW,KAAA,IAAS,UAAU,UAAA,EAAY;AACxC,IAAA,IAAI,KAAA,CAAM,OAAOJ,qBAAA,CAAc,IAAA,IAAQ,KAAK,KAAA,CAAM,IAAI,MAAM,MAAA,EAAW;AACrE,MAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,QACV,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,QACd,mBAAmB,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC;AAAA,OAC7C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC1C,EAAA,MAAM,WAAW,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AACvD,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAG5C,EAAA,KAAA,MAAW,KAAA,IAAS,UAAU,UAAA,EAAY;AACxC,IAAA,IAAI,KAAA,CAAM,EAAA,KAAOA,qBAAA,CAAc,KAAA,EAAO;AACpC,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,MAAM,MAAA,CAAO,OAAA;AAC/C,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,QAAA,mBAAA,CAAoB,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AASO,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,OAAO,CAAA;AACzB,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,QAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AASO,SAAS,mBAAA,CACd,YACA,IAAA,EACwB;AACxB,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,CAAM,OAAOA,qBAAA,CAAc,MAAA,IAAU,KAAK,KAAA,CAAM,IAAI,MAAM,MAAA,EAAW;AACvE,MAAA,OAAA,CAAQ,MAAM,IAAI,CAAA,GAAI,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAUO,SAAS,mBAAA,CACd,YACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,CAAM,EAAA,KAAOA,qBAAA,CAAc,MAAA,EAAQ;AACrC,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,MAAM,MAAA,CAAO,OAAA;AAC/C,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,kBAAA,CAAmB,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACnD;AAQA,SAAS,mBAAA,CAAoB,GAAA,EAAU,IAAA,EAAc,KAAA,EAAsB;AACzE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,GAAA,CAAI,YAAA,CAAa,IAAI,IAAA,EAAM,KAAA,CAAM,IAAI,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACxD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,CAAQ,KAAgC,EAC1D,MAAA,CAAO,CAAC,GAAG,CAAC,MAAM,CAAA,KAAM,MAAA,IAAa,MAAM,IAAI,CAAA,CAC/C,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACf,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oDAAA,EAAuD,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,6CAAA;AAAA,SAClE;AAAA,MACF;AACA,MAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,MAAM,UAAA,EAAY;AACpD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,oBAAoB,OAAO,CAAC,CAAA,4BAAA,EAA+B,IAAI,IAAI,CAAC,CAAA,0BAAA;AAAA,SACtE;AAAA,MACF;AACA,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,IAC1B,CAAC,CAAA;AACH,IAAA,GAAA,CAAI,aAAa,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC1C;AACF;;;ACxIA,UAAA,EAAA;AACA,WAAA,EAAA;AAqBO,SAAS,UAAA,CACd,GAAA,EACA,OAAA,EACA,IAAA,EACsB;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAEvB,IAAA,IAAIQ,UAA+B,EAAE,GAAA,EAAK,SAAS,EAAE,GAAG,SAAQ,EAAE;AAClE,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAAA,UAAS,UAAA,CAAWA,OAAAA,CAAO,GAAA,EAAKA,OAAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,EAAE,GAAA,EAAK,SAAS,EAAE,GAAG,SAAQ,EAAE;AAE9C,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAKP,gBAAA,CAAS,MAAA;AACZ,MAAA,MAAA,CAAO,QAAQE,kBAAA,CAAW,aAAa,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,KAAK,CAAA,CAAA;AAC/D,MAAA;AAAA,IAEF,KAAKF,iBAAS,KAAA,EAAO;AAEnB,MAAA,MAAM,OAAA,GAAU,KAAK,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxD,MAAA,MAAA,CAAO,OAAA,CAAQE,kBAAA,CAAW,aAAa,CAAA,GAAI,SAAS,OAAO,CAAA,CAAA;AAC3D,MAAA;AAAA,IACF;AAAA,IAEA,KAAKF,gBAAA,CAAS,OAAA;AACZ,MAAA,IAAI,IAAA,CAAK,QAAA,KAAaD,qBAAA,CAAc,MAAA,EAAQ;AAC1C,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,MACnC,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,KAAaA,qBAAA,CAAc,KAAA,EAAO;AAChD,QAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,QAAA,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AACxC,QAAA,MAAA,CAAO,GAAA,GAAM,EAAE,QAAA,EAAS;AAAA,MAC1B;AACA,MAAA;AAAA,IAEF,KAAKC,gBAAA,CAAS,MAAA;AACZ,MAAA,MAAA,CAAO,QAAQE,kBAAA,CAAW,aAAa,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,WAAW,CAAA,CAAA;AACrE,MAAA;AAAA,IAEF,KAAKF,iBAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQE,kBAAA,CAAW,MAAM,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AACjF,MAAA,MAAA,CAAO,OAAA,CAAQA,mBAAW,MAAM,CAAA,GAAI,WAAW,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,MAAA;AAC1E,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,OAAO,MAAA;AACT;AAsBA,eAAsB,kBAAA,CACpB,QAAA,EACA,YAAA,EACA,OAAA,EAM4B;AAC5B,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,KAAA,IAAS,UAAA,CAAW,KAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB;AAAA,IAC/B,UAAA,EAAY,eAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GAChB,CAAA;AACD,EAAA,IAAI,SAAS,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,QAAQ,QAAQ,CAAA;AAC7D,EAAA,IAAI,SAAS,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,QAAQ,YAAY,CAAA;AACzE,EAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAEvE,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,EAAU;AAAA,IACvC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,IAC/D,IAAA,EAAM,KAAK,QAAA;AAAS,GACrB,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAMM,KAAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,WAAA,GAAcA,QAAO,CAAA,EAAA,EAAKA,KAAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAAA,IACnD,SAAS,aAAA,EAAe;AACtB,MAAA,WAAA,GAAc,4BAA4B,aAAA,YAAyB,KAAA,GAAQ,cAAc,OAAA,GAAU,MAAA,CAAO,aAAa,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1H;AACA,IAAA,MAAM,IAAIJ,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,IAAA;AAAA,MAChB,OAAA,EAAS,gCAAgC,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,UAAU,GAAG,WAAW,CAAA,CAAA;AAAA,MAC7F,UAAA,EAAY,sEAAA;AAAA,MACZ,SAAA,EAAW,SAAS,MAAA,IAAU,GAAA;AAAA,MAC9B,QAAQ,QAAA,CAAS;AAAA,KAClB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,SAASI,WAAAA,EAAY;AACnB,IAAA,MAAM,IAAIL,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,KAAA;AAAA,MAChB,OAAA,EAAS,CAAA,gCAAA,EAAmC,QAAA,CAAS,MAAM,CAAA,qCAAA,CAAA;AAAA,MAC3D,UAAA,EAAY,2EAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAc,IAAA,CAAK,YAAA;AACzB,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,WAAA,EAAa;AACnD,IAAA,MAAM,IAAID,sBAAA,CAAe;AAAA,MACvB,MAAMC,iBAAA,CAAU,IAAA;AAAA,MAChB,OAAA,EAAS,mFAAmF,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACxH,UAAA,EAAY,uGAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA,EAAc,OAAO,IAAA,CAAK,aAAA,KAAkB,YAAY,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,GAAgB,MAAA;AAAA,IAClG,WAAW,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,GAAW,KAAK,UAAA,GAAa;AAAA,GACrE;AACF;AAQO,SAAS,SAAS,IAAA,EAAoB;AAC3C,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAKL,iBAAS,MAAA,EAAQ;AACpB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG,OAAO,YAAA;AACnC,MAAA,OAAO,UAAU,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,IAC7C;AAAA,IACA,KAAKA,gBAAA,CAAS,KAAA;AACZ,MAAA,OAAO,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,IAAA,CAAA;AAAA,IAC/B,KAAKA,gBAAA,CAAS,OAAA;AACZ,MAAA,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA,KAAA,CAAA;AAAA,IACrB,KAAKA,gBAAA,CAAS,MAAA;AACZ,MAAA,OAAO,CAAA,UAAA,CAAA;AAAA,IACT,KAAKA,gBAAA,CAAS,MAAA;AACZ,MAAA,OAAO,CAAA,OAAA,EAAU,KAAK,IAAI,CAAA,IAAA,CAAA;AAAA;AAEhC;;;AHvLA,WAAA,EAAA;AAWA,IAAM,gBAAA,GAAmB,YAAA;AACzB,IAAM,oBAAA,GAAuB,QAAA;AAC7B,IAAM,YAAA,GAAe,SAAA;AACrB,IAAM,WAAA,GAAc,OAAA;AACpB,IAAM,WAAA,GAAc,MAAA;AACpB,IAAM,UAAA,GAAa,MAAA;AA+CZ,SAAS,aACd,OAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,GAA+B,EAAC,EAClB;AAEd,EAAA,MAAM,UAAU,SAAA,CAAU,UAAA,CACvB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,IAAY,IAAA,CAAK,CAAA,CAAE,IAAI,MAAM,MAAS,CAAA,CACpD,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAClB,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,gBAAA,EAAmB,UAAU,EAAE,CAAA,CAAA;AAAA,KAClH;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,WAAA,EAAY;AAE5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,uBAAuBG,mBAAA,CAAY,IAAA;AAC9E,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,CAACD,kBAAA,CAAW,MAAM,GAAG,MAAA;AAAA,IACrB,GAAG,mBAAA,CAAoB,SAAA,CAAU,UAAA,EAAY,IAAI;AAAA,GACnD;AAGA,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQA,kBAAA,CAAW,MAAM,CAAA,GAAI,YAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,QAAA,GAAW,KAAK,MAAM,CAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,WAAWJ,kBAAA,CAAW,GAAA,IAAO,WAAWA,kBAAA,CAAW,IAAA,IAAQ,WAAWA,kBAAA,CAAW,OAAA;AACpG,EAAA,IAAI,CAAC,QAAA,IAAY,SAAA,CAAU,SAAA,IAAa,UAAA,EAAY;AAClD,IAAA,QAAA,GAAW,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,EACrC,CAAA,MAAA,IAAW,CAAC,QAAA,IAAY,SAAA,CAAU,eAAe,UAAA,EAAY;AAC3D,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,MAAA,CAAO,UAAA;AAC/C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,YAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,QAAA,IAAI,IAAA,CAAK,QAAQ,CAAA,KAAM,MAAA,EAAW;AAChC,UAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA;AAAA,QACrC;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,QAAA,QAAA,GAAW,SAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,EAAa,WAAA,IAAeK,mBAAA,CAAY,IAAA;AAEtE,IAAA,IAAI,WAAA,KAAgBA,oBAAY,eAAA,EAAiB;AAC/C,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,MAAM,MAAM,OAAO,QAAA,KAAa,YAAY,QAAA,KAAa,IAAA,GAAO,WAAsC,EAAC;AACvG,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC/B;AAAA,MACF;AACA,MAAA,IAAA,GAAO,OAAO,QAAA,EAAS;AACvB,MAAA,OAAA,CAAQD,kBAAA,CAAW,YAAY,CAAA,GAAIC,mBAAA,CAAY,eAAA;AAAA,IACjD,CAAA,MAAA,IAAW,WAAA,KAAgBA,mBAAA,CAAY,SAAA,EAAW;AAChD,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,EAAM;AACrD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,wCAAA,EAA2C,SAAA,CAAU,EAAE,CAAA,yBAAA,EAA4B,OAAO,QAAQ,CAAA;AAAA,SACpG;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,MAAM,GAAA,GAAM,QAAA;AACZ,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,QAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,UAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,GAAA;AACtD,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,QACtC,CAAA,MAAA,IAAW,iBAAiB,WAAA,EAAa;AACvC,UAAA,QAAA,CAAS,MAAA,CAAO,KAAK,IAAI,IAAA,CAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;AAAA,QAC7C,CAAA,MAAA,IAAW,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG;AACpC,UAAA,QAAA,CAAS,OAAO,GAAA,EAAK,IAAI,IAAA,CAAK,CAAC,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,EAAuB,KAAA,CAAM,YAAY,KAAA,CAAM,UAAU,CAAC,CAAC,GAAG,GAAG,CAAA;AAAA,QACvH,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACpC;AAAA,MACF;AACA,MAAA,IAAA,GAAO,QAAA;AAAA,IAET,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,IAAA,CAAK,UAAU,QAAQ,CAAA;AACxE,MAAA,OAAA,CAAQD,kBAAA,CAAW,YAAY,CAAA,GAAIC,mBAAA,CAAY,IAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAI,CAAA;AACpD,IAAA,GAAA,GAAM,MAAA,CAAO,GAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK;AACtC;AAMA,eAAe,YAAA,CACb,OAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,EAC4G;AAC5G,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAE5C,EAAA,IAAI,EAAE,QAAQ,GAAA,EAAK,OAAA,EAAS,MAAK,GAAI,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM;AAAA,IAC1E,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAGD,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,SAAkC,OAAA,CAAQ,MAAA;AAC9C,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,GAAY,CAAA,EAAG;AAC9C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,QAAQ,SAAS,CAAA;AAElE,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAElB,MAAA,YAAA,GAAe,MAAM,WAAW,KAAA,EAAM;AACtC,MAAA,OAAA,CAAQ,OAAO,gBAAA,CAAiB,OAAA,EAAS,cAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACvE;AACA,IAAA,MAAA,GAAS,UAAA,CAAW,MAAA;AAAA,EACtB;AAEA,EAAA,IAAI,IAAA,GAAoB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,MAAA,EAAQ,QAAA,EAAU,QAAQ,QAAA,EAAS;AAGpF,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,UAAA,EAAY;AACnC,MAAA,IAAI,GAAG,SAAA,EAAW;AAChB,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,SAAA,CAAU,KAAK,IAAI,CAAA;AAC3C,QAAA,GAAA,GAAM,MAAA,CAAO,GAAA;AACb,QAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAA,EAAI;AAC9B,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,IAAA,IAAI,gBAAgB,OAAA,CAAQ,MAAA,UAAgB,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAE5F,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,UAAA,EAAY;AACnC,QAAA,IAAI,GAAG,OAAA,EAAS;AACd,UAAA,MAAM,UAAA,GAAa,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,UAAA,IAAI;AAAE,YAAA,EAAA,CAAG,QAAQ,UAAU,CAAA;AAAA,UAAE,SAAS,OAAA,EAAS;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAA,yBAAA,EAA4B,EAAA,CAAG,IAAA,IAAQ,SAAS,yCAAyC,OAAO,CAAA;AAAA,UAC/G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB;AACpE,MAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,GAAY,CAAA,EAAG;AAC9C,QAAA,MAAM,aAAa,GAAG,CAAA;AAAA,MACxB;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAG9B,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,cAAc,CAAA;AACvD,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,oBAAA,EAAsB,MAAM,UAAU,GAAG,CAAA;AAAA,QAC9D,SAAS,UAAA,EAAY;AAEnB,UAAA,IAAI,UAAA,YAAsB,KAAA,IAAS,UAAA,CAAW,IAAA,KAASG,+BAAuB,MAAM,UAAA;AAAA,QACtF;AAAA,MACF;AACA,MAAA,MAAM,aAAa,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,aAAa,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,EAAA,IAAI,gBAAgB,OAAA,CAAQ,MAAA,UAAgB,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAC5F,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,KAAK,CAAA;AAGtD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,UAAA,EAAY;AACnC,MAAA,IAAI,GAAG,UAAA,EAAY;AACjB,QAAA,QAAA,GAAW,MAAM,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,kBAA0C,EAAC;AACjD,EAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,IAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,EACzB,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK,EAAG,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU;AAClG;AAaA,eAAsB,iBACpB,OAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACD;AAC1B,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU,GAAI,MAAM,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,OAAO,CAAA;AACvH,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,MAAK,GAAI,OAAA;AAIvC,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,cAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAIJ,kBAAA,CAAW,YAAY,CAAA,IAAK,EAAA;AACrE,EAAA,IAAI,WAAA,CAAY,SAASC,mBAAA,CAAY,IAAI,KAAK,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/E,IAAA,MAAM,MAAA,GAAS,SAAS,KAAA,EAAM;AAC9B,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,SAAA,EAAW;AAClB,MAAA,IAAI,OAAA,CAAQ,gBAAA,KAAqB,KAAA,EAAO,MAAM,WAAW,GAAG,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAA,CAAK,yDAAyD,SAAS,CAAA;AAC/E,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,OAAO,IAAA,EAAK;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAEN,QAAA,MAAM,WAAW,GAAG,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,mBAAA,CAAoB,WAAW,CAAA,EAAG;AAC3C,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,WAAA,EAAY;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,MAAA,IAAW,YAAY,QAAA,CAAS,WAAW,KAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AAChF,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,IAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,IACT,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAS,IAAA,EAAK;AAAA,IACtC;AAAA,GACF;AAGA,EAAA,IAAI,OAAA,CAAQ,qBAAqB,KAAA,EAAO;AACtC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,MAAM,SAAA,CAAU,GAAA,EAAK,QAAA,CAAS,MAAA,EAAqB,IAAI,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,UAAU,GAAA,EAAK,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,YAAY,IAAI,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,EAAA,EAAI;AAEvB,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,MAAA,CAAO,YAAYE,iBAAA,CAAU,IAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,MAAA,MAAA,CAAO,YAAYA,iBAAA,CAAU,UAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,YAAYA,iBAAA,CAAU,IAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWA,eAAsB,UAAA,CACpB,GAAA,EACA,OAAA,GAWI,EAAC,EACqB;AAE1B,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,EAAA;AAAA,IACN,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAUP,kBAAA,CAAW,GAAA;AAAA,IACrC,YAAY,EAAC;AAAA,IACb,MAAM;AAAC,GACT;AAEA,EAAA,OAAO,iBAAiB,GAAA,EAAK,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAK,EAAG;AAAA,IAC9D,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH;AAaA,eAAsB,uBACpB,OAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,GAAoE,EAAC,EAClC;AAEnC,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,SAAA,CAAU,uBAAuBK,mBAAA,CAAY;AAAA,GACzE;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU,GAAI,MAAM,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,aAAa,CAAA;AAG7H,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI;AAAE,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAAE,CAAA,CAAA,MAAQ;AAAE,QAAA,IAAA,GAAO,IAAA;AAAA,MAAK;AAAA,IACtD,SAAS,SAAA,EAAW;AAClB,MAAA,IAAA,GAAO,oDAAoD,SAAA,YAAqB,KAAA,GAAQ,UAAU,OAAA,GAAU,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/H;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,MAAM,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,QAAA,CAAS,QAAqB,IAAI,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,EAAK,SAAS,MAAA,EAAQ,QAAA,CAAS,YAAY,IAAI,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,IAAA,MAAM,UAAA,CAAW,OAAA,CAAQ,GAAA,EAAK,6BAA6B,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,cAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAID,kBAAA,CAAW,YAAY,CAAA,IAAK,EAAA;AAGrE,EAAA,IAAI,WAAA,IAAe,CAAC,WAAA,CAAY,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAC7D,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8DAAA,EAAiE,WAAW,CAAA,mDAAA,CAAgD,CAAA;AAAA,EAC3I;AAGA,EAAA,IAAI,MAAA,GAAkC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAC5D,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAA;AACd,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,MAAA,GAAA,CAAU,mBAAmB;AAC3B,MAAA,WAAA,MAAiB,SAAS,KAAA,EAAO;AAC/B,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf,SAAS,aAAA,EAAe;AACtB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,kCAAA,EAAqC,KAAA,CAAM,KAAA,IAAS,SAAS,CAAA,GAAA,EAAM,aAAA,YAAyB,KAAA,GAAQ,aAAA,CAAc,OAAA,GAAU,MAAA,CAAO,aAAa,CAAC,CAAA,CAAA;AAAA,YACjJ,EAAE,OAAO,aAAA;AAAc,WACzB;AAAA,QACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,GAAG;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,MAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,IACT,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAWA,eAAsB,gBAAA,CACpB,GAAA,EACA,OAAA,GAYI,EAAC,EAC8B;AACnC,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,EAAA;AAAA,IACN,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAUJ,kBAAA,CAAW,IAAA;AAAA,IACrC,YAAY,EAAC;AAAA,IACb,MAAM;AAAC,GACT;AAEA,EAAA,OAAO,uBAAuB,GAAA,EAAK,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAK,EAAG;AAAA,IACpE,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACH;AAEA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,0BAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,oBAAoB,WAAA,EAA8B;AACzD,EAAA,OAAO,wBAAwB,IAAA,CAAK,CAAA,CAAA,KAAK,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAClE;;;AIljBA,UAAA,EAAA;;;ACAO,SAAS,sBAAA,CAAuB,KAAyB,OAAA,EAA0B;AACxF,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,GAAU,CAAC,CAAA;AAC9B,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,IAAI,MAAM,MAAA,CAAO,GAAA;AAGjB,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAO,CAAC,CAAA;AACnD,MAAA,IAAI,KAAA,KAAU,QAAW,OAAO,EAAA;AAChC,MAAA,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,IAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AACrC,MAAA,OAAO,SAAS,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,uBAAuB,GAAA,EAAiC;AACtE,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,GAAU,CAAC,CAAA,IAAK,OAAA;AACnC,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,EAAA;AACjC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,IAAI,GAAG,QAAQ,CAAA,CAAA;AACvC;;;ACjDA,UAAA,EAAA;AAUO,SAAS,mBACd,OAAA,EACc;AACd,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eAAA,CACP,MACA,MAAA,EACY;AACZ,EAAA,MAAM,eAAA,GAAkB,OAAO,WAAA,IAAe,IAAA;AAG9C,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,YAAA,GAAe,MAAA;AACrB,IAAA,IAAI,YAAA,CAAa,EAAA,KAAOC,qBAAA,CAAc,MAAA,EAAQ;AAC5C,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAUC,gBAAA,CAAS,OAAA,EAAS,QAAA,EAAU,EAAE,UAAA,EAAY,YAAA,CAAa,IAAA,EAAK,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,IACvH;AACA,IAAA,IAAI,YAAA,CAAa,EAAA,KAAOD,qBAAA,CAAc,KAAA,EAAO;AAC3C,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAUC,gBAAA,CAAS,WAAA,EAAa,QAAA,EAAU,EAAE,SAAA,EAAW,YAAA,CAAa,IAAA,EAAK,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,IAC1H;AACA,IAAA,IAAI,YAAA,CAAa,EAAA,KAAOD,qBAAA,CAAc,MAAA,EAAQ;AAC5C,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAUC,gBAAA,CAAS,MAAA,EAAQ,QAAA,EAAU,EAAE,UAAA,EAAY,YAAA,CAAa,IAAA,EAAK,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,IACtH;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA,0BAAA,EAA6B,YAAA,CAAa,EAAE,CAAA,EAAA,CAAA,EAAK;AAAA,EAC/H;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,UAAA,GAAa,MAAA;AACnB,IAAA,IAAI,UAAA,CAAW,MAAA,KAAWA,gBAAA,CAAS,MAAA,EAAQ;AACzC,MAAA,OAAO,EAAE,MAAM,QAAA,EAAUA,gBAAA,CAAS,QAAQ,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,IACvF;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAWA,gBAAA,CAAS,KAAA,EAAO;AACxC,MAAA,OAAO,EAAE,MAAM,QAAA,EAAUA,gBAAA,CAAS,OAAO,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,IACtF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA,4BAAA,EAA+B,UAAA,CAAW,MAAM,CAAA,EAAA,CAAA,EAAK;AAAA,EACnI;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,OAAO,EAAE,MAAM,QAAA,EAAUA,gBAAA,CAAS,OAAO,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA,EACtF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,WAAmC,EAAC;AAG1C,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,iBAAA,IACrB,MAAA,CAAO,KAAA,CAAM,iBAAA,IACb,MAAA,CAAO,KAAA,CAAM,QAAA,IACb,MAAA,CAAO,KAAA,CAAM,QAAA;AAClB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,IAAI,sBAAsB,IAAA,IAAQ,IAAA,CAAK,gBAAA,EAAkB,QAAA,CAAS,mBAAmB,IAAA,CAAK,gBAAA;AAC1F,QAAA,IAAI,cAAc,IAAA,IAAQ,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,WAAW,IAAA,CAAK,QAAA;AAClE,QAAA,IAAI,IAAA,CAAK,UAAA,EAAY,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,UAAA;AAChD,QAAA,IAAI,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AACtD,UAAA,QAAA,CAAS,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,IAAI,OAAO,MAAA,CAAO,gBAAA,KAAqB,QAAA,EAAU,QAAA,CAAS,mBAAmB,MAAA,CAAO,gBAAA;AACpF,MAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU,QAAA,CAAS,WAAW,MAAA,CAAO,QAAA;AACpE,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,MAAA,IAAI,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,QAAA,QAAA,CAAS,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,GAChB,eAAA,GACA,CAAA,EAAG,eAAe,CAAA,8CAAA,CAAA;AACtB,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAUA,gBAAA,CAAS,MAAA,EAAQ,UAAU,WAAA,EAAY;AAAA,EAClE;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,eAAA,EAAiB;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA,8BAAA,CAAA,EAAiC;AAAA,EAC/G;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA,mCAAA,CAAA,EAAsC;AACpH;;;AFzFA,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,SAAS,CAAA;AAW9E,SAAS,aAAA,CAAc,IAAA,EAAe,QAAA,GAAW,QAAA,EAAkB;AACxE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAc,MAAM,MAAM,CAAA;AACvD,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,QAAA;AAAA,EACvB;AACA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,OAAO,QAAA;AACT;AAYA,eAAsB,gBAAA,CACpB,iBACA,OAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAMU,8BAAA,CAAc,WAAA,CAAY,eAAyB,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAA,GAAS,MAAMA,8BAAA,CAAc,KAAA,CAAM,eAAyB,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,GAAA,GAAM,MAAA;AAEZ,IAAA,MAAM,aAAa,SAAA,IAAa,GAAA;AAChC,IAAA,MAAM,WAAA,GAAc,UAAA,GACf,GAAA,CAA2B,OAAA,GAC3B,GAAA,CAA2B,OAAA;AAEhC,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA;AAEzB,IAAA,MAAM,YAAY,OAAA,EAAS,OAAA,KAAY,OAAO,eAAA,KAAoB,WAAW,eAAA,GAAkB,KAAA,CAAA,CAAA;AAE/F,IAAA,IAAI,UAAU,UAAA,GACV,sBAAA,CAAuB,KAA2B,SAAS,CAAA,GAC3D,uBAAuB,GAAyB,CAAA;AAGpD,IAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AACzB,MAAA,OAAA,GAAU,cAAc,SAAS,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,UAAU,CAAA;AAKpD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,OAAO,EAAE,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC5D,QAAA,IAAI,QAAA,IAAY,aAAa,GAAA,EAAK;AAChC,UAAA,MAAM,UAAA,GAAa,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,KAAA;AAAA,YACrD,CAAA,EAAA,KAAM,GAAG,IAAA,KAAS,QAAA,IAAY,GAAG,IAAA,CAAK,UAAA,CAAW,WAAW,GAAG;AAAA,WACjE;AACA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,cAAA,EAAA,CAAG,OAAO,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,GAAA;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAgC;AAAA,IAC1C;AAEA,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,EAAK,UAAU,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,EAAY,UAAA,GAAaT,kBAAA,CAAW,SAAA,GAAYA,kBAAA,CAAW,SAAA;AAAA,MAC3D,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,MAAM,UAAU,OAAO,eAAA,KAAoB,QAAA,GAAW,CAAA,MAAA,EAAS,eAAe,CAAA,CAAA,GAAK,EAAA;AACnF,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EACxF;AACF;AAEA,SAAS,iBAAA,CACP,KACA,UAAA,EACa;AACb,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,OAAO,UAAA;AAEvB,EAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACxD,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,kBAAkB,YAAA,IAAgB,QAAA,GAAW,SAAS,UAAA,IAAc,KAAK,EAAC;AAEhF,IAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,MAAA,IAAI,EAAE,MAAA,IAAU,QAAA,CAAA,IAAa,CAAE,QAAA,CAAqC,MAAM,CAAA,EAAG;AAE7E,MAAA,MAAM,EAAA,GAAM,SAAqC,MAAM,CAAA;AACvD,MAAA,MAAM,eAAA,GAAkB,EAAA,CAAG,UAAA,IAAc,EAAC;AAC1C,MAAA,MAAM,YAAY,CAAC,GAAG,eAAA,EAAiB,GAAG,eAAe,CAAA,CAAE,MAAA;AAAA,QACzD,CAAC,CAAA,KAAO,CAAA,CAAqB,EAAA,KAAO;AAAA;AAAA,OACtC;AAEA,MAAA,MAAM,aAAa,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,KAAA,KAChC,cAAA,CAAe,KAAA,EAA0D,UAAU;AAAA,OACrF;AAEA,MAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,EAAA,EAAI,UAAU,CAAA;AACrD,MAAA,MAAM,EAAE,SAAS,cAAA,EAAgB,GAAA,EAAK,iBAAgB,GAAI,sBAAA,CAAuB,IAAI,UAAU,CAAA;AAC/F,MAAA,MAAM,mBAAA,GAAsB,0BAAA,CAA2B,EAAA,EAAI,UAAU,CAAA;AACrE,MAAA,MAAM,UAAA,GAAa,kBAAkB,EAAE,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,EAAA,EAAI,GAAG,CAAA;AAGjD,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,IACT,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAAE,QAAQ,QAAA,EAAU,EAAE,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAExF,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,EAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,QAC3B,SAAS,EAAA,CAAG,OAAA;AAAA,QACZ,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,UAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,iBAAiB,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA,GAAS,IAAI,eAAA,GAAkB,MAAA;AAAA,QAC7E,mBAAA;AAAA,QACA,UAAA;AAAA,QACA,IAAA,EAAM,EAAA,CAAG,IAAA,IAAQ,EAAC;AAAA,QAClB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBAAA,CACP,IACA,GAAA,EACwB;AAExB,EAAA,IAAI,UAAA,IAAc,EAAA,IAAM,EAAA,CAAG,QAAA,KAAa,MAAA,EAAW;AACjD,IAAA,OAAQ,GAAG,QAAA,CAAwC,GAAA,CAAI,SAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,UAAA,IAAc,GAAA,IAAO,GAAA,CAAI,QAAA,KAAa,MAAA,EAAW;AACnD,IAAA,OAAQ,IAAI,QAAA,CAAwC,GAAA,CAAI,SAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CACP,OACA,UAAA,EACW;AACX,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,WAAW,KAAA,CAAM,EAAA;AACvB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,QAAA,KAAaF,qBAAA,CAAc,IAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,EAAA;AAEzC,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,MAAA,GAAS;AAAA,MACP,IAAA,EAAM,aAAA,CAAc,CAAA,EAAG,IAAI,CAAA;AAAA,MAC3B,QAAQ,CAAA,EAAG,MAAA;AAAA,MACX,MAAM,CAAA,EAAG,IAAA;AAAA,MACT,SAAS,CAAA,EAAG,OAAA;AAAA,MACZ,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,CAAA,EAAG,OAAA;AAAA,MACzB,SAAS,CAAA,EAAG,OAAA;AAAA,MACZ,SAAS,CAAA,EAAG,OAAA;AAAA,MACZ,WAAW,CAAA,EAAG;AAAA;AAAA,KAEhB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAA,GAAS;AAAA,MACP,IAAA,EAAA,CAAO,MAAA,IAAU,CAAA,GAAI,CAAA,CAAE,OAAO,MAAA,KAAc,QAAA;AAAA,MAC5C,MAAA,EAAQ,QAAA,IAAY,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,MAAA;AAAA,MACnC,IAAA,EAAM,MAAA,IAAU,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,MAAA;AAAA,MAC7B,OAAA,EAAS,SAAA,IAAa,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,MAAA;AAAA,MACtC,OAAA,EAAS,WAAA,IAAe,CAAA,GAAK,CAAA,CAA8B,WAAW,CAAA,GAAI,MAAA;AAAA,MAC1E,OAAA,EAAS,SAAA,IAAa,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,MAAA;AAAA,MACtC,OAAA,EAAS,SAAA,IAAa,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,MAAA;AAAA,MACtC,SAAA,EAAW,WAAA,IAAe,CAAA,GAAI,CAAA,CAAE,SAAA,GAAY;AAAA;AAAA,KAE9C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,QAAA,EAAU,aAAa,MAAA,EAAO;AAC7D;AAGA,IAAM,qBAAA,GAAwB;AAAA,EAC5BI,mBAAA,CAAY,IAAA;AAAA,EACZA,mBAAA,CAAY,eAAA;AAAA,EACZA,mBAAA,CAAY,SAAA;AAAA,EACZA,mBAAA,CAAY,GAAA;AAAA,EACZA,mBAAA,CAAY,IAAA;AAAA,EACZA,mBAAA,CAAY;AACd,CAAA;AAEA,SAAS,kBAAA,CACP,WACA,UAAA,EACyB;AACzB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,EAAA,GAAK,SAAA;AACX,IAAA,IAAI,CAAC,EAAA,CAAG,WAAA,EAAa,OAAO,MAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,CAAG,WAAA;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAG1B,IAAA,KAAA,MAAW,MAAM,qBAAA,EAAuB;AACtC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AACjC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,UAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAA,EAAa,EAAA;AAAA,UACb,MAAA,EAAQ,aAAA,CAAc,SAAA,CAAU,MAAgC;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,EAAE,CAAC,CAAA;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACvC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,UAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAA,EAAa,QAAA;AAAA,UACb,MAAA,EAAQ,aAAA,CAAc,SAAA,CAAU,MAAgC;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,EAAA,GAAK,SAAA;AACX,IAAA,MAAM,SAAA,GAAY,GAAG,UAAA,EAAY,IAAA;AAAA,MAC/B,CAAC,CAAA,KAAgB,CAAA,CAAqB,EAAA,KAAO;AAAA,KAC/C;AACA,IAAA,IAAI,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAO,MAAA;AAG/B,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,IAAY,EAAC;AACjC,IAAA,IAAI,cAAsBA,mBAAA,CAAY,IAAA;AACtC,IAAA,IAAI,QAAA,CAAS,QAAA,CAASA,mBAAA,CAAY,eAAe,CAAA,EAAG;AAClD,MAAA,WAAA,GAAcA,mBAAA,CAAY,eAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAASA,mBAAA,CAAY,SAAS,CAAA,EAAG;AACnD,MAAA,WAAA,GAAcA,mBAAA,CAAY,SAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,WAAA,GAAc,SAAS,CAAC,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,UAAU,QAAA,IAAY,KAAA;AAAA,MAChC,aAAa,SAAA,CAAU,WAAA;AAAA,MACvB,WAAA;AAAA,MACA,MAAA,EAAQ,aAAA,CAAc,SAAA,CAAU,MAA2C;AAAA,KAC7E;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAA,EAAmD;AACxE,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAC1D,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,IAAA,EAAM,cAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,IAAI,cAAA,KAAmB,QAAA,IAAY,MAAA,CAAO,UAAA,EAAY;AACpD,IAAA,MAAA,CAAO,aAAa,EAAC;AACrB,IAAA,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA;AAEzB,IAAA,KAAA,MAAW,CAAC,MAAM,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAClE,MAAA,MAAM,IAAA,GAAO,UAAA;AACb,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,OAAA;AACvD,MAAA,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,GAAI;AAAA,QACxB,IAAA,EAAM,QAAA;AAAA,QACN,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,QAAA,IAAY;AAAA,OACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,IAAM,wBAAwB,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,SAAS,CAAA;AAE3E,SAAS,sBAAA,CACP,WACA,UAAA,EACoD;AACpD,EAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,EAAA,IAAI,CAAC,WAAW,OAAO,EAAE,SAAS,MAAA,EAAW,GAAA,EAAK,EAAC,EAAE;AAErD,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,QAAQ,qBAAA,EAAuB;AACxC,IAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,GAAU,IAAA,CAAkC,OAAA,GAAUA,mBAAA,CAAY,IAAI,CAAA,EAAG,MAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,MAAA,GAAU,IAAA,CAAkC,MAAA;AAAA,IAC9C;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA;AAAA,IACd;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAK,CAAA,IAAK,GAAA,CAAI,KAAK,CAAA,IAAK,GAAA,CAAI,KAAK,CAAA,IAAK,GAAA,CAAI,KAAK,CAAA;AACnE,EAAA,OAAO,EAAE,SAAS,GAAA,EAAI;AACxB;AAGA,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAGlF,SAAS,kBACP,SAAA,EACoC;AACpC,EAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,IAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACxB,IAAA,KAAA,CAAM,IAAI,IAAI,IAAA,CAAK,WAAA;AAAA,EACrB;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AACjD;AAEA,SAAS,0BAAA,CACP,WACA,UAAA,EACoB;AAEpB,EAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAK,CAAA,IAC1E,SAAA,CAAU,KAAK,CAAA;AACpB,EAAA,IAAI,CAAC,iBAAiB,OAAO,MAAA;AAE7B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAA,GAAO,eAAA;AACb,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAI,MAAM,QAAA,CAASA,mBAAA,CAAY,IAAI,CAAA,SAAUA,mBAAA,CAAY,IAAA;AACzD,IAAA,OAAO,MAAM,CAAC,CAAA;AAAA,EAChB,CAAA,MAAO;AAEL,IAAA,MAAM,EAAA,GAAK,SAAA;AACX,IAAA,MAAM,WAAW,EAAA,CAAG,QAAA;AACpB,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,IAAI,SAAS,QAAA,CAASA,mBAAA,CAAY,IAAI,CAAA,SAAUA,mBAAA,CAAY,IAAA;AAC5D,MAAA,OAAO,SAAS,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,sBAAA,CACP,KACA,UAAA,EACA;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,eAAA,IAAmB,EAAC;AAC5D,IAAA,MAAM,UAA0D,EAAC;AACjE,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvD,MAAA,IAAI,MAAA,IAAU,EAAE,MAAA,IAAU,MAAA,CAAA,EAAS;AACjC,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,OAAO,kBAAA,CAAmB,QAAA,CAAS,mBAAA,IAAuB,EAAE,CAAA;AAAA,EAC9D;AACF;;;AGnbA,UAAA,EAAA;AAyBO,SAAS,YAAY,GAAA,EAAwB;AAClD,EAAA,OAAO,YAAA,CAAa,CAAC,EAAE,GAAA,EAAK,CAAC,CAAA;AAC/B;AAYO,SAAS,aAAa,SAAA,EAAqC;AAChE,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI;AACF,IAAA,WAAA,GAAc,IAAI,GAAA,CAAI,SAAA,CAAU,CAAC,EAAE,GAAG,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,UAAU,CAAC,CAAA,CAAE,GAAG,CAAA,gEAAA,CAAkE,CAAA;AAAA,EACpH;AACA,EAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAE5B,EAAA,MAAM,UAAA,GAA0B,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO;AACpD,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAI,GAAA,CAAI,EAAA,CAAG,GAAG,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,EAAA,CAAG,GAAG,CAAA,gEAAA,CAAkE,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,+CAAA,EAAkD,MAAA,CAAO,MAAM,CAAA,gBAAA,EAAmB,YAAY,MAAM,CAAA,CAAA;AAAA,OACtG;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAA,CAAU,EAAA,CAAG,MAAA,IAAUL,kBAAA,CAAW,KAAK,WAAA,EAAY;AACzD,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,IAAA,MAAM,aAA0B,EAAC;AAGjC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAsD;AAC1E,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,YAAA,CAAa,SAAQ,EAAG;AAC3D,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC1C,MAAA,MAAM,YAAY,IAAA,KAAS,MAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAC1B,QAAA,QAAA,CAAS,SAAA,GAAY,SAAS,SAAA,IAAa,SAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG,WAAW,CAAA;AAAA,MAClD;AAAA,IACF;AAIA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,QAAQ,SAAA,EAAW,KAAK,OAAA,EAAS;AACnD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,SAAA;AACrC,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA;AAAA,QACA,IAAIC,qBAAA,CAAc,KAAA;AAAA,QAClB,QAAA,EAAU,KAAA;AAAA,QACV,WAAA,EAAa,OAAA,GACT,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA,GAClC,CAAA,SAAA,EAAY,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,QACzB,QAAQ,OAAA,GACJ,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,QAAQ,KAAA,EAAO,EAAE,MAAM,QAAA,EAAS,KAC1D,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAA,CAAO,CAAC,CAAA;AAAE,OAC1C,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAK,EAAA,CAAG,EAAA,IACT,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAE,QAAQ,OAAA,EAAS,GAAG,KAAK,MAAM,CAAA,CAAA;AAE3F,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,MAAA;AAAA,MACA,OAAA,EAAS,GAAG,OAAA,IAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA;AAAA,MAC9D,UAAA;AAAA,MACA,MAAM;AAAC,KACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAO,WAAA,CAAY,QAAA;AAAA,IACnB,OAAA,EAAS,OAAA;AAAA,IACT,OAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,EAAC;AAAA,IACd,YAAYE,kBAAA,CAAW;AAAA,GACzB;AACF;;;ACtHO,SAAS,UAAU,GAAA,EAAsB;AAC9C,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,EAAA,OACE,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,IAC9B,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,IAC9B,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,IAC7B,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,IAC9B,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,IAC9B,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,IAC7B,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,IAC3B,MAAM,QAAA,CAAS,YAAY,CAAA,IAC3B,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,IAC1B,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,IAC1B,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,IAC/B,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,IAC/B,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,IAC7B,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,IAC7B,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IACxB,KAAA,CAAM,SAAS,SAAS,CAAA;AAE5B;AASO,SAAS,cAAc,IAAA,EAAgD;AAC5E,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAA;AACrE,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,OAAO,IAAI,OAAA,KAAY,QAAA;AACnE;AASO,SAAS,aAAa,GAAA,EAAsB;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,0BAA0B,IAAA,CAAK,IAAI,GAAA,CAAI,GAAG,EAAE,QAAQ,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC/CA,SAAS,uBAAuB,GAAA,EAAuC;AACrE,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,MAAA,EAAW,OAAO,IAAA;AACvC,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,IAAA,IAAQ,UAAA,IAAe,GAAA,CAAI,IAAA,EAAiB,OAAO,IAAA;AACpG,EAAA,OAAO,KAAA;AACT;AAaO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAElB,GAAA;AAAA,EACD,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,WAAA,CAAY,GAAA,EAAgB,OAAA,GAAyB,EAAC,EAAG;AACvD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,EAAC;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,GAAA,CAAI,OAAA;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,UAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,GAAA,CAAI,UAAA;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,WAAA,GAA4B;AAC9B,IAAA,OAAO,KAAK,GAAA,CAAI,WAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,IAAA,EAA2B;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,WAAA,EAA4C;AACxD,IAAA,OAAO,IAAA,CAAK,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,WAAW,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,OAAA,CACJ,WAAA,EACA,IAAA,GAAgC,IAChC,OAAA,EAC0B;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,CAAA,wBAAA,EAA2B,KAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvH;AAEA,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,WAAW,IAAA,EAAM;AAAA,MACzD,IAAA,EAAM,OAAA,EAAS,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,MAC5B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,kBAAkB,OAAA,EAAS,gBAAA;AAAA,MAC3B,UAAU,OAAA,EAAS;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,aAAA,CACJ,WAAA,EACA,IAAA,GAAgC,IAChC,OAAA,EACmC;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,CAAA,wBAAA,EAA2B,KAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvH;AAEA,IAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,WAAW,IAAA,EAAM;AAAA,MAC/D,IAAA,EAAM,OAAA,EAAS,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,MAC5B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,SAAS,OAAA,EAAS;AAAA,KACnB,CAAA;AAAA,EACH;AAEF;AAgCA,eAAsB,YAAA,CACpB,KAAA,EACA,OAAA,GAAyB,EAAC,EACA;AAC1B,EAAA,IAAI,GAAA;AAEJ,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,MAAA,GAAA,GAAM,MAAM,iBAAA,CAAkB,KAAA,EAAO,OAAO,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,YAAA,CAAa,KAAK,CAAA,EAAG;AAC9B,MAAA,MAAM,EAAE,kBAAA,EAAAU,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrC,MAAA,GAAA,GAAM,MAAMA,oBAAmB,KAAA,EAAO,EAAE,UAAU,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAAA,IACjF,CAAA,MAAO;AAEL,MAAA,GAAA,GAAM,MAAM,mBAAA,CAAoB,KAAA,EAAO,OAAO,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,EAAE,kBAAA,EAAAA,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrC,MAAA,GAAA,GAAM,MAAMA,mBAAAA,CAAmB,KAAA,EAAO,EAAE,QAAA,EAAU,QAAQ,OAAA,EAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAAA,IAC3F,CAAA,MAAO;AAEL,MAAA,GAAA,GAAM,MAAM,gBAAA,CAAiB,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAC9B;AAEA,eAAe,iBAAA,CAAkB,KAAa,OAAA,EAA4C;AACxF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EACnF;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,EAAE,OAAA,EAAS,KAAK,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,gBAAA,CAAiB,UAAA,EAAY,EAAE,OAAA,EAAS,KAAK,CAAA;AACtD;AAOA,eAAe,mBAAA,CAAoB,KAAa,OAAA,EAA4C;AAC1F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAE5C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,QAAQ,GAAG,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,iBAAiB,SAAA,IAAc,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,SAAS,YAAA,EAAe;AAChG,MAAA,OAAO,YAAY,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,OAAO,YAAY,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,YAAY,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,YAAY,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,IAAA,OAAO,YAAY,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AAEtB,IAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,EAAE,OAAA,EAAS,KAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,EAAE,kBAAA,EAAAA,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrC,IAAA,OAAOA,mBAAAA,CAAmB,KAAK,EAAE,QAAA,EAAU,KAAK,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,EACxE;AAEA,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEA,eAAe,QAAA,CAAS,KAAgB,OAAA,EAAkD;AACxF,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,QAAA,CAAS,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,IAAI,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AACzC;;;AC1RA,UAAA,EAAA;AAUA,WAAA,EAAA;;;AC/BA,UAAA,EAAA;AAGO,IAAM,cAAA,GAAiB;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM;AACR;AA8BO,SAAS,OAAO,MAAA,EAAsC;AAC3D,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,cAAA,CAAe,MAAA;AAClB,MAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,IAAA,EAAMX,iBAAS,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,MAAA;AAAA,IACzE,KAAK,cAAA,CAAe,MAAA;AAClB,MAAA,OAAO,OAAO,UAAA,IAAc,MAAA,CAAO,WAAA,GAC/B,EAAE,MAAMA,gBAAA,CAAS,OAAA,EAAS,QAAA,EAAUD,qBAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,CAAO,YAAY,KAAA,EAAO,MAAA,CAAO,aAAY,GAC7G,MAAA;AAAA,IACN,KAAK,cAAA,CAAe,OAAA;AAClB,MAAA,OAAO,OAAO,SAAA,IAAa,MAAA,CAAO,UAAA,GAC9B,EAAE,MAAMC,gBAAA,CAAS,OAAA,EAAS,QAAA,EAAUD,qBAAA,CAAc,OAAO,IAAA,EAAM,MAAA,CAAO,WAAW,KAAA,EAAO,MAAA,CAAO,YAAW,GAC1G,MAAA;AAAA,IACN,KAAK,cAAA,CAAe,IAAA;AAClB,MAAA,OAAO,MAAA;AAAA;AAEb;;;ACpCA,IAAM,6BAA6B,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAM3D,SAAS,gBAAgB,KAAA,EAAmC;AAE1D,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,WAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,OAAA,GAAU,GAAA;AAAA,EACnB;AAGA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI;AAChC,IAAA,OAAO,OAAA,GAAU,IAAI,OAAA,GAAU,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAA,CACP,OAAA,EACA,cAAA,EACA,UAAA,EACA,YACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,YAAY,OAAO,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AACxC,EAAA,MAAM,eAAe,MAAA,GAAS,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AACtD;AAyBO,SAAS,SAAA,CACd,OAAA,GAAwB,EAAC,EACzB,SAAA,EACyB;AACzB,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,CAAA;AAAA,IACb,cAAA,GAAiB,GAAA;AAAA,IACjB,UAAA,GAAa,GAAA;AAAA,IACb,UAAA,GAAa,CAAA;AAAA,IACb,MAAA,GAAS,GAAA;AAAA,IACT,iBAAA,GAAoB,0BAAA;AAAA,IACpB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,aAAa,UAAA,CAAW,KAAA;AAExC,EAAA,OAAO,eAAe,UAAA,CACpB,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1C,QAAA,IAAI,kBAAkB,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IAAK,UAAU,UAAA,EAAY;AACvE,UAAA,YAAA,GAAe,QAAA;AAGf,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,UAAA,IAAI,OAAA;AAEJ,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,YAAA,OAAA,GAAU,MAAA,KAAW,KAAA,CAAA,GACjB,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA,GAC3B,cAAA,CAAe,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,UAAA,EAAY,MAAM,CAAA;AAAA,UAC5E,CAAA,MAAO;AACL,YAAA,OAAA,GAAU,cAAA,CAAe,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,YAAY,MAAM,CAAA;AAAA,UAClF;AAEA,UAAA,OAAA,GAAU,OAAA,GAAU,CAAA,EAAG,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAC/C,UAAA,MAAM,MAAM,OAAO,CAAA;AACnB,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,MAAM,UAAU,cAAA,CAAe,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,YAAY,MAAM,CAAA;AACtF,UAAA,OAAA,GAAU,OAAA,GAAU,GAAG,OAAO,CAAA;AAC9B,UAAA,MAAM,MAAM,OAAO,CAAA;AACnB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,cAAc,OAAO,YAAA;AACzB,IAAA,MAAM,SAAA;AAAA,EACR,CAAA;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;;;ACpIA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAC9C;AAEA,SAAS,mBAAmB,GAAA,EAAsB;AAChD,EAAA,OAAO,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAC/D;AA2BO,SAAS,SAAA,CAAU,OAAA,GAA4B,EAAC,EAAe;AACpE,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,cAAA;AACnC,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,kBAAA;AAE3C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,CAAU,KAAK,IAAA,EAAM;AACnB,MAAA,IAAI,WAAA,CAAY,GAAG,CAAA,EAAG;AACpB,QAAA,OAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAG,GAAG,IAAA,EAAK;AAAA,MACnC;AACA,MAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AAAA,IACrB;AAAA,GACF;AACF;;;AC7DA,UAAA,EAAA;AAeA,IAAM,yBAAA,GAA4B,CAAC,eAAA,EAAiB,WAAA,EAAa,QAAQ,CAAA;AACzE,IAAM,2BAA2B,CAAC,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,SAAS,cAAc,CAAA;AAKrF,SAAS,eAAA,CAAgB,MAAc,KAAA,EAAuB;AAC5D,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,EAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,KAAK,CAAC,CAAA,IAAA,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,OAAA,CAAQ,KAAa,eAAA,EAAmC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,QAAA,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AACpC,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAAA,IACF;AACA,IAAA,OAAO,MAAA,GAAS,MAAA,CAAO,QAAA,EAAS,GAAI,GAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CACP,MACA,gBAAA,EACoC;AACpC,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAEvE,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC9B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,GAC5C,eAAA,CAAgB,GAAA,EAAK,KAAK,CAAA,GAC1B,KAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,GAC5C,eAAA,CAAgB,GAAA,EAAK,KAAK,CAAA,GAC1B,KAAA;AAAA,IACN;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,GAC5C,eAAA,CAAgB,GAAA,EAAK,KAAK,CAAA,GAC1B,KAAA;AAAA,IACN;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AAwBO,SAAS,OAAA,CAAQ,OAAA,GAA0B,EAAC,EAAe;AAChE,EAAA,MAAM;AAAA,IACJ,MAAM,OAAA,CAAQ,GAAA;AAAA,IACd,OAAA,GAAU,KAAA;AAAA,IACV,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,yBAAA;AAAA,IACH,GAAA,CAAI,QAAQ,gBAAA,IAAoB,IAAI,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa;AAAA,GAC9D;AACA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,GAAG,wBAAA;AAAA,IACH,GAAI,OAAA,CAAQ,eAAA,IAAmB;AAAC,GAClC;AAEA,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IAEN,SAAA,CAAU,KAAK,IAAA,EAAM;AACnB,MAAA,YAAA,GAAe,YAAY,GAAA,EAAI;AAE/B,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,EAAK,eAAe,CAAA;AAC9C,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,IAAUD,kBAAA,CAAW,KAAK,WAAA,EAAY;AAC3D,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,gBAAgB,CAAA;AAEpD,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,MAAM,YAAO,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,QAAA,MAAM,UAAU,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,UAAA;AAC5D,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAA;AAAA,MACjC;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAEpB,MAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AAAA,IACrB,CAAA;AAAA,IAEA,WAAW,QAAA,EAAU;AACnB,MAAA,MAAM,OAAA,GAAU,YAAA,GAAe,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,YAAY,GAAA,EAAI,GAAI,YAAY,CAAC,CAAA,EAAA,CAAA,GAAO,KAAA;AACrF,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,MAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,MAAA,GAAA,CAAI,CAAA,CAAA,EAAI,MAAM,CAAA,SAAA,EAAO,MAAM,IAAI,UAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG,CAAA;AACxD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IAEA,QAAQ,KAAA,EAAO;AACb,MAAA,GAAA,CAAI,CAAA,CAAA,EAAI,MAAM,CAAA,SAAA,EAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACtC;AAAA,GACF;AACF;;;AC3HO,SAAS,gBAAA,CACd,SACA,SAAA,EACyB;AACzB,EAAA,MAAM,OAAA,GAAU,aAAa,UAAA,CAAW,KAAA;AACxC,EAAA,IAAI,sBAAsB,OAAA,CAAQ,YAAA;AAClC,EAAA,IAAI,cAAA,GAAoD,IAAA;AAExD,EAAA,OAAO,eAAe,iBAAA,CACpB,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1C,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,QAAA;AAGpC,IAAA,IACE,IAAA,EAAM,IAAA,YAAgB,cAAA,IACrB,OAAO,IAAA,EAAM,SAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,aAAA,IAAkB,KAAK,IAAA,IACtF,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAAS,IAAA,IAAQ,OAAQ,IAAA,CAAK,IAAA,CAA4B,IAAA,KAAS,UAAA,EAC3G;AACA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,cAAA,GAAiB,kBAAA,CAAmB,OAAA,CAAQ,QAAA,EAAU,mBAAA,EAAqB;AAAA,UACzE,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,cAAc,OAAA,CAAQ,YAAA;AAAA,UACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,KAAA,EAAO;AAAA,SACR,CAAA,CAAE,IAAA,CAAK,OAAO,MAAA,KAAW;AACxB,UAAA,IAAI,MAAA,CAAO,YAAA,EAAc,mBAAA,GAAsB,MAAA,CAAO,YAAA;AAEtD,UAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,CAAQ,eAAe,MAAM,CAAA;AAAA,YACrC,SAAS,aAAA,EAAe;AACtB,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,4JAAA;AAAA,gBAEA;AAAA,eACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AAAE,UAAA,cAAA,GAAiB,IAAA;AAAA,QAAK,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA,MAAA,GAAS,MAAM,cAAA;AAAA,IACjB,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,mEAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAIA,IAAA,IAAI,cAAsC,EAAC;AAC3C,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAAE,QAAA,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA;AAAA,MAAM,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,WAAA,GACJ,OAAO,IAAA,EAAM,OAAA,KAAY,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,EAAE,IAAA,CAAK,OAAA,YAAmB,OAAA,CAAA,GAC3F,EAAE,GAAI,IAAA,CAAK,OAAA,EAAmC,GAC9C,MAAA,CAAO,WAAA,CAAY,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,EAAS,CAAA;AAC7D,IAAA,MAAM,eAAA,GAA0C,EAAE,GAAG,WAAA,EAAa,GAAG,WAAA,EAAY;AAEjF,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,EAAG;AAC9C,MAAA,IAAI,IAAI,WAAA,EAAY,KAAM,eAAA,EAAiB,OAAO,gBAAgB,GAAG,CAAA;AAAA,IACvE;AACA,IAAA,eAAA,CAAgB,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,MAAA,CAAO,WAAW,CAAA,CAAA;AAC/D,IAAA,OAAO,QAAQ,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,iBAAiB,CAAA;AAAA,EAC7D,CAAA;AACF;;;ACjHA,UAAA,EAAA;AAiFO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,QAAA,GAAW,OAAA;AAAA,EACX,QAAA,GAAW,EAAA;AAAA,EACX,cAA2B,EAAC;AAAA,EAEpC,YAAY,KAAA,EAAe;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,CAAA,EAAiB;AACvB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,GAAA,EAAmB;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,GAAA,CAAI,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AACrD,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,kBAAA,CAAW,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,IAAA,CAAK,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AACtD,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,kBAAA,CAAW,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,GAAA,CAAI,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AACrD,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,kBAAA,CAAW,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,KAAA,CAAM,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AACvD,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,kBAAA,CAAW,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AACxD,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,kBAAA,CAAW,MAAA,EAAQ,MAAM,OAAO,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAS;AAC1E,IAAA,MAAM,EAAA,GAAK,QAAQ,EAAA,IAAM,CAAA,EAAG,OAAO,WAAA,EAAa,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAW,GAAG,CAAA,CAAE,QAAQ,QAAA,EAAU,EAAE,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAG1H,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,YAAY,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAErE,IAAA,MAAM,aAA0B,EAAC;AAGjC,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAa,QAAA,GAC5B,EAAE,IAAA,EAAM,QAAA,EAAS,GACjB,QAAA,IAAY,EAAC;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA;AAAA,QACA,IAAIC,qBAAA,CAAc,IAAA;AAAA,QAClB,QAAA,EAAU,IAAA;AAAA,QACV,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,QAChC,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,QAAQ,QAAA,EAAU,OAAA,EAAS,IAAI,OAAA;AAAQ,OAC5D,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACxD,QAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,MAAM,OAAO,GAAA,KAAQ,WAAW,EAAE,IAAA,EAAM,KAAI,GAAI,GAAA;AACtD,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,IAAA;AAAA,UACA,EAAA,EAAI,GAAA,CAAI,EAAA,IAAMA,qBAAA,CAAc,KAAA;AAAA,UAC5B,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,UAC1B,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,QAAQ,QAAA,EAAU,OAAA,EAAS,IAAI,OAAA;AAAQ,SAC5D,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,aAAkD,EAAC;AACzD,MAAA,IAAI,OAAA,CAAQ,KAAK,UAAA,EAAY;AAC3B,QAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AACjE,UAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,YAAA,UAAA,CAAW,IAAI,CAAA,GAAI,EAAE,IAAA,EAAM,GAAA,EAAI;AAAA,UACjC,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,IAAI,CAAA,GAAI;AAAA,cACjB,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,aAAa,GAAA,CAAI,WAAA;AAAA,cACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,MAAM,GAAA,CAAI;AAAA,aACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,WAAA,GAAc;AAAA,QACZ,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,QAAA,IAAY,IAAA;AAAA,QACnC,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,WAAA,IAAeI,mBAAA,CAAY,IAAA;AAAA,QACrD,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,KAAK,EAAC;AAAA,UACN,UAAA;AAAA,UACA,QAAA,EAAU,QAAQ,IAAA,CAAK;AAAA;AACzB,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,EAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,MAC3B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAA;AAAA,MACA,WAAA;AAAA,MACA,qBAAqB,OAAA,CAAQ,mBAAA;AAAA,MAC7B,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ;AAAC,KACxB,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAmB;AACjB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,MAAM,gFAAgF,CAAA;AAAA,IAClG;AACA,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAA,EAAY,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,MAChC,aAAa,EAAC;AAAA,MACd,YAAYF,kBAAA,CAAW;AAAA,KACzB;AAAA,EACF;AACF;AAgBO,SAAS,UAAU,KAAA,EAA2B;AACnD,EAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAC7B;;;ANxMA,WAAA,EAAA;;;AO5EA,WAAA,EAAA;AAWO,SAAS,iBAAiB,MAAA,EAAkC;AACjE,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,OAAO,IAAA,IAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AAC5E;AAGO,SAAS,iBAAiB,MAAA,EAAyC;AACxE,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,IAAA,IAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,MAAM,CAAA,SAAU,IAAA,CAAK,MAAA;AAC5D,EAAA,OAAO,EAAC;AACV;AAMO,SAAS,qBAAqB,MAAA,EAA+B;AAClE,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC7E,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AAEvB,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,QAAA,GAAW,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACrD,EAAA,MAAM,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAClD","file":"index.cjs","sourcesContent":["/**\n * Core types for api-invoke.\n * Spec-agnostic — these work with any API format (OpenAPI, GraphQL, raw URL, manual builder).\n * All enums use `as const` objects for autocomplete + extensibility.\n */\n\nimport { ErrorKind } from './errors'\n\n// === Constants ===\n\n/** Standard HTTP methods supported by api-invoke. */\nexport const HttpMethod = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n HEAD: 'HEAD',\n OPTIONS: 'OPTIONS',\n} as const\nexport type HttpMethod = (typeof HttpMethod)[keyof typeof HttpMethod]\n\n/** Where a parameter is located in the HTTP request. */\nexport const ParamLocation = {\n PATH: 'path',\n QUERY: 'query',\n HEADER: 'header',\n COOKIE: 'cookie',\n} as const\nexport type ParamLocation = (typeof ParamLocation)[keyof typeof ParamLocation]\n\n/** Supported authentication types. */\nexport const AuthType = {\n BEARER: 'bearer',\n BASIC: 'basic',\n API_KEY: 'apiKey',\n QUERY_PARAM: 'queryParam',\n OAUTH2: 'oauth2',\n COOKIE: 'cookie',\n} as const\nexport type AuthType = (typeof AuthType)[keyof typeof AuthType]\n\n/** Detected API specification format. */\nexport const SpecFormat = {\n OPENAPI_3: 'openapi-3',\n OPENAPI_2: 'openapi-2',\n RAW_URL: 'raw-url',\n MANUAL: 'manual',\n GRAPHQL: 'graphql',\n} as const\nexport type SpecFormat = (typeof SpecFormat)[keyof typeof SpecFormat]\n\n/** Well-known HTTP header names used internally. */\nexport const HeaderName = {\n ACCEPT: 'Accept',\n AUTHORIZATION: 'Authorization',\n CONTENT_TYPE: 'Content-Type',\n COOKIE: 'Cookie',\n} as const\nexport type HeaderName = (typeof HeaderName)[keyof typeof HeaderName]\n\n// === Parsed API (spec-agnostic) ===\n\n/**\n * A parsed API specification, normalized into a spec-agnostic format.\n * This is the central data model — all adapters (OpenAPI, GraphQL, raw URL, manual builder) produce this shape.\n */\nexport interface ParsedAPI {\n /** Human-readable API title (e.g. 'Petstore API'). */\n title: string\n /** API version string from the spec (e.g. '1.0.0'). */\n version: string\n /** Base URL for all operations (e.g. 'https://api.example.com/v1'). */\n baseUrl: string\n /** All available API operations extracted from the spec. */\n operations: Operation[]\n /** Authentication schemes declared in the spec. */\n authSchemes: AuthScheme[]\n /** Which adapter produced this ParsedAPI. */\n specFormat: SpecFormat | string\n /** Raw spec version string from the spec (e.g. '3.0.3', '2.0'). Only set for OpenAPI specs. */\n rawSpecVersion?: string\n}\n\n/**\n * A single API operation (endpoint + method).\n * Produced by parsing a spec or using the manual builder.\n */\nexport interface Operation {\n /** Unique identifier for this operation (e.g. 'listUsers', 'get_users'). */\n id: string\n /** URL path template with placeholders (e.g. '/users/{userId}'). */\n path: string\n /** HTTP method (e.g. 'GET', 'POST'). */\n method: HttpMethod | string\n /** Short summary of what this operation does. */\n summary?: string\n /** Longer description of the operation's behavior. */\n description?: string\n /** Parameters accepted by this operation (path, query, header, cookie). */\n parameters: Parameter[]\n /** Request body definition, if the operation accepts one. */\n requestBody?: RequestBody\n /** Primary response schema for the operation's success case. For OpenAPI specs, this is the first 2xx schema found (see parser for priority). Useful for code generation or validation. */\n responseSchema?: unknown\n /** Success and default response schemas keyed by HTTP status code (e.g. '200', '201', 'default'). Codes without schemas (e.g. 204 No Content) are omitted. Error codes (4xx/5xx) are not extracted. */\n responseSchemas?: Record<string, unknown>\n /** Primary response content type (e.g. 'application/json', 'application/xml'). Used as the default Accept header. */\n responseContentType?: ContentType | string\n /** Error response descriptions keyed by HTTP status code (e.g. '404' → 'User not found'). Extracted from 4xx/5xx responses in the spec. */\n errorHints?: Record<string, string>\n /** Tags for grouping operations (e.g. ['users', 'admin']). */\n tags: string[]\n /** Security scheme names required by this operation. Each inner array is an alternative (OR); items within are required together (AND). Empty array (`[]`) means explicitly no auth. `undefined` means no security info available. */\n security?: string[][]\n /**\n * Custom body builder for protocol adapters (e.g., GraphQL).\n * When set and no explicit 'body' key is in args, the executor calls this instead of flat-arg assembly to construct the request body.\n * Receives the full args map and returns the body data to be serialized.\n */\n buildBody?: (args: Record<string, unknown>) => unknown\n}\n\n/**\n * A parameter accepted by an API operation.\n */\nexport interface Parameter {\n /** Parameter name as used in the request (e.g. 'userId', 'page'). */\n name: string\n /** Where this parameter appears in the request. */\n in: ParamLocation\n /** Whether this parameter must be provided. Path parameters are always required. */\n required: boolean\n /** Human-readable description of the parameter. */\n description: string\n /** Type and constraint information for this parameter. */\n schema: ParameterSchema\n}\n\n/**\n * Type and constraint information for a parameter.\n */\nexport interface ParameterSchema {\n /** Data type (e.g. 'string', 'integer', 'boolean', 'array'). */\n type: string\n /** Format hint (e.g. 'int32', 'date-time', 'email', 'uuid'). */\n format?: string\n /** Allowed values for this parameter. */\n enum?: unknown[]\n /** Default value used when the parameter is not provided. */\n default?: unknown\n /** Example value for documentation and testing. */\n example?: unknown\n /** Minimum value for numeric parameters. */\n minimum?: number\n /** Maximum value for numeric parameters. */\n maximum?: number\n /** Maximum length for string parameters. */\n maxLength?: number\n /** Element schema for array parameters. */\n items?: ParameterSchema\n}\n\n/** Well-known MIME content types. */\nexport const ContentType = {\n JSON: 'application/json',\n FORM_URLENCODED: 'application/x-www-form-urlencoded',\n MULTIPART: 'multipart/form-data',\n XML: 'application/xml',\n OCTET_STREAM: 'application/octet-stream',\n TEXT: 'text/plain',\n SSE: 'text/event-stream',\n} as const\nexport type ContentType = (typeof ContentType)[keyof typeof ContentType]\n\n/**\n * Request body definition for an operation.\n */\nexport interface RequestBody {\n /** Whether the request body is required for this operation. */\n required: boolean\n /** Human-readable description of the request body. */\n description?: string\n /** Content type for the request body (e.g. 'application/json'). */\n contentType: ContentType | string\n /** Schema describing the request body structure. */\n schema: RequestBodySchema\n}\n\n/**\n * Schema for a request body, with flattened top-level properties for easy access.\n */\nexport interface RequestBodySchema {\n /** Top-level type (usually 'object'). */\n type: string\n /** Original unprocessed schema from the spec. Useful for advanced use cases like code generation. */\n raw: unknown\n /** Flattened top-level properties, keyed by property name. Only present when type is 'object'. */\n properties?: Record<string, RequestBodyProperty>\n /** Names of required properties. */\n required?: string[]\n}\n\n/**\n * A single property within a request body schema.\n */\nexport interface RequestBodyProperty {\n /** Data type (e.g. 'string', 'integer', 'boolean'). */\n type: string\n /** Format hint (e.g. 'date-time', 'email'). */\n format?: string\n /** Human-readable description of this property. */\n description?: string\n /** Allowed values for this property. */\n enum?: unknown[]\n /** Default value for this property. */\n default?: unknown\n /** Example value for documentation and testing. */\n example?: unknown\n /** True when this property is an object or array with nested structure. Useful for UI rendering decisions. */\n nested?: boolean\n}\n\n// === Authentication ===\n\n/**\n * An authentication scheme declared in the API spec.\n * Describes how the API expects credentials to be provided, but does not contain actual credentials.\n */\nexport interface AuthScheme {\n /** Scheme name from the spec (e.g. 'bearerAuth', 'api_key'). */\n name: string\n /** Mapped auth type, or null if the scheme is unsupported. */\n authType: AuthType | null\n /** Additional scheme-specific metadata (e.g. header name for API keys, OAuth2 URLs). */\n metadata: Record<string, string>\n /** Human-readable description of the auth scheme. */\n description: string\n}\n\n/**\n * Credentials for authenticating API requests.\n * Discriminated union on `type` — use the `AuthType` constants to construct.\n *\n * @example\n * // Bearer token\n * const auth: Auth = { type: AuthType.BEARER, token: 'sk-...' }\n *\n * @example\n * // API key in a header\n * const auth: Auth = { type: AuthType.API_KEY, location: ParamLocation.HEADER, name: 'X-API-Key', value: 'my-key' }\n */\nexport type Auth =\n | { type: typeof AuthType.BEARER; token: string }\n | { type: typeof AuthType.BASIC; username: string; password: string }\n | { type: typeof AuthType.API_KEY; location: typeof ParamLocation.HEADER | typeof ParamLocation.QUERY; name: string; value: string }\n | { type: typeof AuthType.OAUTH2; accessToken: string; refreshToken?: string; tokenUrl?: string; clientId?: string; clientSecret?: string }\n | { type: typeof AuthType.COOKIE; name: string; value: string }\n\n// === Execution ===\n\n/**\n * A fully constructed HTTP request ready to be sent (or previewed).\n * Produced by {@link buildRequest} and included in execution results for debugging.\n */\nexport interface BuiltRequest {\n /** HTTP method (e.g. 'GET', 'POST'). */\n method: HttpMethod | string\n /** Fully resolved URL with path and query parameters substituted. */\n url: string\n /** Request headers including auth, content-type, and accept. */\n headers: Record<string, string>\n /** Serialized request body, if present. String for JSON/form-urlencoded, FormData for multipart. */\n body?: string | FormData\n}\n\n/**\n * Subset of {@link ErrorKind} that can appear on {@link ExecutionResult.errorKind}.\n * Only HTTP-response errors — client-side errors (CORS, NETWORK, TIMEOUT) always throw regardless of `throwOnHttpError`.\n */\nexport type ResultErrorKind = typeof ErrorKind.AUTH | typeof ErrorKind.RATE_LIMIT | typeof ErrorKind.HTTP\n\n/**\n * Result of executing an API operation.\n * Contains the parsed response data, status, headers, timing, and the original request for debugging.\n */\nexport interface ExecutionResult {\n /** HTTP status code (e.g. 200, 404, 500). */\n status: number\n /** Parsed response body. JSON responses are parsed to objects; binary responses are ArrayBuffers; others attempt JSON parsing before falling back to strings. */\n data: unknown\n /** Response content type from the Content-Type header (e.g. 'application/json', 'text/xml'). */\n contentType: string\n /** Response headers as a flat key-value map. */\n headers: Record<string, string>\n /** The request that was sent, useful for debugging and logging. */\n request: BuiltRequest\n /** Request duration in milliseconds (from send to response headers received, before body parsing). */\n elapsedMs: number\n /** Set when `throwOnHttpError` is false and the response is an error. Allows programmatic error classification without throwing. */\n errorKind?: ResultErrorKind\n}\n\n// === Streaming ===\n\n/**\n * A parsed Server-Sent Event.\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n */\nexport interface SSEEvent {\n /** Event type (e.g. 'message', 'error'). Absent when no `event:` field was set in the stream. */\n event?: string\n /** Event payload. For JSON-encoded events, this is the raw string — parse it with `JSON.parse()`. */\n data: string\n /** Last event ID. Per spec, values containing U+0000 NULL are ignored by the parser. */\n id?: string\n /** Reconnection time in milliseconds. Must be a non-negative integer per spec. */\n retry?: number\n}\n\n/**\n * Result of a streaming API call. Errors always throw before this object is constructed,\n * so `status` is guaranteed to be 2xx. The `stream` is single-use — iterating it twice\n * will fail since the underlying ReadableStream reader can only be consumed once.\n * Unlike `ExecutionResult`, `elapsedMs` measures time to receive the response headers (not total stream consumption time)\n * and `errorKind` is absent (errors throw, no non-throwing mode for streams).\n */\nexport interface StreamingExecutionResult {\n /** HTTP status code (guaranteed 2xx). */\n status: number\n /** Async iterable of SSE events. Single-use — can only be iterated once. */\n stream: AsyncIterable<SSEEvent>\n /** Response content type (expected: 'text/event-stream'). */\n contentType: string\n /** Response headers as a flat key-value map. */\n headers: Record<string, string>\n /** The request that was sent. */\n request: BuiltRequest\n /** Time-to-first-byte in milliseconds (not total stream consumption time). */\n elapsedMs: number\n}\n\n// === Enricher ===\n\n/**\n * Post-processing hook that transforms a ParsedAPI after parsing.\n * Useful for adding custom operations, modifying base URLs, or injecting metadata.\n */\nexport interface Enricher {\n /** Enricher name for identification in logs and debugging. */\n readonly name: string\n /**\n * Transform the parsed API. May return a new object or modify in place.\n * Can be async for enrichers that need to fetch external data.\n */\n enrichAPI(api: ParsedAPI): ParsedAPI | Promise<ParsedAPI>\n}\n\n// === Client Options ===\n\n/**\n * Configuration options for {@link ApiInvokeClient} and {@link createClient}.\n */\nexport interface ClientOptions {\n /** Original spec URL, used for base URL fallback when the spec has no servers/host field. */\n specUrl?: string\n /** Default authentication credentials for all operations. Can be overridden per-call. */\n auth?: Auth | Auth[]\n /** Middleware pipeline applied to every request/response (e.g. logging, CORS proxy). */\n middleware?: Middleware[]\n /** Custom fetch implementation. Defaults to `globalThis.fetch`. Useful for testing or wrapping with {@link withRetry}. */\n fetch?: typeof globalThis.fetch\n /** Post-parse enricher that transforms the ParsedAPI before client construction. */\n enricher?: Enricher\n /** Default timeout in milliseconds for all operations. 0 = no timeout (default). */\n timeoutMs?: number\n}\n\n// === Middleware ===\n\n/**\n * Middleware hook for intercepting requests and responses.\n * All hooks are optional — implement only the ones you need.\n */\nexport interface Middleware {\n /** Middleware name for identification in logs and debugging. */\n name?: string\n /**\n * Called before each request is sent. Can modify the URL and request init.\n * Middleware runs in order — later middleware sees changes from earlier ones.\n */\n onRequest?(url: string, init: RequestInit): { url: string; init: RequestInit } | Promise<{ url: string; init: RequestInit }>\n /**\n * Called after receiving a response. Can transform or replace the response.\n * Runs in order — later middleware sees the response from earlier ones.\n */\n onResponse?(response: Response): Response | Promise<Response>\n /**\n * Called when a fetch error occurs (network failure, CORS, timeout).\n * For logging/monitoring only — cannot recover from the error.\n * Exceptions thrown by this handler are suppressed (logged as warnings).\n */\n onError?(error: Error): void\n}\n","/**\n * Classified API errors with human/agent-readable suggestions.\n * Each error has a `kind` for programmatic handling and `retryable` for retry logic.\n */\n\n/**\n * Error classification constants. Use with {@link ApiInvokeError.kind} for programmatic error handling.\n *\n * @example\n * ```ts\n * if (error.kind === ErrorKind.RATE_LIMIT) {\n * // Wait and retry\n * }\n * ```\n */\nexport const ErrorKind = {\n CORS: 'cors',\n NETWORK: 'network',\n AUTH: 'auth',\n HTTP: 'http',\n PARSE: 'parse',\n RATE_LIMIT: 'rate-limit',\n TIMEOUT: 'timeout',\n GRAPHQL: 'graphql',\n} as const\nexport type ErrorKind = (typeof ErrorKind)[keyof typeof ErrorKind]\n\n/** Error name constant used on all ApiInvokeError instances. Useful for cross-realm `instanceof` checks. */\nexport const API_INVOKE_ERROR_NAME = 'ApiInvokeError' as const\n\n/**\n * Structured error thrown by api-invoke for all API failures.\n * Includes a machine-readable `kind`, a human-readable `suggestion`, and a `retryable` flag.\n *\n * @example\n * ```ts\n * try {\n * await client.execute('getUser', { userId: 123 })\n * } catch (error) {\n * if (error instanceof ApiInvokeError) {\n * console.log(error.kind) // 'auth', 'network', 'rate-limit', etc.\n * console.log(error.suggestion) // Human-readable recovery advice\n * console.log(error.retryable) // Whether retrying might succeed\n * }\n * }\n * ```\n */\nexport class ApiInvokeError extends Error {\n /** Error classification for programmatic handling. */\n readonly kind: ErrorKind | string\n /** HTTP status code, if the error originated from an HTTP response. */\n readonly status?: number\n /** Human-readable suggestion for how to resolve this error. */\n readonly suggestion: string\n /** Whether retrying the request might succeed (e.g. true for rate limits, network errors). */\n readonly retryable: boolean\n /** Response body from the API (when available). May be parsed JSON, a string, or binary data depending on the response content type. */\n readonly responseBody?: unknown\n\n constructor(opts: {\n kind: ErrorKind | string\n message: string\n suggestion: string\n retryable?: boolean\n status?: number\n responseBody?: unknown\n }) {\n super(opts.message)\n this.name = API_INVOKE_ERROR_NAME\n this.kind = opts.kind\n this.suggestion = opts.suggestion\n this.retryable = opts.retryable ?? false\n this.status = opts.status\n this.responseBody = opts.responseBody\n }\n}\n\n/**\n * Create a CORS error for when a browser request is blocked by the same-origin policy.\n * @param url - The URL that was blocked\n * @returns An `ApiInvokeError` with `kind: 'cors'` and `retryable: false`\n */\nexport function corsError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.CORS,\n message: `Cannot access ${url} — blocked by CORS policy.`,\n suggestion: 'This API does not allow browser requests. Use a CORS proxy or server-side execution.',\n retryable: false,\n })\n}\n\n/**\n * Create a network error for connection failures.\n * @param url - The URL that failed to connect\n * @returns An `ApiInvokeError` with `kind: 'network'` and `retryable: true`\n */\nexport function networkError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.NETWORK,\n message: `Network error while fetching ${url}.`,\n suggestion: 'Check your internet connection and verify the URL is correct.',\n retryable: true,\n })\n}\n\n/**\n * Create an authentication/authorization error (401 or 403).\n * @param url - The URL that returned the error\n * @param status - HTTP status code (401 or 403)\n * @param responseBody - Parsed response body, if available\n * @returns An `ApiInvokeError` with `kind: 'auth'` and `retryable: false`\n */\nexport function authError(url: string, status: 401 | 403, responseBody?: unknown): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: status === 401\n ? `Authentication failed for ${url} (401)`\n : `Authorization denied for ${url} (403)`,\n suggestion: status === 401\n ? 'Check your credentials. The server rejected your authentication.'\n : 'Your credentials are valid but you lack permission for this resource.',\n retryable: false,\n status,\n responseBody,\n })\n}\n\n/**\n * Create an HTTP error for non-2xx responses (excluding 401/403 which use {@link authError}).\n * Status 429 is classified as `kind: 'rate-limit'`; all others as `kind: 'http'`.\n * @param url - The URL that returned the error\n * @param status - HTTP status code\n * @param statusText - HTTP status text (e.g. 'Not Found')\n * @param responseBody - Parsed response body, if available\n * @returns An `ApiInvokeError` with `retryable: true` for 429 and 5xx status codes\n */\nexport function httpError(url: string, status: number, statusText: string, responseBody?: unknown): ApiInvokeError {\n const retryable = status === 429 || status >= 500\n const kind = status === 429 ? ErrorKind.RATE_LIMIT : ErrorKind.HTTP\n\n let suggestion: string\n if (status === 404) {\n suggestion = 'The endpoint was not found. Check the URL path.'\n } else if (status === 429) {\n suggestion = 'Rate limited. Wait and retry.'\n } else if (status >= 500) {\n suggestion = 'The API server is having issues. Try again later.'\n } else {\n suggestion = `The API returned an error (${status}). Verify the request.`\n }\n\n return new ApiInvokeError({\n kind,\n message: `API returned ${status} ${statusText} for ${url}.`,\n suggestion,\n retryable,\n status,\n responseBody,\n })\n}\n\n/**\n * Create a parse error for when the response body cannot be read as the expected format.\n * @param url - The URL that returned the unparseable response\n * @param expectedType - The expected format (default: 'JSON')\n * @returns An `ApiInvokeError` with `kind: 'parse'` and `retryable: false`\n */\nexport function parseError(url: string, expectedType = 'JSON'): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `Failed to parse response from ${url} as ${expectedType}.`,\n suggestion: `The API response body could not be read as ${expectedType}. Verify the endpoint returns the expected content type.`,\n retryable: false,\n })\n}\n\n/**\n * Create a GraphQL error for when the response contains errors and no data (total failure).\n * @param messages - Joined error messages from the GraphQL response\n * @param status - HTTP status code (usually 200 for GraphQL)\n * @param responseBody - Full GraphQL response body\n * @returns An `ApiInvokeError` with `kind: 'graphql'` and `retryable: false`\n */\nexport function graphqlError(messages: string, status?: number, responseBody?: unknown): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.GRAPHQL,\n message: `GraphQL errors: ${messages}`,\n suggestion: 'Check the query and variables for correctness.',\n retryable: false,\n status,\n responseBody,\n })\n}\n\n/**\n * Create a timeout error for when a request exceeds the configured `timeoutMs`.\n * @param url - The URL that timed out\n * @returns An `ApiInvokeError` with `kind: 'timeout'` and `retryable: true`\n */\nexport function timeoutError(url: string): ApiInvokeError {\n return new ApiInvokeError({\n kind: ErrorKind.TIMEOUT,\n message: `Request to ${url} timed out.`,\n suggestion: 'The server took too long to respond. Try again or increase the timeout.',\n retryable: true,\n })\n}\n","/**\n * GraphQL introspection query and types for parsing introspection results.\n * Based on the GraphQL specification's introspection system.\n */\n\n/** GraphQL type kinds from the introspection system. */\nexport const TypeKind = {\n SCALAR: 'SCALAR',\n OBJECT: 'OBJECT',\n ENUM: 'ENUM',\n INPUT_OBJECT: 'INPUT_OBJECT',\n NON_NULL: 'NON_NULL',\n LIST: 'LIST',\n UNION: 'UNION',\n INTERFACE: 'INTERFACE',\n} as const\nexport type TypeKind = (typeof TypeKind)[keyof typeof TypeKind]\n\n/** Introspection query covering types, fields, args, and enums. Omits possibleTypes and directives for simplicity. */\nexport const INTROSPECTION_QUERY = `query IntrospectionQuery {\n __schema {\n queryType { name }\n mutationType { name }\n subscriptionType { name }\n types {\n kind name description\n fields(includeDeprecated: false) {\n name description\n args { name description type { ...TypeRef } defaultValue }\n type { ...TypeRef }\n }\n inputFields { name description type { ...TypeRef } defaultValue }\n enumValues(includeDeprecated: false) { name description }\n }\n }\n}\nfragment TypeRef on __Type {\n kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name ofType { kind name } } } } } }\n}`\n\nexport interface IntrospectionResult {\n data: { __schema: IntrospectionSchema }\n}\n\nexport interface IntrospectionSchema {\n queryType: { name: string } | null\n mutationType: { name: string } | null\n subscriptionType: { name: string } | null\n types: IntrospectionType[]\n}\n\nexport interface IntrospectionType {\n kind: TypeKind | string\n name: string\n description?: string | null\n fields?: IntrospectionField[] | null\n inputFields?: IntrospectionInputValue[] | null\n enumValues?: Array<{ name: string; description?: string | null }> | null\n}\n\nexport interface IntrospectionField {\n name: string\n description?: string | null\n args: IntrospectionInputValue[]\n type: IntrospectionTypeRef\n}\n\nexport interface IntrospectionInputValue {\n name: string\n description?: string | null\n type: IntrospectionTypeRef\n defaultValue?: string | null\n}\n\nexport interface IntrospectionTypeRef {\n kind: TypeKind | string\n name: string | null\n ofType?: IntrospectionTypeRef | null\n}\n","/**\n * Generates GraphQL query strings from introspection type information.\n * Produces depth-limited selection sets that cover scalar fields and nested objects.\n */\n\nimport { TypeKind } from './introspection'\nimport type { IntrospectionField, IntrospectionInputValue, IntrospectionType, IntrospectionTypeRef } from './introspection'\n\nconst DEFAULT_MAX_DEPTH = 2\n\n/**\n * Format a GraphQL type reference as a human-readable string.\n *\n * @example\n * formatTypeRef({ kind: 'NON_NULL', name: null, ofType: { kind: 'SCALAR', name: 'String', ofType: null } })\n * // => 'String!'\n */\nexport function formatTypeRef(ref: IntrospectionTypeRef): string {\n if (ref.kind === TypeKind.NON_NULL) {\n return ref.ofType ? `${formatTypeRef(ref.ofType)}!` : 'unknown!'\n }\n if (ref.kind === TypeKind.LIST) {\n return ref.ofType ? `[${formatTypeRef(ref.ofType)}]` : '[unknown]'\n }\n return ref.name ?? 'unknown'\n}\n\n/**\n * Unwrap NON_NULL and LIST wrappers to find the base (named) type.\n */\nexport function unwrapType(ref: IntrospectionTypeRef): IntrospectionTypeRef {\n let current = ref\n while ((current.kind === TypeKind.NON_NULL || current.kind === TypeKind.LIST) && current.ofType) {\n current = current.ofType\n }\n return current\n}\n\n/**\n * Check if a type reference is non-null (required).\n */\nexport function isNonNull(ref: IntrospectionTypeRef): boolean {\n return ref.kind === TypeKind.NON_NULL\n}\n\n/**\n * Build a GraphQL query/mutation string from introspection field data.\n *\n * @param operationType - 'query' or 'mutation'\n * @param field - The root field from the Query/Mutation type\n * @param typeMap - Map of type names to their introspection definitions\n * @param maxDepth - Maximum depth for nested field selection (default: 2)\n * @returns A complete GraphQL query string\n */\nexport function buildQueryString(\n operationType: 'query' | 'mutation',\n field: IntrospectionField,\n typeMap: Map<string, IntrospectionType>,\n maxDepth: number = DEFAULT_MAX_DEPTH,\n): string {\n const varDefs = buildVariableDefinitions(field.args)\n const fieldArgs = buildFieldArguments(field.args)\n const selection = buildSelectionSet(field.type, typeMap, maxDepth, new Set())\n\n const varPart = varDefs ? `(${varDefs})` : ''\n const argPart = fieldArgs ? `(${fieldArgs})` : ''\n const selPart = selection ? ` ${selection}` : ''\n\n return `${operationType} ${field.name}${varPart} { ${field.name}${argPart}${selPart} }`\n}\n\nfunction buildVariableDefinitions(args: IntrospectionInputValue[]): string {\n if (args.length === 0) return ''\n return args.map(a => `$${a.name}: ${formatTypeRef(a.type)}`).join(', ')\n}\n\nfunction buildFieldArguments(args: IntrospectionInputValue[]): string {\n if (args.length === 0) return ''\n return args.map(a => `${a.name}: $${a.name}`).join(', ')\n}\n\nfunction buildSelectionSet(\n typeRef: IntrospectionTypeRef,\n typeMap: Map<string, IntrospectionType>,\n depth: number,\n visited: Set<string>,\n): string {\n const base = unwrapType(typeRef)\n if (!base.name) return ''\n\n const type = typeMap.get(base.name)\n if (!type || !type.fields) return ''\n\n if (base.kind === TypeKind.UNION || base.kind === TypeKind.INTERFACE) {\n return buildUnionSelection(type, typeMap, depth, visited)\n }\n\n if (base.kind !== TypeKind.OBJECT) return ''\n\n // Prevent circular references\n if (visited.has(base.name)) return ''\n visited.add(base.name)\n\n const fields: string[] = []\n for (const f of type.fields) {\n const fieldBase = unwrapType(f.type)\n if (fieldBase.kind === TypeKind.SCALAR || fieldBase.kind === TypeKind.ENUM) {\n fields.push(f.name)\n } else if (depth > 0 && (fieldBase.kind === TypeKind.OBJECT || fieldBase.kind === TypeKind.UNION || fieldBase.kind === TypeKind.INTERFACE)) {\n const nested = buildSelectionSet(f.type, typeMap, depth - 1, new Set(visited))\n if (nested) {\n fields.push(`${f.name} ${nested}`)\n }\n }\n }\n\n visited.delete(base.name)\n\n if (fields.length === 0) return ''\n return `{ ${fields.join(' ')} }`\n}\n\nfunction buildUnionSelection(\n type: IntrospectionType,\n typeMap: Map<string, IntrospectionType>,\n depth: number,\n visited: Set<string>,\n): string {\n // For unions/interfaces, we need the possibleTypes — but introspection query\n // doesn't include them by default. Fall back to __typename only.\n // A more complete introspection query could include possibleTypes.\n return '{ __typename }'\n}\n","/**\n * GraphQL adapter — parses introspection schemas into ParsedAPI.\n * Accepts a live endpoint URL (runs introspection) or an introspection JSON object.\n */\n\nimport type { ParsedAPI, Operation, RequestBody, RequestBodyProperty } from '../../core/types'\nimport { HttpMethod, ContentType, SpecFormat } from '../../core/types'\nimport { ApiInvokeError, ErrorKind } from '../../core/errors'\nimport { INTROSPECTION_QUERY, TypeKind } from './introspection'\nimport type { IntrospectionSchema, IntrospectionType, IntrospectionField, IntrospectionInputValue, IntrospectionTypeRef } from './introspection'\nimport { buildQueryString, unwrapType, isNonNull, formatTypeRef } from './query-builder'\n\n/** Options for parsing a GraphQL schema. */\nexport interface GraphQLParseOptions {\n /** GraphQL endpoint URL. Strongly recommended when input is introspection JSON — without it, baseUrl defaults to '/graphql' (a relative path). Inferred automatically when input is a URL string. */\n endpoint?: string\n /** Custom fetch implementation for introspection queries. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** Maximum depth for auto-generated query selection sets. Default: 2. */\n maxDepth?: number\n}\n\n/**\n * Parse a GraphQL schema into a ParsedAPI.\n *\n * @param input - Either an endpoint URL (string starting with http) or an introspection result object.\n * URL: runs introspection query against the endpoint.\n * Object: expects `{ data: { __schema: ... } }` or `{ __schema: ... }` shape.\n * @param options - Configuration options.\n * @returns A ParsedAPI with one operation per query/mutation/subscription field.\n */\nexport async function parseGraphQLSchema(\n input: string | object,\n options?: GraphQLParseOptions,\n): Promise<ParsedAPI> {\n const maxDepth = options?.maxDepth ?? 2\n\n let schema: IntrospectionSchema\n let endpoint: string\n\n if (typeof input === 'string') {\n if (!input.startsWith('http')) {\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: 'GraphQL input must be an endpoint URL (starting with http) or an introspection JSON object. SDL parsing is not yet supported.',\n suggestion: 'Pass a URL like \"https://api.example.com/graphql\" or an introspection result object.',\n retryable: false,\n })\n }\n endpoint = options?.endpoint ?? input\n schema = await fetchIntrospection(input, options?.fetch)\n } else {\n schema = extractSchema(input)\n endpoint = options?.endpoint ?? '/graphql'\n }\n\n const path = extractPath(endpoint)\n const typeMap = buildTypeMap(schema.types)\n const operations: Operation[] = []\n\n // Parse query fields\n if (schema.queryType?.name) {\n const queryType = typeMap.get(schema.queryType.name)\n if (queryType?.fields) {\n for (const field of queryType.fields) {\n operations.push(buildOperation(field, 'query', path, typeMap, maxDepth))\n }\n }\n }\n\n // Parse mutation fields\n if (schema.mutationType?.name) {\n const mutationType = typeMap.get(schema.mutationType.name)\n if (mutationType?.fields) {\n for (const field of mutationType.fields) {\n operations.push(buildOperation(field, 'mutation', path, typeMap, maxDepth))\n }\n }\n }\n\n // Parse subscription fields — tagged for discovery but not executable via HTTP (subscriptions require WebSocket). No buildBody hook is set.\n if (schema.subscriptionType?.name) {\n const subType = typeMap.get(schema.subscriptionType.name)\n if (subType?.fields) {\n for (const field of subType.fields) {\n operations.push(buildOperation(field, 'subscription', path, typeMap, maxDepth))\n }\n }\n }\n\n const title = extractTitle(endpoint, schema)\n\n return {\n title,\n version: '1.0.0',\n baseUrl: extractBaseUrl(endpoint),\n operations,\n authSchemes: [],\n specFormat: SpecFormat.GRAPHQL,\n }\n}\n\n/** Run an introspection query against a live GraphQL endpoint. */\nasync function fetchIntrospection(\n url: string,\n fetchFn?: typeof globalThis.fetch,\n): Promise<IntrospectionSchema> {\n const doFetch = fetchFn ?? globalThis.fetch\n let response: Response\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: INTROSPECTION_QUERY }),\n })\n } catch (err) {\n throw new ApiInvokeError({\n kind: ErrorKind.NETWORK,\n message: `Failed to fetch GraphQL introspection from ${url}: ${err instanceof Error ? err.message : String(err)}`,\n suggestion: 'Check the endpoint URL and your network connection.',\n retryable: true,\n })\n }\n\n if (!response.ok) {\n throw new ApiInvokeError({\n kind: ErrorKind.HTTP,\n message: `GraphQL introspection failed with HTTP ${response.status} from ${url}.`,\n suggestion: 'Verify the endpoint supports introspection and is accessible.',\n retryable: response.status >= 500,\n status: response.status,\n })\n }\n\n let json: Record<string, unknown>\n const cloned = response.clone()\n try {\n json = await response.json() as Record<string, unknown>\n } catch (err) {\n let body: string | undefined\n try { body = (await cloned.text()).slice(0, 200) } catch { /* ignore */ }\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `GraphQL introspection response from ${url} is not valid JSON${err instanceof Error ? `: ${err.message}` : ''}.`,\n suggestion: `The endpoint returned a non-JSON response${body ? ` (starts with: \"${body}\")` : ''}. Verify it is a GraphQL endpoint.`,\n retryable: false,\n })\n }\n return extractSchema(json)\n}\n\n/** Extract __schema from an introspection result object. */\nfunction extractSchema(obj: object): IntrospectionSchema {\n const record = obj as Record<string, unknown>\n\n // Shape: { __schema: ... }\n if (record.__schema && typeof record.__schema === 'object') {\n return record.__schema as IntrospectionSchema\n }\n\n // Shape: { data: { __schema: ... } }\n if (record.data && typeof record.data === 'object') {\n const data = record.data as Record<string, unknown>\n if (data.__schema && typeof data.__schema === 'object') {\n return data.__schema as IntrospectionSchema\n }\n }\n\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: 'Invalid GraphQL introspection result: expected { __schema: ... } or { data: { __schema: ... } }.',\n suggestion: 'Pass a valid introspection result object or a URL to a GraphQL endpoint.',\n retryable: false,\n })\n}\n\n/** Build a type lookup map from introspection types. */\nfunction buildTypeMap(types: IntrospectionType[]): Map<string, IntrospectionType> {\n const map = new Map<string, IntrospectionType>()\n for (const type of types) {\n map.set(type.name, type)\n }\n return map\n}\n\n/** Extract URL path from an endpoint URL. */\nfunction extractPath(endpoint: string): string {\n try {\n return new URL(endpoint).pathname\n } catch {\n return '/graphql'\n }\n}\n\n/** Extract base URL (origin) from an endpoint URL. */\nfunction extractBaseUrl(endpoint: string): string {\n try {\n const url = new URL(endpoint)\n return url.origin\n } catch {\n return ''\n }\n}\n\n/** Generate a title from the endpoint URL or schema info. */\nfunction extractTitle(endpoint: string, _schema: IntrospectionSchema): string {\n try {\n const url = new URL(endpoint)\n return `GraphQL API (${url.hostname})`\n } catch {\n return 'GraphQL API'\n }\n}\n\n/** Build an Operation from an introspection field. */\nfunction buildOperation(\n field: IntrospectionField,\n operationType: 'query' | 'mutation' | 'subscription',\n path: string,\n typeMap: Map<string, IntrospectionType>,\n maxDepth: number,\n): Operation {\n const id = operationType === 'mutation' ? `mutation_${field.name}`\n : operationType === 'subscription' ? `subscription_${field.name}`\n : field.name\n const tags = [operationType]\n\n const queryString = operationType !== 'subscription'\n ? buildQueryString(operationType as 'query' | 'mutation', field, typeMap, maxDepth)\n : undefined\n\n const requestBody = buildRequestBody(field.args, typeMap)\n const responseSchema = buildResponseSchema(field.type, typeMap)\n\n const operation: Operation = {\n id,\n path,\n method: HttpMethod.POST,\n summary: field.description ?? `GraphQL ${operationType}: ${field.name}`,\n parameters: [],\n requestBody,\n responseSchema,\n tags,\n }\n\n if (queryString) {\n const argNames = new Set(field.args.map(a => a.name))\n operation.buildBody = (args: Record<string, unknown>) => {\n const variables: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(args)) {\n if (argNames.has(k)) variables[k] = v\n }\n return { query: queryString, variables }\n }\n }\n\n return operation\n}\n\n/** Build a RequestBody from GraphQL field arguments. */\nfunction buildRequestBody(\n args: IntrospectionInputValue[],\n typeMap: Map<string, IntrospectionType>,\n): RequestBody | undefined {\n if (args.length === 0) return undefined\n\n const properties: Record<string, RequestBodyProperty> = {}\n const required: string[] = []\n\n for (const arg of args) {\n properties[arg.name] = mapInputValueToProperty(arg, typeMap)\n if (isNonNull(arg.type)) {\n required.push(arg.name)\n }\n }\n\n return {\n required: required.length > 0,\n contentType: ContentType.JSON,\n schema: {\n type: 'object',\n raw: { type: 'object', properties },\n properties,\n required: required.length > 0 ? required : undefined,\n },\n }\n}\n\n/** Map a GraphQL input value to a RequestBodyProperty. */\nfunction mapInputValueToProperty(\n input: IntrospectionInputValue,\n typeMap: Map<string, IntrospectionType>,\n): RequestBodyProperty {\n const base = unwrapType(input.type)\n const description = input.description\n ? `${input.description} (${formatTypeRef(input.type)})`\n : formatTypeRef(input.type)\n\n // Check if the type ref has a LIST wrapper in its chain\n const isList = isListType(input.type)\n\n if (base.kind === TypeKind.SCALAR) {\n const mapped = mapScalarType(base.name ?? 'String')\n const prop: RequestBodyProperty = {\n type: isList ? 'array' : mapped.type,\n description,\n }\n if (mapped.format) prop.format = mapped.format\n if (input.defaultValue != null) prop.default = input.defaultValue\n return prop\n }\n\n if (base.kind === TypeKind.ENUM) {\n const enumType = typeMap.get(base.name ?? '')\n const enumValues = enumType?.enumValues?.map(e => e.name)\n return {\n type: isList ? 'array' : 'string',\n description,\n enum: enumValues,\n }\n }\n\n if (base.kind === TypeKind.INPUT_OBJECT) {\n return {\n type: isList ? 'array' : 'object',\n description,\n nested: true,\n }\n }\n\n // Fallback for unknown types\n return { type: 'string', description }\n}\n\n/** Check if a type ref contains a LIST wrapper. */\nfunction isListType(ref: IntrospectionTypeRef): boolean {\n let current: IntrospectionTypeRef | null | undefined = ref\n while (current) {\n if (current.kind === TypeKind.LIST) return true\n current = current.ofType\n }\n return false\n}\n\n/** Map a GraphQL scalar type name to a JSON Schema type. */\nfunction mapScalarType(name: string): { type: string; format?: string } {\n switch (name) {\n case 'String':\n case 'ID':\n return { type: 'string' }\n case 'Int':\n return { type: 'integer' }\n case 'Float':\n return { type: 'number' }\n case 'Boolean':\n return { type: 'boolean' }\n default:\n // Custom scalars (DateTime, JSON, etc.) → string\n return { type: 'string', format: name.toLowerCase() }\n }\n}\n\n/** Build a response schema from the field's return type. */\nfunction buildResponseSchema(\n typeRef: IntrospectionTypeRef,\n typeMap: Map<string, IntrospectionType>,\n): unknown {\n const base = unwrapType(typeRef)\n if (!base.name) return undefined\n\n if (base.kind === TypeKind.SCALAR) {\n const mapped = mapScalarType(base.name)\n return { type: mapped.type, format: mapped.format }\n }\n\n if (base.kind === TypeKind.ENUM) {\n const enumType = typeMap.get(base.name)\n return { type: 'string', enum: enumType?.enumValues?.map(e => e.name) }\n }\n\n if (base.kind === TypeKind.OBJECT) {\n const objType = typeMap.get(base.name)\n if (!objType?.fields) return { type: 'object' }\n\n const properties: Record<string, unknown> = {}\n for (const f of objType.fields) {\n const fieldBase = unwrapType(f.type)\n if (fieldBase.kind === TypeKind.SCALAR) {\n properties[f.name] = mapScalarType(fieldBase.name ?? 'String')\n } else if (fieldBase.kind === TypeKind.ENUM) {\n properties[f.name] = { type: 'string' }\n } else {\n properties[f.name] = { type: 'object' }\n }\n }\n return { type: 'object', properties }\n }\n\n return { type: 'object' }\n}\n","/**\n * HTTP request execution with body serialization (JSON, form-urlencoded, multipart) and error classification.\n * Pluggable: uses global fetch by default, can be overridden.\n */\n\nimport type { Auth, BuiltRequest, ExecutionResult, Middleware, Operation, SSEEvent, StreamingExecutionResult } from './types'\nimport { ContentType, HeaderName, HttpMethod } from './types'\nimport { parseSSE } from './sse'\nimport { buildUrl, extractHeaderParams, extractCookieParams } from './url-builder'\nimport { injectAuth } from './auth'\nimport {\n API_INVOKE_ERROR_NAME,\n ErrorKind,\n authError,\n corsError,\n httpError,\n networkError,\n parseError,\n timeoutError,\n} from './errors'\n\nconst ABORT_ERROR_NAME = 'AbortError'\nconst OPAQUE_RESPONSE_TYPE = 'opaque'\nconst NO_CORS_MODE = 'no-cors'\nconst JSON_SUFFIX = '+json'\nconst XML_SUBTYPE = '/xml'\nconst XML_SUFFIX = '+xml'\n\n/**\n * Options for {@link buildRequest} — only request-construction concerns, no runtime/execution options.\n */\nexport interface BuildRequestOptions {\n /** Authentication credentials to inject into the request. */\n auth?: Auth | Auth[]\n /** Override the Accept header. Defaults to `operation.responseContentType` or `'application/json'`. */\n accept?: string\n}\n\n/**\n * Options for {@link executeOperation} and {@link executeOperationStream}.\n * Extends {@link BuildRequestOptions} with runtime and execution concerns.\n */\nexport interface ExecuteOptions extends BuildRequestOptions {\n /** Middleware pipeline applied to the request/response. */\n middleware?: Middleware[]\n /** Custom fetch implementation. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** If false, return ExecutionResult for all HTTP errors instead of throwing. Client-side errors (CORS, network, timeout) always throw regardless. Default: true. */\n throwOnHttpError?: boolean\n /** Timeout in milliseconds. 0 = no timeout (default). */\n timeoutMs?: number\n /** AbortSignal to cancel the request. */\n signal?: AbortSignal\n /** Redirect behavior passed to fetch. Unset by default (fetch implementations typically default to 'follow'). */\n redirect?: RequestInit['redirect']\n /** Extra headers to merge into the request. Applied after buildRequest, so they override spec-derived headers. */\n headers?: Record<string, string>\n}\n\nexport type { BuiltRequest }\n\n/**\n * Build a request without executing it (dry-run / preview).\n * Validates parameters, assembles the body, and injects auth — but does not send.\n *\n * @param baseUrl - Base URL for the API (e.g. 'https://api.example.com/v1')\n * @param operation - The operation to build a request for\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Auth and accept header overrides\n * @returns A fully constructed request ready to inspect or send manually\n * @throws {Error} If required parameters are missing\n * @throws {TypeError} If the URL is malformed when using query-based API key auth\n */\nexport function buildRequest(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: BuildRequestOptions = {},\n): BuiltRequest {\n // Validate required parameters\n const missing = operation.parameters\n .filter(p => p.required && args[p.name] === undefined)\n .map(p => p.name)\n if (missing.length > 0) {\n throw new Error(\n `Missing required parameter${missing.length > 1 ? 's' : ''}: ${missing.join(', ')} for operation \"${operation.id}\"`\n )\n }\n\n // Build URL and headers\n let url = buildUrl(baseUrl, operation, args)\n const method = operation.method.toUpperCase()\n\n const accept = options.accept || operation.responseContentType || ContentType.JSON\n const headers: Record<string, string> = {\n [HeaderName.ACCEPT]: accept,\n ...extractHeaderParams(operation.parameters, args),\n }\n\n // Inject cookie parameters as Cookie header\n const cookieHeader = extractCookieParams(operation.parameters, args)\n if (cookieHeader) {\n headers[HeaderName.COOKIE] = cookieHeader\n }\n\n // Assemble body: explicit 'body' arg > buildBody hook (protocol adapters) > flat-arg assembly\n let bodyData = args['body']\n const allowsBody = method !== HttpMethod.GET && method !== HttpMethod.HEAD && method !== HttpMethod.OPTIONS\n if (!bodyData && operation.buildBody && allowsBody) {\n bodyData = operation.buildBody(args)\n } else if (!bodyData && operation.requestBody && allowsBody) {\n const bodyProps = operation.requestBody.schema.properties\n if (bodyProps) {\n const assembled: Record<string, unknown> = {}\n for (const propName of Object.keys(bodyProps)) {\n if (args[propName] !== undefined) {\n assembled[propName] = args[propName]\n }\n }\n if (Object.keys(assembled).length > 0) {\n bodyData = assembled\n }\n }\n }\n\n // Serialize body based on content type\n let body: string | FormData | undefined\n if (bodyData && allowsBody) {\n const contentType = operation.requestBody?.contentType ?? ContentType.JSON\n\n if (contentType === ContentType.FORM_URLENCODED) {\n const params = new URLSearchParams()\n const obj = typeof bodyData === 'object' && bodyData !== null ? bodyData as Record<string, unknown> : {}\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value))\n }\n }\n body = params.toString()\n headers[HeaderName.CONTENT_TYPE] = ContentType.FORM_URLENCODED\n } else if (contentType === ContentType.MULTIPART) {\n if (typeof bodyData !== 'object' || bodyData === null) {\n throw new Error(\n `Multipart/form-data body for operation \"${operation.id}\" must be an object, got ${typeof bodyData}`\n )\n }\n const formData = new FormData()\n const obj = bodyData as Record<string, unknown>\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) continue\n if (value instanceof Blob) {\n const filename = value instanceof File ? value.name : key\n formData.append(key, value, filename)\n } else if (value instanceof ArrayBuffer) {\n formData.append(key, new Blob([value]), key)\n } else if (ArrayBuffer.isView(value)) {\n formData.append(key, new Blob([new Uint8Array(value.buffer as ArrayBuffer, value.byteOffset, value.byteLength)]), key)\n } else {\n formData.append(key, String(value))\n }\n }\n body = formData\n // Do NOT set Content-Type — fetch auto-sets it with the multipart boundary\n } else {\n body = typeof bodyData === 'string' ? bodyData : JSON.stringify(bodyData)\n headers[HeaderName.CONTENT_TYPE] = ContentType.JSON\n }\n }\n\n // Inject auth\n if (options.auth) {\n const authed = injectAuth(url, headers, options.auth)\n url = authed.url\n Object.assign(headers, authed.headers)\n }\n\n return { method, url, headers, body }\n}\n\n/**\n * Shared fetch pipeline: buildRequest → extra headers → abort signal → request middleware → fetch → response middleware.\n * Used by both executeOperation() and executeOperationStream().\n */\nasync function executeFetch(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions,\n): Promise<{ response: Response; request: BuiltRequest; headers: Record<string, string>; elapsedMs: number }> {\n const fetchFn = options.fetch ?? globalThis.fetch\n\n let { method, url, headers, body } = buildRequest(baseUrl, operation, args, {\n auth: options.auth,\n accept: options.accept,\n })\n\n // Merge extra headers (overrides spec-derived headers)\n if (options.headers) {\n Object.assign(headers, options.headers)\n }\n\n // Build abort signal (timeout + caller signal)\n let signal: AbortSignal | undefined = options.signal\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n let abortHandler: (() => void) | undefined\n\n if (options.timeoutMs && options.timeoutMs > 0) {\n const controller = new AbortController()\n timeoutId = setTimeout(() => controller.abort(), options.timeoutMs)\n\n if (options.signal) {\n // Combine caller signal with timeout signal\n abortHandler = () => controller.abort()\n options.signal.addEventListener('abort', abortHandler, { once: true })\n }\n signal = controller.signal\n }\n\n let init: RequestInit = { method, headers, body, signal, redirect: options.redirect }\n\n // Apply request middleware\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onRequest) {\n const result = await mw.onRequest(url, init)\n url = result.url\n init = result.init\n }\n }\n }\n\n // Execute\n const start = performance.now()\n let response: Response\n\n try {\n response = await fetchFn(url, init)\n } catch (error) {\n if (timeoutId) clearTimeout(timeoutId)\n if (abortHandler && options.signal) options.signal.removeEventListener('abort', abortHandler)\n\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onError) {\n const normalized = error instanceof Error ? error : new Error(String(error))\n try { mw.onError(normalized) } catch (mwError) {\n console.warn(`[api-invoke] middleware \"${mw.name ?? 'unnamed'}\" onError handler threw (suppressed):`, mwError)\n }\n }\n }\n }\n\n // Abort errors (timeout or caller cancellation)\n if (error instanceof DOMException && error.name === ABORT_ERROR_NAME) {\n if (options.timeoutMs && options.timeoutMs > 0) {\n throw timeoutError(url)\n }\n throw error // Caller-initiated abort — re-throw as-is\n }\n\n if (error instanceof TypeError) {\n // TypeError: Failed to fetch — CORS or network issue\n // Heuristic: try no-cors to distinguish (browser-only, skip in Node.js)\n if (typeof window !== 'undefined') {\n try {\n const probe = await fetchFn(url, { mode: NO_CORS_MODE })\n if (probe.type === OPAQUE_RESPONSE_TYPE) throw corsError(url)\n } catch (probeError) {\n // Re-throw if the probe identified a CORS error; swallow other probe failures\n if (probeError instanceof Error && probeError.name === API_INVOKE_ERROR_NAME) throw probeError\n }\n }\n throw networkError(url)\n }\n throw networkError(url)\n }\n\n if (timeoutId) clearTimeout(timeoutId)\n if (abortHandler && options.signal) options.signal.removeEventListener('abort', abortHandler)\n const elapsedMs = Math.round(performance.now() - start)\n\n // Apply response middleware\n if (options.middleware) {\n for (const mw of options.middleware) {\n if (mw.onResponse) {\n response = await mw.onResponse(response)\n }\n }\n }\n\n // Collect response headers\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n\n return { response, request: { method, url, headers, body }, headers: responseHeaders, elapsedMs }\n}\n\n/**\n * Execute an API call for an operation with arguments.\n * Builds the URL, injects auth, applies middleware, and classifies errors.\n *\n * @param baseUrl - Base URL for the API\n * @param operation - The operation to execute\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Execution options (auth, middleware, fetch, timeout, error behavior)\n * @returns The execution result with parsed response data\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and (by default) HTTP errors\n */\nexport async function executeOperation(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions = {},\n): Promise<ExecutionResult> {\n const { response, request, headers: responseHeaders, elapsedMs } = await executeFetch(baseUrl, operation, args, options)\n const { method, url, headers, body } = request\n\n // Parse response body based on content type\n // Handles JSON (including +json variants like application/vnd.api+json), binary, XML, and unknown types (JSON attempted, falling back to text)\n let data: unknown\n const contentType = response.headers.get(HeaderName.CONTENT_TYPE) || ''\n if (contentType.includes(ContentType.JSON) || contentType.includes(JSON_SUFFIX)) {\n const cloned = response.clone()\n try {\n data = await response.json()\n } catch (jsonError) {\n if (options.throwOnHttpError !== false) throw parseError(url)\n console.warn('[api-invoke] JSON parse failed, falling back to text:', jsonError)\n try {\n data = await cloned.text()\n } catch {\n // Body unreadable is a client-side failure — throw even in non-throwing mode\n throw parseError(url)\n }\n }\n } else if (isBinaryContentType(contentType)) {\n try {\n data = await response.arrayBuffer()\n } catch {\n throw parseError(url, 'binary')\n }\n } else if (contentType.includes(XML_SUBTYPE) || contentType.includes(XML_SUFFIX)) {\n try {\n data = await response.text()\n } catch {\n throw parseError(url, 'XML')\n }\n } else {\n let text: string\n try {\n text = await response.text()\n } catch {\n throw parseError(url, 'text')\n }\n // Try JSON parsing for responses without proper content-type\n try {\n data = JSON.parse(text)\n } catch {\n data = text\n }\n }\n\n const result: ExecutionResult = {\n status: response.status,\n data,\n contentType,\n headers: responseHeaders,\n request: { method, url, headers, body },\n elapsedMs,\n }\n\n // Check for HTTP errors\n if (options.throwOnHttpError !== false) {\n if (response.status === 401 || response.status === 403) {\n throw authError(url, response.status as 401 | 403, data)\n }\n if (!response.ok) {\n throw httpError(url, response.status, response.statusText, data)\n }\n } else if (!response.ok) {\n // Non-throwing mode: classify the error for programmatic handling\n if (response.status === 401 || response.status === 403) {\n result.errorKind = ErrorKind.AUTH\n } else if (response.status === 429) {\n result.errorKind = ErrorKind.RATE_LIMIT\n } else {\n result.errorKind = ErrorKind.HTTP\n }\n }\n\n return result\n}\n\n/**\n * Execute a raw HTTP request without an API spec (Tier 3: zero spec).\n * Still provides error classification, response parsing, and timing.\n *\n * @param url - Full URL to request\n * @param options - Request options (method, headers, body, auth, middleware)\n * @returns The execution result with parsed response data\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and (by default) HTTP errors\n */\nexport async function executeRaw(\n url: string,\n options: {\n method?: string\n headers?: Record<string, string>\n body?: string\n auth?: Auth | Auth[]\n middleware?: Middleware[]\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n signal?: AbortSignal\n accept?: string\n redirect?: RequestInit['redirect']\n } = {},\n): Promise<ExecutionResult> {\n // Create a synthetic operation for the raw request\n const operation: Operation = {\n id: 'raw',\n path: '',\n method: options.method ?? HttpMethod.GET,\n parameters: [],\n tags: [],\n }\n\n return executeOperation(url, operation, { body: options.body }, {\n auth: options.auth,\n middleware: options.middleware,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n accept: options.accept,\n redirect: options.redirect,\n headers: options.headers,\n })\n}\n\n/**\n * Execute an API call and return a streaming async iterable of SSE events.\n * Errors always throw (no non-throwing mode for streams).\n *\n * @param baseUrl - Base URL for the API\n * @param operation - The operation to execute\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Execution options, plus optional `onEvent` callback for each SSE event\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and HTTP errors\n */\nexport async function executeOperationStream(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n options: ExecuteOptions & { onEvent?: (event: SSEEvent) => void } = {},\n): Promise<StreamingExecutionResult> {\n // Default Accept to SSE when not explicitly set\n const streamOptions: ExecuteOptions = {\n ...options,\n accept: options.accept ?? operation.responseContentType ?? ContentType.SSE,\n }\n\n const { response, request, headers: responseHeaders, elapsedMs } = await executeFetch(baseUrl, operation, args, streamOptions)\n\n // Always throw on HTTP errors for streams\n if (!response.ok) {\n let body: unknown\n try {\n const text = await response.text()\n try { body = JSON.parse(text) } catch { body = text }\n } catch (readError) {\n body = `[api-invoke: failed to read error response body: ${readError instanceof Error ? readError.message : String(readError)}]`\n }\n if (response.status === 401 || response.status === 403) {\n throw authError(request.url, response.status as 401 | 403, body)\n }\n throw httpError(request.url, response.status, response.statusText, body)\n }\n\n if (!response.body) {\n throw parseError(request.url, 'SSE (response body is null)')\n }\n\n const contentType = response.headers.get(HeaderName.CONTENT_TYPE) || ''\n\n // Warn if the response is not SSE — the server may have ignored the Accept header\n if (contentType && !contentType.includes('text/event-stream')) {\n console.warn(`[api-invoke] Expected content-type text/event-stream but got \"${contentType}\" — SSE parsing may produce unexpected results`)\n }\n\n // Wrap SSE parser with optional onEvent callback\n let stream: AsyncIterable<SSEEvent> = parseSSE(response.body)\n if (options.onEvent) {\n const inner = stream\n const onEvent = options.onEvent\n stream = (async function* () {\n for await (const event of inner) {\n try {\n onEvent(event)\n } catch (callbackError) {\n throw new Error(\n `onEvent callback threw for event \"${event.event ?? 'message'}\": ${callbackError instanceof Error ? callbackError.message : String(callbackError)}`,\n { cause: callbackError },\n )\n }\n yield event\n }\n })()\n }\n\n return {\n status: response.status,\n stream,\n contentType,\n headers: responseHeaders,\n request,\n elapsedMs,\n }\n}\n\n/**\n * Execute a raw streaming HTTP request without an API spec (Tier 3: zero spec).\n * Returns an async iterable of SSE events.\n *\n * @param url - Full URL to request\n * @param options - Request options (method, headers, body, auth, middleware, onEvent callback)\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, parse, and HTTP errors\n */\nexport async function executeRawStream(\n url: string,\n options: {\n method?: string\n headers?: Record<string, string>\n body?: string\n auth?: Auth | Auth[]\n middleware?: Middleware[]\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n signal?: AbortSignal\n accept?: string\n redirect?: RequestInit['redirect']\n onEvent?: (event: SSEEvent) => void\n } = {},\n): Promise<StreamingExecutionResult> {\n const operation: Operation = {\n id: 'raw-stream',\n path: '',\n method: options.method ?? HttpMethod.POST,\n parameters: [],\n tags: [],\n }\n\n return executeOperationStream(url, operation, { body: options.body }, {\n auth: options.auth,\n middleware: options.middleware,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n accept: options.accept,\n redirect: options.redirect,\n headers: options.headers,\n onEvent: options.onEvent,\n })\n}\n\nconst BINARY_CONTENT_PATTERNS = [\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n 'audio/',\n 'image/',\n 'video/',\n]\n\nfunction isBinaryContentType(contentType: string): boolean {\n return BINARY_CONTENT_PATTERNS.some(p => contentType.includes(p))\n}\n","import type { SSEEvent } from './types'\n\n/**\n * Parse a Server-Sent Events stream into an async iterable of events.\n * Implements the WHATWG SSE parsing algorithm.\n *\n * @param body - ReadableStream from a fetch response (e.g. `response.body`)\n * @returns Async generator yielding parsed {@link SSEEvent} objects\n * @throws {Error} If the stream contains invalid UTF-8 data\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncGenerator<SSEEvent> {\n const reader = body.getReader()\n const decoder = new TextDecoder('utf-8', { fatal: true })\n let buffer = ''\n\n // Event accumulator\n let eventType: string | undefined\n let dataLines: string[] = []\n let id: string | undefined\n let retry: number | undefined\n let hasData = false\n\n function buildEvent(): SSEEvent {\n const event: SSEEvent = { data: dataLines.join('\\n') }\n if (eventType !== undefined) event.event = eventType\n if (id !== undefined) event.id = id\n if (retry !== undefined) event.retry = retry\n return event\n }\n\n function resetAccumulator(): void {\n eventType = undefined\n dataLines = []\n id = undefined\n retry = undefined\n hasData = false\n }\n\n function processLine(line: string): SSEEvent | undefined {\n // Empty line: dispatch event\n if (line === '') {\n if (hasData) {\n const event = buildEvent()\n resetAccumulator()\n return event\n }\n resetAccumulator()\n return undefined\n }\n\n // Comment\n if (line[0] === ':') return undefined\n\n // Parse field\n const colonIdx = line.indexOf(':')\n let field: string\n let value: string\n\n if (colonIdx === -1) {\n field = line\n value = ''\n } else {\n field = line.slice(0, colonIdx)\n // Strip one leading space after colon per spec\n value = line[colonIdx + 1] === ' ' ? line.slice(colonIdx + 2) : line.slice(colonIdx + 1)\n }\n\n switch (field) {\n case 'data':\n dataLines.push(value)\n hasData = true\n break\n case 'event':\n eventType = value\n break\n case 'id':\n // Per WHATWG spec, ignore id fields containing U+0000 NULL\n if (!value.includes('\\0')) id = value\n break\n case 'retry': {\n // Per WHATWG spec, retry must consist of only ASCII digits (non-negative integer)\n const n = parseInt(value, 10)\n if (!isNaN(n) && n >= 0 && String(n) === value) retry = n\n break\n }\n // Unknown fields are ignored per spec\n }\n\n return undefined\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n try {\n buffer += decoder.decode(value, { stream: true })\n } catch (decodeError) {\n throw new Error('SSE stream contains invalid UTF-8 data', { cause: decodeError })\n }\n\n // Split on \\r\\n, \\r, or \\n — handle all line endings\n // Process complete lines, keep incomplete last segment in buffer\n // If buffer ends with \\r, keep it — next chunk may start with \\n (CRLF)\n let startIdx = 0\n const limit = buffer.length - (buffer[buffer.length - 1] === '\\r' ? 1 : 0)\n for (let i = 0; i < limit; i++) {\n if (buffer[i] === '\\r' || buffer[i] === '\\n') {\n const line = buffer.slice(startIdx, i)\n // Skip \\n after \\r (CRLF)\n if (buffer[i] === '\\r' && buffer[i + 1] === '\\n') i++\n startIdx = i + 1\n\n const event = processLine(line)\n if (event) yield event\n }\n }\n buffer = buffer.slice(startIdx)\n }\n\n // Flush remaining buffer\n try {\n buffer += decoder.decode()\n } catch (decodeError) {\n throw new Error('SSE stream contains invalid UTF-8 data', { cause: decodeError })\n }\n if (buffer.length > 0) {\n const event = processLine(buffer)\n if (event) yield event\n }\n // Dispatch any accumulated event at stream end\n if (hasData) yield buildEvent()\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * URL and parameter construction utilities.\n * Handles path parameter interpolation, query params, header params, cookie params, and slash normalization.\n */\n\nimport type { Operation, Parameter } from './types'\nimport { ParamLocation } from './types'\n\n/**\n * Build a full URL from base URL, operation path, and arguments.\n * Handles path parameter interpolation, query parameter serialization, and slash normalization.\n *\n * @param baseUrl - Base URL for the API (e.g. 'https://api.example.com/v1')\n * @param operation - The operation containing path template and parameter definitions\n * @param args - Key-value pairs for path and query parameters\n * @returns Fully resolved URL string with parameters substituted\n */\nexport function buildUrl(\n baseUrl: string,\n operation: Operation,\n args: Record<string, unknown>,\n): string {\n // Interpolate path parameters\n let path = operation.path\n for (const param of operation.parameters) {\n if (param.in === ParamLocation.PATH && args[param.name] !== undefined) {\n path = path.replace(\n `{${param.name}}`,\n encodeURIComponent(String(args[param.name])),\n )\n }\n }\n\n // Join base URL and path, avoiding double slashes\n const fullBase = baseUrl.replace(/\\/$/, '')\n const fullPath = path.startsWith('/') ? path : `/${path}`\n const url = new URL(`${fullBase}${fullPath}`)\n\n // Append query parameters (with defaults, array/object serialization)\n for (const param of operation.parameters) {\n if (param.in === ParamLocation.QUERY) {\n const value = args[param.name] ?? param.schema.default\n if (value !== undefined && value !== null) {\n serializeQueryParam(url, param.name, value)\n }\n }\n }\n\n return url.toString()\n}\n\n/**\n * Derive a base URL from a spec URL by stripping the filename.\n * e.g., `\"https://api.example.com/v1/openapi.json\"` → `\"https://api.example.com/v1\"`\n *\n * @param specUrl - URL pointing to an API spec file\n * @returns Base URL with the filename removed, or empty string if the URL is invalid\n */\nexport function deriveBaseUrl(specUrl: string): string {\n try {\n const u = new URL(specUrl)\n u.pathname = u.pathname.replace(/\\/[^/]*$/, '')\n const base = u.origin + u.pathname\n return base.replace(/\\/$/, '')\n } catch {\n return ''\n }\n}\n\n/**\n * Extract header parameters from operation args.\n *\n * @param parameters - Operation parameter definitions\n * @param args - Key-value pairs of argument values\n * @returns Headers object with only the header-type parameters that have values\n */\nexport function extractHeaderParams(\n parameters: Parameter[],\n args: Record<string, unknown>,\n): Record<string, string> {\n const headers: Record<string, string> = {}\n for (const param of parameters) {\n if (param.in === ParamLocation.HEADER && args[param.name] !== undefined) {\n headers[param.name] = String(args[param.name])\n }\n }\n return headers\n}\n\n/**\n * Extract cookie parameters from operation args as a Cookie header value.\n * Uses schema defaults when the arg is not explicitly supplied.\n *\n * @param parameters - Operation parameter definitions\n * @param args - Key-value pairs of argument values\n * @returns Cookie header string (e.g. 'name=value; other=val'), or undefined if no cookie params are present\n */\nexport function extractCookieParams(\n parameters: Parameter[],\n args: Record<string, unknown>,\n): string | undefined {\n const cookies: string[] = []\n for (const param of parameters) {\n if (param.in === ParamLocation.COOKIE) {\n const value = args[param.name] ?? param.schema.default\n if (value !== undefined && value !== null) {\n cookies.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(String(value))}`)\n }\n }\n }\n return cookies.length > 0 ? cookies.join('; ') : undefined\n}\n\n/**\n * Serialize a query parameter value onto a URL.\n * Arrays use comma-separated format (OpenAPI \"form\" style, explode=false).\n * Objects use comma-separated key,value pairs (OpenAPI \"form\" style, explode=false).\n * DeepObject style (e.g. filter[key]=value) is not yet supported.\n */\nfunction serializeQueryParam(url: URL, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n url.searchParams.set(name, value.map(String).join(','))\n } else if (typeof value === 'object' && value !== null) {\n const pairs = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => {\n if (typeof v === 'object' && v !== null) {\n throw new Error(\n `Cannot serialize nested object for query parameter \"${name}.${k}\". Only flat key-value objects are supported.`\n )\n }\n if (typeof v === 'symbol' || typeof v === 'function') {\n throw new Error(\n `Cannot serialize ${typeof v} value for query parameter \"${name}.${k}\". Use a string or number.`\n )\n }\n return `${k},${String(v)}`\n })\n url.searchParams.set(name, pairs.join(','))\n } else {\n url.searchParams.set(name, String(value))\n }\n}\n","/**\n * Authentication injection into HTTP requests.\n * Supports Bearer, Basic, API Key (header/query), OAuth2, and Cookie.\n */\n\nimport type { Auth } from './types'\nimport { AuthType, HeaderName, ParamLocation } from './types'\nimport { ApiInvokeError, ErrorKind } from './errors'\n\n/**\n * A request with authentication applied (URL may be modified for query-based auth).\n */\nexport interface AuthenticatedRequest {\n /** URL, potentially modified with query-based auth parameters. */\n url: string\n /** Headers with auth credentials injected. */\n headers: Record<string, string>\n}\n\n/**\n * Inject authentication credentials into a request URL and headers.\n * Accepts a single Auth or an array for composing multiple schemes (e.g. API key + bearer).\n *\n * @param url - The request URL\n * @param headers - Existing request headers (shallow-copied internally)\n * @param auth - Credentials to inject (single or array)\n * @returns New URL and headers with auth applied\n */\nexport function injectAuth(\n url: string,\n headers: Record<string, string>,\n auth: Auth | Auth[],\n): AuthenticatedRequest {\n if (Array.isArray(auth)) {\n // Apply auth schemes in order. Later entries override earlier ones for the same header (e.g. Authorization), but cookie auth appends.\n let result: AuthenticatedRequest = { url, headers: { ...headers } }\n for (const a of auth) {\n result = injectAuth(result.url, result.headers, a)\n }\n return result\n }\n\n const result = { url, headers: { ...headers } }\n\n switch (auth.type) {\n case AuthType.BEARER:\n result.headers[HeaderName.AUTHORIZATION] = `Bearer ${auth.token}`\n break\n\n case AuthType.BASIC: {\n // btoa is available in all modern browsers and Node 16+\n const encoded = btoa(`${auth.username}:${auth.password}`)\n result.headers[HeaderName.AUTHORIZATION] = `Basic ${encoded}`\n break\n }\n\n case AuthType.API_KEY:\n if (auth.location === ParamLocation.HEADER) {\n result.headers[auth.name] = auth.value\n } else if (auth.location === ParamLocation.QUERY) {\n const u = new URL(url)\n u.searchParams.set(auth.name, auth.value)\n result.url = u.toString()\n }\n break\n\n case AuthType.OAUTH2:\n result.headers[HeaderName.AUTHORIZATION] = `Bearer ${auth.accessToken}`\n break\n\n case AuthType.COOKIE: {\n const existing = result.headers[HeaderName.COOKIE]\n const cookie = `${encodeURIComponent(auth.name)}=${encodeURIComponent(auth.value)}`\n result.headers[HeaderName.COOKIE] = existing ? `${existing}; ${cookie}` : cookie\n break\n }\n }\n\n return result\n}\n\n/** Result from an OAuth2 token refresh. */\nexport interface OAuth2TokenResult {\n /** The new access token. */\n accessToken: string\n /** A new refresh token, if the server issued one. */\n refreshToken?: string\n /** Token lifetime in seconds, if provided by the server. */\n expiresIn?: number\n}\n\n/**\n * Exchange a refresh token for a new access token at the OAuth2 token endpoint.\n *\n * @param tokenUrl - The OAuth2 token endpoint URL\n * @param refreshToken - The refresh token to exchange\n * @param options - Optional client credentials, scopes, and custom fetch\n * @returns The new token set\n * @throws {ApiInvokeError} With `kind: 'auth'` if the token endpoint returns a non-OK response or the response is missing `access_token`\n * @throws {ApiInvokeError} With `kind: 'parse'` if the response body is not valid JSON\n */\nexport async function refreshOAuth2Token(\n tokenUrl: string,\n refreshToken: string,\n options?: {\n clientId?: string\n clientSecret?: string\n scopes?: string[]\n fetch?: typeof globalThis.fetch\n },\n): Promise<OAuth2TokenResult> {\n const fetchFn = options?.fetch ?? globalThis.fetch\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n if (options?.clientId) body.set('client_id', options.clientId)\n if (options?.clientSecret) body.set('client_secret', options.clientSecret)\n if (options?.scopes?.length) body.set('scope', options.scopes.join(' '))\n\n const response = await fetchFn(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!response.ok) {\n let errorDetail = ''\n try {\n const body = await response.text()\n errorDetail = body ? `: ${body.slice(0, 500)}` : ''\n } catch (bodyReadError) {\n errorDetail = ` (error body unreadable: ${bodyReadError instanceof Error ? bodyReadError.message : String(bodyReadError)})`\n }\n throw new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: `OAuth2 token refresh failed: ${response.status} ${response.statusText}${errorDetail}`,\n suggestion: 'Check the refresh token, client credentials, and token endpoint URL.',\n retryable: response.status >= 500,\n status: response.status,\n })\n }\n\n let data: Record<string, unknown>\n try {\n data = await response.json() as Record<string, unknown>\n } catch (parseError) {\n throw new ApiInvokeError({\n kind: ErrorKind.PARSE,\n message: `OAuth2 token refresh succeeded (${response.status}) but response body is not valid JSON`,\n suggestion: 'The token endpoint returned a non-JSON response. Verify the endpoint URL.',\n retryable: false,\n })\n }\n\n const accessToken = data.access_token\n if (typeof accessToken !== 'string' || !accessToken) {\n throw new ApiInvokeError({\n kind: ErrorKind.AUTH,\n message: `OAuth2 token refresh response missing required \"access_token\" field. Got keys: [${Object.keys(data).join(', ')}]`,\n suggestion: 'The token endpoint response did not include a valid access_token. Verify the endpoint and grant type.',\n retryable: false,\n })\n }\n\n return {\n accessToken,\n refreshToken: typeof data.refresh_token === 'string' && data.refresh_token ? data.refresh_token : undefined,\n expiresIn: typeof data.expires_in === 'number' ? data.expires_in : undefined,\n }\n}\n\n/**\n * Mask credential values for safe logging. Shows the auth type and a redacted value.\n *\n * @param auth - The auth credentials to mask\n * @returns A human-readable string with sensitive values replaced by `***`\n */\nexport function maskAuth(auth: Auth): string {\n switch (auth.type) {\n case AuthType.BEARER: {\n if (auth.token.length <= 4) return 'Bearer ***'\n return `Bearer ${auth.token.substring(0, 4)}***`\n }\n case AuthType.BASIC:\n return `Basic ${auth.username}:***`\n case AuthType.API_KEY:\n return `${auth.name}: ***`\n case AuthType.OAUTH2:\n return `OAuth2 ***`\n case AuthType.COOKIE:\n return `Cookie ${auth.name}=***`\n }\n}\n","/**\n * Parse OpenAPI 2.0/3.x specs into the spec-agnostic ParsedAPI format.\n * Extracted and consolidated from api2aux/semantic-analysis.\n */\n\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\nimport type {\n ParsedAPI,\n Operation,\n Parameter,\n ParameterSchema,\n RequestBody,\n RequestBodySchema,\n RequestBodyProperty,\n} from '../../core/types'\nimport { ContentType, ParamLocation, SpecFormat } from '../../core/types'\nimport { extractOpenAPI3BaseUrl, extractSwagger2BaseUrl } from './base-url'\nimport { mapSecuritySchemes } from './security'\nimport { deriveBaseUrl } from '../../core/url-builder'\n\n/** Standard HTTP methods parsed from OpenAPI path items. */\nconst SUPPORTED_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'] as const\n\n/**\n * Normalize an OpenAPI schema type field to a single type string.\n * Handles 3.1 type arrays (e.g. `[\"string\", \"null\"]`) by picking the first non-null entry,\n * passes through plain strings, and falls back to the provided default for missing/unrecognized values.\n *\n * @param type - The type field from an OpenAPI schema (string, array, or undefined)\n * @param fallback - Fallback type when the value is missing or unrecognized (default: 'string')\n * @returns A single type string\n */\nexport function normalizeType(type: unknown, fallback = 'string'): string {\n if (Array.isArray(type)) {\n const nonNull = type.filter((t: string) => t !== 'null')\n return nonNull[0] ?? fallback\n }\n if (typeof type === 'string') return type\n return fallback\n}\n\n/**\n * Parse an OpenAPI 2.0 (Swagger) or 3.x spec into a spec-agnostic {@link ParsedAPI}.\n * Handles dereferencing, operation extraction, auth scheme mapping, and base URL resolution.\n *\n * @param specUrlOrObject - URL string pointing to a spec, or a pre-parsed spec object\n * @param options - Parse options\n * @param options.specUrl - Original spec URL (used for base URL fallback when spec has no servers/host field)\n * @returns A normalized ParsedAPI with all operations, auth schemes, and metadata\n * @throws {Error} If the spec cannot be fetched, parsed, or dereferenced\n */\nexport async function parseOpenAPISpec(\n specUrlOrObject: string | object,\n options?: { specUrl?: string },\n): Promise<ParsedAPI> {\n try {\n let apiRaw: unknown\n try {\n apiRaw = await SwaggerParser.dereference(specUrlOrObject as string)\n } catch {\n // Fallback: parse without resolving $refs (handles specs with broken references)\n apiRaw = await SwaggerParser.parse(specUrlOrObject as string)\n }\n const api = apiRaw as unknown as OpenAPIV3.Document | OpenAPIV2.Document\n\n const isOpenAPI3 = 'openapi' in api\n const specVersion = isOpenAPI3\n ? (api as OpenAPIV3.Document).openapi\n : (api as OpenAPIV2.Document).swagger\n\n const title = api.info.title\n const version = api.info.version\n\n const sourceUrl = options?.specUrl ?? (typeof specUrlOrObject === 'string' ? specUrlOrObject : undefined)\n\n let baseUrl = isOpenAPI3\n ? extractOpenAPI3BaseUrl(api as OpenAPIV3.Document, sourceUrl)\n : extractSwagger2BaseUrl(api as OpenAPIV2.Document)\n\n // Fallback: derive base URL from spec URL when spec doesn't provide one\n if (!baseUrl && sourceUrl) {\n baseUrl = deriveBaseUrl(sourceUrl)\n }\n\n const operations = extractOperations(api, isOpenAPI3)\n\n // Fix path overlap: when the resolved base URL has a path (e.g., /api/1)\n // and operation paths also start with that path (e.g., /api/1/metastore/...),\n // strip the overlapping prefix from operation paths to avoid duplication.\n if (baseUrl) {\n try {\n const basePath = new URL(baseUrl).pathname.replace(/\\/$/, '')\n if (basePath && basePath !== '/') {\n const allOverlap = operations.length > 0 && operations.every(\n op => op.path === basePath || op.path.startsWith(basePath + '/')\n )\n if (allOverlap) {\n for (const op of operations) {\n op.path = op.path.slice(basePath.length) || '/'\n }\n }\n }\n } catch { /* ignore invalid base URL */ }\n }\n\n const authSchemes = extractSecuritySchemes(api, isOpenAPI3)\n\n return {\n title,\n version,\n baseUrl,\n operations,\n authSchemes,\n specFormat: isOpenAPI3 ? SpecFormat.OPENAPI_3 : SpecFormat.OPENAPI_2,\n rawSpecVersion: specVersion,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n const urlInfo = typeof specUrlOrObject === 'string' ? ` from ${specUrlOrObject}` : ''\n throw new Error(`Failed to parse OpenAPI spec${urlInfo}: ${message}`, { cause: error })\n }\n}\n\nfunction extractOperations(\n api: OpenAPIV3.Document | OpenAPIV2.Document,\n isOpenAPI3: boolean,\n): Operation[] {\n const operations: Operation[] = []\n if (!api.paths) return operations\n\n for (const [path, pathItem] of Object.entries(api.paths)) {\n if (!pathItem) continue\n const pathLevelParams = 'parameters' in pathItem ? pathItem.parameters ?? [] : []\n\n for (const method of SUPPORTED_METHODS) {\n if (!(method in pathItem) || !(pathItem as Record<string, unknown>)[method]) continue\n\n const op = (pathItem as Record<string, unknown>)[method] as OpenAPIV3.OperationObject | OpenAPIV2.OperationObject\n const operationParams = op.parameters ?? []\n const allParams = [...pathLevelParams, ...operationParams].filter(\n (p) => (p as { in: string }).in !== 'body', // 'body' is a Swagger 2.0-specific location, not in ParamLocation\n )\n\n const parameters = allParams.map((param) =>\n parseParameter(param as OpenAPIV3.ParameterObject | OpenAPIV2.Parameter, isOpenAPI3),\n )\n\n const requestBody = extractRequestBody(op, isOpenAPI3)\n const { primary: responseSchema, all: responseSchemas } = extractResponseSchemas(op, isOpenAPI3)\n const responseContentType = extractResponseContentType(op, isOpenAPI3)\n const errorHints = extractErrorHints(op)\n const security = extractOperationSecurity(op, api)\n\n // Generate a stable ID from operationId or method+path\n const id = op.operationId\n ?? `${method}_${path.replace(/[{}\\/]/g, '_').replace(/^_|_$/g, '').replace(/_+/g, '_')}`\n\n operations.push({\n id,\n path,\n method: method.toUpperCase(),\n summary: op.summary,\n description: op.description,\n parameters,\n requestBody,\n responseSchema,\n responseSchemas: Object.keys(responseSchemas).length > 0 ? responseSchemas : undefined,\n responseContentType,\n errorHints,\n tags: op.tags ?? [],\n security,\n })\n }\n }\n\n return operations\n}\n\nfunction extractOperationSecurity(\n op: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n api: OpenAPIV3.Document | OpenAPIV2.Document,\n): string[][] | undefined {\n // Per-operation security overrides global\n if ('security' in op && op.security !== undefined) {\n return (op.security as Record<string, string[]>[]).map(req => Object.keys(req))\n }\n // Fall back to global security\n if ('security' in api && api.security !== undefined) {\n return (api.security as Record<string, string[]>[]).map(req => Object.keys(req))\n }\n return undefined\n}\n\nfunction parseParameter(\n param: OpenAPIV3.ParameterObject | OpenAPIV2.Parameter,\n isOpenAPI3: boolean,\n): Parameter {\n const name = param.name\n const location = param.in as ParamLocation\n const required = param.required ?? location === ParamLocation.PATH\n const description = param.description ?? ''\n\n let schema: ParameterSchema\n\n if (isOpenAPI3) {\n const p = param as OpenAPIV3.ParameterObject\n const s = p.schema as OpenAPIV3.SchemaObject | undefined\n schema = {\n type: normalizeType(s?.type),\n format: s?.format,\n enum: s?.enum,\n default: s?.default,\n example: p.example ?? s?.example,\n minimum: s?.minimum,\n maximum: s?.maximum,\n maxLength: s?.maxLength,\n // TODO: extract s?.items for array parameters (ParameterSchema.items)\n }\n } else {\n const p = param as OpenAPIV2.GeneralParameterObject\n schema = {\n type: ('type' in p ? p.type : undefined) ?? 'string',\n format: 'format' in p ? p.format : undefined,\n enum: 'enum' in p ? p.enum : undefined,\n default: 'default' in p ? p.default : undefined,\n example: 'x-example' in p ? (p as Record<string, unknown>)['x-example'] : undefined,\n minimum: 'minimum' in p ? p.minimum : undefined,\n maximum: 'maximum' in p ? p.maximum : undefined,\n maxLength: 'maxLength' in p ? p.maxLength : undefined,\n // TODO: extract p.items for array parameters (ParameterSchema.items)\n }\n }\n\n return { name, in: location, required, description, schema }\n}\n\n/** Content types to try, in priority order. */\nconst CONTENT_TYPE_PRIORITY = [\n ContentType.JSON,\n ContentType.FORM_URLENCODED,\n ContentType.MULTIPART,\n ContentType.XML,\n ContentType.TEXT,\n ContentType.OCTET_STREAM,\n] as const\n\nfunction extractRequestBody(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): RequestBody | undefined {\n if (isOpenAPI3) {\n const op = operation as OpenAPIV3.OperationObject\n if (!op.requestBody) return undefined\n const body = op.requestBody as OpenAPIV3.RequestBodyObject\n if (!body.content) return undefined\n\n // Try content types in priority order\n for (const ct of CONTENT_TYPE_PRIORITY) {\n const mediaType = body.content[ct]\n if (mediaType?.schema) {\n return {\n required: body.required ?? false,\n description: body.description,\n contentType: ct,\n schema: flattenSchema(mediaType.schema as OpenAPIV3.SchemaObject),\n }\n }\n }\n\n // Fallback: use the first available content type\n const firstKey = Object.keys(body.content)[0]\n if (firstKey) {\n const mediaType = body.content[firstKey]\n if (mediaType?.schema) {\n return {\n required: body.required ?? false,\n description: body.description,\n contentType: firstKey,\n schema: flattenSchema(mediaType.schema as OpenAPIV3.SchemaObject),\n }\n }\n }\n\n return undefined\n } else {\n const op = operation as OpenAPIV2.OperationObject\n const bodyParam = op.parameters?.find(\n (p: unknown) => (p as { in: string }).in === 'body',\n ) as OpenAPIV2.InBodyParameterObject | undefined\n if (!bodyParam?.schema) return undefined\n\n // Swagger 2.0: check operation-level consumes for content type\n const consumes = op.consumes ?? []\n let contentType: string = ContentType.JSON\n if (consumes.includes(ContentType.FORM_URLENCODED)) {\n contentType = ContentType.FORM_URLENCODED\n } else if (consumes.includes(ContentType.MULTIPART)) {\n contentType = ContentType.MULTIPART\n } else if (consumes.length > 0) {\n contentType = consumes[0]\n }\n\n return {\n required: bodyParam.required ?? false,\n description: bodyParam.description,\n contentType,\n schema: flattenSchema(bodyParam.schema as unknown as OpenAPIV3.SchemaObject),\n }\n }\n}\n\nfunction flattenSchema(schema: OpenAPIV3.SchemaObject): RequestBodySchema {\n const normalizedType = normalizeType(schema.type, 'object')\n const result: RequestBodySchema = {\n type: normalizedType,\n raw: schema,\n }\n\n if (normalizedType === 'object' && schema.properties) {\n result.properties = {}\n result.required = schema.required\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const prop = propSchema as OpenAPIV3.SchemaObject\n const propType = normalizeType(prop.type)\n const isNested = propType === 'object' || propType === 'array'\n result.properties[name] = {\n type: propType,\n format: prop.format,\n description: prop.description,\n enum: prop.enum,\n default: prop.default,\n example: prop.example,\n nested: isNested || undefined,\n } satisfies RequestBodyProperty\n }\n }\n\n return result\n}\n\n/** Status codes to extract response schemas for (success + default). The primary schema is selected from the success codes in this list; 'default' is collected into responseSchemas but never used as primary. */\nconst RESPONSE_STATUS_CODES = ['200', '201', '202', '204', '2XX', 'default'] as const\n\nfunction extractResponseSchemas(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): { primary: unknown; all: Record<string, unknown> } {\n const responses = operation.responses\n if (!responses) return { primary: undefined, all: {} }\n\n const all: Record<string, unknown> = {}\n for (const code of RESPONSE_STATUS_CODES) {\n const resp = responses[code]\n if (!resp) continue\n\n let schema: unknown\n if (isOpenAPI3) {\n schema = (resp as OpenAPIV3.ResponseObject).content?.[ContentType.JSON]?.schema\n } else {\n schema = (resp as OpenAPIV2.ResponseObject).schema\n }\n if (schema) {\n all[code] = schema\n }\n }\n\n // Primary: first success schema found (204 is excluded since it typically has no body; 'default' is excluded since it often describes errors)\n const primary = all['200'] ?? all['201'] ?? all['202'] ?? all['2XX']\n return { primary, all }\n}\n\n/** Common error status codes to extract descriptions from. */\nconst ERROR_STATUS_CODES = ['400', '401', '403', '404', '409', '422', '429', '500'] as const\n\n/** Extract error response descriptions (not full schemas) for LLM hints. */\nfunction extractErrorHints(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n): Record<string, string> | undefined {\n const responses = operation.responses\n if (!responses) return undefined\n\n const hints: Record<string, string> = {}\n for (const code of ERROR_STATUS_CODES) {\n const resp = responses[code] as OpenAPIV3.ResponseObject | OpenAPIV2.ResponseObject | undefined\n if (!resp?.description) continue\n hints[code] = resp.description\n }\n\n return Object.keys(hints).length > 0 ? hints : undefined\n}\n\nfunction extractResponseContentType(\n operation: OpenAPIV3.OperationObject | OpenAPIV2.OperationObject,\n isOpenAPI3: boolean,\n): string | undefined {\n // Determine response content type from the first available success response\n const responses = operation.responses\n if (!responses) return undefined\n\n const successResponse = responses['200'] ?? responses['201'] ?? responses['202']\n ?? responses['2XX']\n if (!successResponse) return undefined\n\n if (isOpenAPI3) {\n const resp = successResponse as OpenAPIV3.ResponseObject\n if (!resp.content) return undefined\n // Return first content type, preferring application/json\n const types = Object.keys(resp.content)\n if (types.includes(ContentType.JSON)) return ContentType.JSON\n return types[0]\n } else {\n // Swagger 2.0: check operation-level `produces`\n const op = operation as OpenAPIV2.OperationObject\n const produces = op.produces\n if (produces && produces.length > 0) {\n if (produces.includes(ContentType.JSON)) return ContentType.JSON\n return produces[0]\n }\n return undefined // No operation-level produces; caller falls back to default Accept header\n }\n}\n\nfunction extractSecuritySchemes(\n api: OpenAPIV3.Document | OpenAPIV2.Document,\n isOpenAPI3: boolean,\n) {\n if (isOpenAPI3) {\n const openapi3 = api as OpenAPIV3.Document\n const rawSchemes = openapi3.components?.securitySchemes ?? {}\n const schemes: Record<string, OpenAPIV3.SecuritySchemeObject> = {}\n for (const [name, scheme] of Object.entries(rawSchemes)) {\n if (scheme && !('$ref' in scheme)) {\n schemes[name] = scheme as OpenAPIV3.SecuritySchemeObject\n }\n }\n return mapSecuritySchemes(schemes)\n } else {\n const swagger2 = api as OpenAPIV2.Document\n return mapSecuritySchemes(swagger2.securityDefinitions ?? {})\n }\n}\n","/**\n * Base URL resolution for OpenAPI specs.\n * Handles servers array (3.x), host+basePath (2.0), and fallback to spec URL.\n */\n\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\n\n/**\n * Extract base URL from OpenAPI 3.x servers array.\n * Interpolates server variables using their default value or first enum value.\n * Resolves relative server URLs (e.g. \"/\", \"/api/v1\") against the spec URL when provided.\n * Returns '' when no server is defined or a relative URL can't be resolved.\n *\n * @param api - The parsed OpenAPI 3.x document\n * @param specUrl - Optional spec URL used to resolve relative server URLs\n */\nexport function extractOpenAPI3BaseUrl(api: OpenAPIV3.Document, specUrl?: string): string {\n const server = api.servers?.[0]\n if (!server) return ''\n\n let url = server.url\n\n // Interpolate server variables with defaults\n if (server.variables) {\n for (const [name, variable] of Object.entries(server.variables)) {\n const value = variable.default ?? variable.enum?.[0]\n if (value === undefined) return ''\n url = url.replaceAll(`{${name}}`, String(value))\n }\n }\n\n // Resolve relative server URLs against the spec URL\n if (url && !url.startsWith('http')) {\n if (!specUrl) return ''\n try {\n const resolved = new URL(url, specUrl)\n return resolved.origin + resolved.pathname.replace(/\\/$/, '')\n } catch {\n return ''\n }\n }\n\n return url\n}\n\n/**\n * Extract base URL from Swagger 2.0 host, basePath, and schemes.\n * Returns '' when host is missing (must be resolved by the consumer with spec URL).\n */\nexport function extractSwagger2BaseUrl(api: OpenAPIV2.Document): string {\n const host = api.host\n if (!host) return ''\n const scheme = api.schemes?.[0] ?? 'https'\n const basePath = api.basePath ?? ''\n return `${scheme}://${host}${basePath}`\n}\n","/**\n * Maps OpenAPI/Swagger security schemes to api-invoke auth types.\n */\n\nimport type { OpenAPIV3, OpenAPIV2 } from 'openapi-types'\nimport type { AuthScheme } from '../../core/types'\nimport { AuthType, ParamLocation } from '../../core/types'\n\n/**\n * Map OpenAPI/Swagger security scheme definitions to api-invoke's {@link AuthScheme} array.\n * Supports apiKey, http (bearer/basic), oauth2, and basic (Swagger 2.0) types.\n * Unsupported schemes (e.g. openIdConnect) are mapped with `authType: null`.\n *\n * @param schemes - Security scheme definitions from the spec\n * @returns Array of normalized auth schemes\n */\nexport function mapSecuritySchemes(\n schemes: Record<string, OpenAPIV3.SecuritySchemeObject | OpenAPIV2.SecuritySchemeObject>,\n): AuthScheme[] {\n const results: AuthScheme[] = []\n for (const [name, scheme] of Object.entries(schemes)) {\n results.push(mapSingleScheme(name, scheme))\n }\n return results\n}\n\nfunction mapSingleScheme(\n name: string,\n scheme: OpenAPIV3.SecuritySchemeObject | OpenAPIV2.SecuritySchemeObject,\n): AuthScheme {\n const baseDescription = scheme.description || name\n\n // apiKey type (both OpenAPI 3.x and Swagger 2.0)\n if (scheme.type === 'apiKey') {\n const apiKeyScheme = scheme as OpenAPIV3.ApiKeySecurityScheme | OpenAPIV2.SecuritySchemeApiKey\n if (apiKeyScheme.in === ParamLocation.HEADER) {\n return { name, authType: AuthType.API_KEY, metadata: { headerName: apiKeyScheme.name }, description: baseDescription }\n }\n if (apiKeyScheme.in === ParamLocation.QUERY) {\n return { name, authType: AuthType.QUERY_PARAM, metadata: { paramName: apiKeyScheme.name }, description: baseDescription }\n }\n if (apiKeyScheme.in === ParamLocation.COOKIE) {\n return { name, authType: AuthType.COOKIE, metadata: { cookieName: apiKeyScheme.name }, description: baseDescription }\n }\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: apiKey in \"${apiKeyScheme.in}\")` }\n }\n\n // http type (OpenAPI 3.x only)\n if (scheme.type === 'http') {\n const httpScheme = scheme as OpenAPIV3.HttpSecurityScheme\n if (httpScheme.scheme === AuthType.BEARER) {\n return { name, authType: AuthType.BEARER, metadata: {}, description: baseDescription }\n }\n if (httpScheme.scheme === AuthType.BASIC) {\n return { name, authType: AuthType.BASIC, metadata: {}, description: baseDescription }\n }\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: HTTP scheme \"${httpScheme.scheme}\")` }\n }\n\n // basic type (Swagger 2.0 only)\n if (scheme.type === 'basic') {\n return { name, authType: AuthType.BASIC, metadata: {}, description: baseDescription }\n }\n\n // oauth2\n if (scheme.type === 'oauth2') {\n const metadata: Record<string, string> = {}\n\n // OpenAPI 3.x: flows object\n let flowResolved = false\n if ('flows' in scheme) {\n const oauth3 = scheme as OpenAPIV3.OAuth2SecurityScheme\n const flow = oauth3.flows.authorizationCode\n ?? oauth3.flows.clientCredentials\n ?? oauth3.flows.implicit\n ?? oauth3.flows.password\n if (flow) {\n flowResolved = true\n if ('authorizationUrl' in flow && flow.authorizationUrl) metadata.authorizationUrl = flow.authorizationUrl\n if ('tokenUrl' in flow && flow.tokenUrl) metadata.tokenUrl = flow.tokenUrl\n if (flow.refreshUrl) metadata.refreshUrl = flow.refreshUrl\n if (flow.scopes && Object.keys(flow.scopes).length > 0) {\n metadata.scopes = Object.keys(flow.scopes).join(',')\n }\n }\n }\n\n // Swagger 2.0: flat fields (use generic access since union types vary)\n if ('flow' in scheme) {\n flowResolved = true\n const oauth2 = scheme as unknown as Record<string, unknown>\n if (typeof oauth2.authorizationUrl === 'string') metadata.authorizationUrl = oauth2.authorizationUrl\n if (typeof oauth2.tokenUrl === 'string') metadata.tokenUrl = oauth2.tokenUrl\n const scopes = oauth2.scopes as Record<string, string> | undefined\n if (scopes && Object.keys(scopes).length > 0) {\n metadata.scopes = Object.keys(scopes).join(',')\n }\n }\n\n const description = flowResolved\n ? baseDescription\n : `${baseDescription} (OAuth2 detected but no supported flow found)`\n return { name, authType: AuthType.OAUTH2, metadata, description }\n }\n\n // openIdConnect\n if (scheme.type === 'openIdConnect') {\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: OpenID Connect)` }\n }\n\n return { name, authType: null, metadata: {}, description: `${baseDescription} (unsupported: unknown scheme type)` }\n}\n","/**\n * Raw URL adapter — creates a ParsedAPI from one or more plain URL endpoints (no spec).\n * Supports custom methods, IDs, and summaries per endpoint.\n * Auto-detects query parameters as configurable operation parameters.\n */\n\nimport type { ParsedAPI, Operation, Parameter } from '../../core/types'\nimport { HttpMethod, ParamLocation, SpecFormat } from '../../core/types'\n\n/**\n * A raw URL endpoint definition (no spec required).\n */\nexport interface RawEndpoint {\n /** Full URL for the endpoint (must be absolute). */\n url: string\n /** HTTP method. Default: 'GET'. */\n method?: string\n /** Custom operation ID. Auto-generated from method + path if omitted. */\n id?: string\n /** Short summary. Defaults to `'{METHOD} {hostname}{path}'`. */\n summary?: string\n}\n\n/**\n * Parse a raw URL into a {@link ParsedAPI} with a single operation.\n * Query parameters from the URL become configurable operation parameters.\n * Repeated keys (e.g. `?tags=a&tags=b`) and bracket notation (e.g. `?ids[]=1&ids[]=2`) produce array-typed parameters.\n *\n * @param url - Absolute URL (e.g. 'https://api.example.com/users?page=1')\n * @returns A ParsedAPI with a single operation (defaults to GET)\n * @throws {Error} If the URL is not a valid absolute URL\n */\nexport function parseRawUrl(url: string): ParsedAPI {\n return parseRawUrls([{ url }])\n}\n\n/**\n * Parse multiple raw URL endpoints into a single {@link ParsedAPI}.\n * All endpoints must share the same origin. Query parameters become configurable operation parameters.\n * Repeated keys and bracket notation (e.g. `?ids[]=1&ids[]=2`) produce array-typed parameters.\n * Nested brackets (e.g. `[][]`) are flattened to a 1D array. Indexed brackets (e.g. `[0]`, `[1]`) are not recognized.\n *\n * @param endpoints - Array of raw endpoint definitions\n * @returns A ParsedAPI with one operation per endpoint\n * @throws {Error} If endpoints is empty, URLs are invalid, or origins don't match\n */\nexport function parseRawUrls(endpoints: RawEndpoint[]): ParsedAPI {\n if (endpoints.length === 0) {\n throw new Error('At least one endpoint is required')\n }\n\n // Derive baseUrl from first endpoint\n let firstParsed: URL\n try {\n firstParsed = new URL(endpoints[0].url)\n } catch {\n throw new Error(`Invalid URL \"${endpoints[0].url}\". Expected an absolute URL like \"https://api.example.com/path\".`)\n }\n const baseUrl = firstParsed.origin\n\n const operations: Operation[] = endpoints.map((ep) => {\n let parsed: URL\n try {\n parsed = new URL(ep.url)\n } catch {\n throw new Error(`Invalid URL \"${ep.url}\". Expected an absolute URL like \"https://api.example.com/path\".`)\n }\n\n if (parsed.origin !== firstParsed.origin) {\n throw new Error(\n `All endpoints must share the same origin. Got \"${parsed.origin}\" but expected \"${firstParsed.origin}\"`\n )\n }\n const method = (ep.method ?? HttpMethod.GET).toUpperCase()\n const pathname = parsed.pathname\n\n const parameters: Parameter[] = []\n\n // Group query entries by parameter name, merging repeated keys and normalizing bracket notation (e.g. tags[] → tags)\n const entries = new Map<string, { values: string[]; isBracket: boolean }>()\n for (const [rawKey, value] of parsed.searchParams.entries()) {\n const name = rawKey.replace(/(\\[\\])+$/, '')\n const isBracket = name !== rawKey\n if (!name) continue // bare bracket key (e.g. \"[]\") has no usable parameter name\n const existing = entries.get(name)\n if (existing) {\n existing.values.push(value)\n existing.isBracket = existing.isBracket || isBracket\n } else {\n entries.set(name, { values: [value], isBracket })\n }\n }\n\n // Build parameters — repeated keys or bracket notation become arrays.\n // Note: url-builder serializes arrays as comma-separated (e.g. tags=a%2Cb), not repeated keys.\n for (const [name, { values, isBracket }] of entries) {\n const isArray = values.length > 1 || isBracket\n parameters.push({\n name,\n in: ParamLocation.QUERY,\n required: false,\n description: isArray\n ? `Default: ${JSON.stringify(values)}`\n : `Default: ${values[0]}`,\n schema: isArray\n ? { type: 'array', default: values, items: { type: 'string' } }\n : { type: 'string', default: values[0] },\n })\n }\n\n const id = ep.id\n ?? `${method.toLowerCase()}_${pathname.replace(/^\\//, '').replace(/[\\/]/g, '_') || 'root'}`\n\n return {\n id,\n path: pathname,\n method,\n summary: ep.summary ?? `${method} ${parsed.hostname}${pathname}`,\n parameters,\n tags: [],\n }\n })\n\n return {\n title: firstParsed.hostname,\n version: '1.0.0',\n baseUrl,\n operations,\n authSchemes: [],\n specFormat: SpecFormat.RAW_URL,\n }\n}\n","/**\n * Heuristics for detecting API spec formats from URLs and content.\n * Used by `createClient()` for auto-detection and available for consumers\n * that implement their own detection pipelines.\n */\n\n/**\n * Detect if a URL likely points to an OpenAPI/Swagger spec by URL pattern.\n * Checks for common spec file extensions and path patterns.\n *\n * @param url - Absolute URL to check\n * @returns `true` if the URL matches a known spec URL pattern\n */\nexport function isSpecUrl(url: string): boolean {\n const lower = url.toLowerCase()\n return (\n lower.endsWith('/openapi.json') ||\n lower.endsWith('/openapi.yaml') ||\n lower.endsWith('/openapi.yml') ||\n lower.endsWith('/swagger.json') ||\n lower.endsWith('/swagger.yaml') ||\n lower.endsWith('/swagger.yml') ||\n lower.endsWith('/spec.json') ||\n lower.endsWith('/spec.yaml') ||\n lower.endsWith('/spec.yml') ||\n lower.endsWith('/api-docs') ||\n lower.endsWith('/api-docs.json') ||\n lower.endsWith('/api-docs.yaml') ||\n lower.endsWith('/v2/api-docs') ||\n lower.endsWith('/v3/api-docs') ||\n lower.includes('swagger') ||\n lower.includes('openapi')\n )\n}\n\n/**\n * Detect if a parsed JSON object is an OpenAPI/Swagger spec by checking\n * for the required top-level `openapi` (3.x) or `swagger` (2.0) key.\n *\n * @param data - Parsed JSON value to check\n * @returns `true` if the data looks like an OpenAPI/Swagger spec\n */\nexport function isSpecContent(data: unknown): data is Record<string, unknown> {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return false\n const obj = data as Record<string, unknown>\n return typeof obj.openapi === 'string' || typeof obj.swagger === 'string'\n}\n\n/**\n * Detect if a URL likely points to a GraphQL endpoint by URL pattern.\n * Checks for common GraphQL path suffixes.\n *\n * @param url - Absolute URL to check\n * @returns `true` if the URL matches a known GraphQL endpoint pattern\n */\nexport function isGraphQLUrl(url: string): boolean {\n try {\n return /\\/graphql(?:$|[\\/\\?#])/i.test(new URL(url).pathname)\n } catch {\n return false\n }\n}\n","/**\n * Main client — the public API for api-invoke.\n * Supports three tiers: full spec (OpenAPI/GraphQL), raw URL, and zero-spec execution.\n */\n\nimport type { ParsedAPI, Operation, Auth, AuthScheme, ExecutionResult, StreamingExecutionResult, SSEEvent, ClientOptions, Middleware } from './core/types'\nimport { executeOperation, executeOperationStream } from './core/executor'\nimport { parseOpenAPISpec } from './adapters/openapi/parser'\nimport { parseRawUrl } from './adapters/raw/parser'\nimport { isSpecUrl, isSpecContent, isGraphQLUrl } from './core/detection'\n\n/**\n * Heuristic: detect if a parsed JSON object looks like a GraphQL introspection result.\n */\nfunction isGraphQLIntrospection(obj: Record<string, unknown>): boolean {\n if (obj.__schema !== undefined) return true\n if (typeof obj.data === 'object' && obj.data !== null && '__schema' in (obj.data as object)) return true\n return false\n}\n\n/**\n * High-level API client. Wraps a {@link ParsedAPI} and provides methods to execute operations by ID.\n * Created via {@link createClient} (recommended) or by constructing directly with a `ParsedAPI`.\n *\n * @example\n * ```ts\n * const client = await createClient('https://petstore.swagger.io/v2/swagger.json')\n * const result = await client.execute('getInventory')\n * console.log(result.data)\n * ```\n */\nexport class ApiInvokeClient {\n /** The parsed API specification backing this client. */\n readonly api: ParsedAPI\n private auth: Auth | Auth[] | undefined\n private middleware: Middleware[]\n private fetchFn: typeof globalThis.fetch\n private timeoutMs: number\n\n /**\n * @param api - Parsed API specification (from any adapter)\n * @param options - Client configuration (auth, middleware, fetch, timeout)\n */\n constructor(api: ParsedAPI, options: ClientOptions = {}) {\n this.api = api\n this.auth = options.auth\n this.middleware = options.middleware ?? []\n this.fetchFn = options.fetch ?? globalThis.fetch\n this.timeoutMs = options.timeoutMs ?? 0\n }\n\n /** The resolved base URL for this API. */\n get baseUrl(): string {\n return this.api.baseUrl\n }\n\n /** All available operations from the parsed spec. */\n get operations(): Operation[] {\n return this.api.operations\n }\n\n /** Authentication schemes declared in the spec. Useful for building auth UIs. */\n get authSchemes(): AuthScheme[] {\n return this.api.authSchemes\n }\n\n /**\n * Set authentication credentials for all subsequent requests.\n * @param auth - Single credential or array for composing multiple schemes\n */\n setAuth(auth: Auth | Auth[]): void {\n this.auth = auth\n }\n\n /**\n * Clear authentication credentials.\n */\n clearAuth(): void {\n this.auth = undefined\n }\n\n /**\n * Find an operation by its ID.\n * @param operationId - The operation ID to search for (e.g. 'listUsers', 'get_users_userId')\n * @returns The operation, or undefined if not found\n */\n findOperation(operationId: string): Operation | undefined {\n return this.api.operations.find((op) => op.id === operationId)\n }\n\n /**\n * Execute an operation by ID with arguments.\n *\n * @param operationId - The operation ID from the parsed spec\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Per-call overrides for auth, accept header, error behavior, and redirect mode\n * @returns The execution result with status, parsed data, and response metadata\n * @throws {ApiInvokeError} For network, CORS, timeout, and (by default) HTTP errors\n * @throws {Error} If the operation ID is not found\n *\n * @example\n * ```ts\n * const result = await client.execute('getUser', { userId: 123 })\n * console.log(result.status, result.data)\n * ```\n */\n async execute(\n operationId: string,\n args: Record<string, unknown> = {},\n options?: { auth?: Auth | Auth[]; accept?: string; throwOnHttpError?: boolean; redirect?: RequestInit['redirect'] },\n ): Promise<ExecutionResult> {\n const operation = this.findOperation(operationId)\n if (!operation) {\n throw new Error(`Operation \"${operationId}\" not found. Available: ${this.api.operations.map((o) => o.id).join(', ')}`)\n }\n\n return executeOperation(this.api.baseUrl, operation, args, {\n auth: options?.auth ?? this.auth,\n middleware: this.middleware,\n fetch: this.fetchFn,\n timeoutMs: this.timeoutMs,\n accept: options?.accept,\n throwOnHttpError: options?.throwOnHttpError,\n redirect: options?.redirect,\n })\n }\n\n /**\n * Execute an operation as a stream, returning an async iterable of SSE events.\n * Errors always throw (no non-throwing mode for streams).\n *\n * @param operationId - The operation ID from the parsed spec\n * @param args - Key-value pairs for path, query, header, and body parameters\n * @param options - Per-call overrides for auth, accept header, abort signal, and event callback. The client-level `timeoutMs` applies to the initial connection.\n * @returns Streaming result with an async iterable `stream` property\n * @throws {ApiInvokeError} For network, CORS, timeout, and HTTP errors\n * @throws {Error} If the operation ID is not found\n *\n * @example\n * ```ts\n * const result = await client.executeStream('chatCompletion', {\n * model: 'gpt-4', messages: [{ role: 'user', content: 'Hi' }], stream: true,\n * })\n * for await (const event of result.stream) {\n * console.log(event.data)\n * }\n * ```\n */\n async executeStream(\n operationId: string,\n args: Record<string, unknown> = {},\n options?: { auth?: Auth | Auth[]; accept?: string; signal?: AbortSignal; onEvent?: (event: SSEEvent) => void },\n ): Promise<StreamingExecutionResult> {\n const operation = this.findOperation(operationId)\n if (!operation) {\n throw new Error(`Operation \"${operationId}\" not found. Available: ${this.api.operations.map((o) => o.id).join(', ')}`)\n }\n\n return executeOperationStream(this.api.baseUrl, operation, args, {\n auth: options?.auth ?? this.auth,\n middleware: this.middleware,\n fetch: this.fetchFn,\n timeoutMs: this.timeoutMs,\n accept: options?.accept,\n signal: options?.signal,\n onEvent: options?.onEvent,\n })\n }\n\n}\n\n/**\n * Create a client from an OpenAPI spec URL, GraphQL endpoint, spec object, or raw API URL.\n *\n * Auto-detection logic:\n * - OpenAPI spec URL (e.g. ends with `/openapi.json`) → parsed spec with all operations\n * - GraphQL endpoint URL (path contains `/graphql`) → introspection query, one operation per field\n * - Raw URL → attempts content-based spec detection, falls back to single-operation raw mode\n * - GraphQL introspection object (`{ __schema }` or `{ data: { __schema } }`) → parsed directly\n * - OpenAPI spec object (parsed JSON/YAML) → parsed directly\n *\n * @param input - OpenAPI spec URL, GraphQL endpoint URL, raw API URL, or pre-parsed spec/introspection object\n * @param options - Client configuration (auth, middleware, fetch, enricher, timeout)\n * @returns A configured {@link ApiInvokeClient} ready to execute operations\n * @throws {Error} If the spec cannot be fetched or parsed\n *\n * @example\n * ```ts\n * // From OpenAPI spec URL\n * const client = await createClient('https://petstore.swagger.io/v2/swagger.json')\n *\n * // From GraphQL endpoint\n * const client = await createClient('https://countries.trevorblades.com/graphql')\n *\n * // From raw API URL\n * const client = await createClient('https://api.example.com/users?page=1')\n *\n * // From spec object\n * const client = await createClient(specJson, { auth: { type: 'bearer', token: 'sk-...' } })\n * ```\n */\nexport async function createClient(\n input: string | object,\n options: ClientOptions = {},\n): Promise<ApiInvokeClient> {\n let api: ParsedAPI\n\n if (typeof input === 'string') {\n if (isSpecUrl(input)) {\n api = await fetchAndParseSpec(input, options)\n } else if (isGraphQLUrl(input)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n api = await parseGraphQLSchema(input, { endpoint: input, fetch: options.fetch })\n } else {\n // URL doesn't match spec patterns — try content-based detection\n api = await tryContentDetection(input, options)\n }\n } else {\n const obj = input as Record<string, unknown>\n if (isGraphQLIntrospection(obj)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n api = await parseGraphQLSchema(input, { endpoint: options.specUrl, fetch: options.fetch })\n } else {\n // OpenAPI spec object passed directly\n api = await parseOpenAPISpec(input, { specUrl: options.specUrl })\n }\n }\n\n return finalize(api, options)\n}\n\nasync function fetchAndParseSpec(url: string, options: ClientOptions): Promise<ParsedAPI> {\n const fetchFn = options.fetch ?? globalThis.fetch\n const response = await fetchFn(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch spec: ${response.status} ${response.statusText}`)\n }\n const text = await response.text()\n let specObject: object\n try {\n specObject = JSON.parse(text)\n } catch {\n // YAML or other format — let SwaggerParser resolve the URL directly\n return parseOpenAPISpec(url, { specUrl: url })\n }\n return parseOpenAPISpec(specObject, { specUrl: url })\n}\n\n/**\n * Attempt content-based spec detection by fetching the URL and inspecting the response body.\n * Falls back to raw URL mode if the URL is unreachable or the response is not a recognized spec format.\n * If content IS detected as a spec, parse errors propagate (not swallowed).\n */\nasync function tryContentDetection(url: string, options: ClientOptions): Promise<ParsedAPI> {\n const fetchFn = options.fetch ?? globalThis.fetch\n\n let response: Response\n try {\n response = await fetchFn(url)\n } catch (error) {\n // Only fall back for network-class errors; re-throw programming errors\n if (error instanceof TypeError || (error instanceof DOMException && error.name === 'AbortError')) {\n return parseRawUrl(url)\n }\n throw error\n }\n\n if (!response.ok) {\n return parseRawUrl(url)\n }\n\n let text: string\n try {\n text = await response.text()\n } catch {\n // Body read failed (e.g. network interruption during streaming)\n return parseRawUrl(url)\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n // Not JSON (YAML is only detected by URL pattern, not content probe)\n return parseRawUrl(url)\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return parseRawUrl(url)\n }\n\n const obj = parsed as Record<string, unknown>\n if (isSpecContent(obj)) {\n // Content IS a spec — let parse errors propagate\n return parseOpenAPISpec(obj, { specUrl: url })\n }\n\n if (isGraphQLIntrospection(obj)) {\n const { parseGraphQLSchema } = await import('./adapters/graphql/parser')\n return parseGraphQLSchema(obj, { endpoint: url, fetch: options.fetch })\n }\n\n return parseRawUrl(url)\n}\n\nasync function finalize(api: ParsedAPI, options: ClientOptions): Promise<ApiInvokeClient> {\n if (options.enricher) {\n api = await Promise.resolve(options.enricher.enrichAPI(api))\n }\n return new ApiInvokeClient(api, options)\n}\n","/**\n * api-invoke — Parse any API spec and execute operations.\n */\n\n// Main client\nexport { createClient, ApiInvokeClient } from './client'\n\n// Core types\nexport type {\n ParsedAPI,\n Operation,\n Parameter,\n ParameterSchema,\n RequestBody,\n RequestBodySchema,\n RequestBodyProperty,\n Auth,\n AuthScheme,\n ExecutionResult,\n ResultErrorKind,\n SSEEvent,\n StreamingExecutionResult,\n ClientOptions,\n Middleware,\n Enricher,\n} from './core/types'\n\n// Constants\nexport {\n HttpMethod,\n ParamLocation,\n AuthType,\n ContentType,\n HeaderName,\n SpecFormat,\n} from './core/types'\n\n// Errors\nexport {\n ApiInvokeError,\n API_INVOKE_ERROR_NAME,\n ErrorKind,\n corsError,\n networkError,\n authError,\n httpError,\n parseError,\n graphqlError,\n timeoutError,\n} from './core/errors'\n\n// Execution\nexport { executeOperation, executeRaw, executeOperationStream, executeRawStream, buildRequest } from './core/executor'\nexport type { ExecuteOptions, BuildRequestOptions, BuiltRequest } from './core/executor'\n\n// SSE parser (advanced usage)\nexport { parseSSE } from './core/sse'\n\n// Detection utilities\nexport { isSpecUrl, isSpecContent, isGraphQLUrl } from './core/detection'\n\n// URL utilities\nexport { buildUrl, deriveBaseUrl } from './core/url-builder'\n\n// Auth utilities\nexport { injectAuth, maskAuth, refreshOAuth2Token } from './core/auth'\nexport type { AuthenticatedRequest, OAuth2TokenResult } from './core/auth'\nexport { toAuth, AuthConfigType } from './core/auth-config'\nexport type { AuthConfig } from './core/auth-config'\n\n// Middleware\nexport { withRetry, corsProxy, logging, withOAuthRefresh } from './middleware'\nexport type { RetryOptions, CorsProxyOptions, LoggingOptions, OAuthRefreshOptions } from './middleware'\n\n// Adapters (for advanced usage)\nexport { parseOpenAPISpec } from './adapters/openapi/parser'\nexport { parseRawUrl, parseRawUrls } from './adapters/raw/parser'\nexport type { RawEndpoint } from './adapters/raw/parser'\nexport { defineAPI, APIBuilder } from './adapters/manual/builder'\nexport type { EndpointOptions, ParamDef, BodyDef, PropertyDef } from './adapters/manual/builder'\n\n// GraphQL adapter\nexport { parseGraphQLSchema } from './adapters/graphql/parser'\nexport type { GraphQLParseOptions } from './adapters/graphql/parser'\nexport { hasGraphQLErrors, getGraphQLErrors, throwOnGraphQLErrors } from './adapters/graphql/errors'\nexport type { GraphQLError } from './adapters/graphql/errors'\n","/**\n * Flat auth configuration for CLI consumers.\n * Converts simple config objects (from CLI args, env vars, config files)\n * into api-invoke's discriminated Auth union.\n */\n\nimport type { Auth } from './types'\nimport { AuthType, ParamLocation } from './types'\n\n/** Simplified auth type constants for flat configuration (CLI, env vars, config files). */\nexport const AuthConfigType = {\n BEARER: 'bearer',\n HEADER: 'header',\n API_KEY: 'apikey',\n NONE: 'none',\n} as const\nexport type AuthConfigType = (typeof AuthConfigType)[keyof typeof AuthConfigType]\n\n/**\n * Flat auth configuration for CLI consumers.\n * Unlike {@link Auth}, this is a single object with optional fields rather than a discriminated union.\n * Use {@link toAuth} to convert to the full `Auth` type.\n */\nexport interface AuthConfig {\n /** Auth type to use. */\n type: AuthConfigType\n /** Bearer token (used when `type` is 'bearer'). */\n token?: string\n /** Custom header name (used when `type` is 'header'). */\n headerName?: string\n /** Custom header value (used when `type` is 'header'). */\n headerValue?: string\n /** Query parameter name (used when `type` is 'apikey'). */\n paramName?: string\n /** Query parameter value (used when `type` is 'apikey'). */\n paramValue?: string\n}\n\n/**\n * Convert a flat {@link AuthConfig} to api-invoke's {@link Auth} discriminated union.\n * Returns undefined if required credentials are missing or type is `NONE`.\n *\n * @param config - Flat auth configuration\n * @returns The `Auth` object, or undefined if credentials are incomplete\n */\nexport function toAuth(config: AuthConfig): Auth | undefined {\n switch (config.type) {\n case AuthConfigType.BEARER:\n return config.token ? { type: AuthType.BEARER, token: config.token } : undefined\n case AuthConfigType.HEADER:\n return config.headerName && config.headerValue\n ? { type: AuthType.API_KEY, location: ParamLocation.HEADER, name: config.headerName, value: config.headerValue }\n : undefined\n case AuthConfigType.API_KEY:\n return config.paramName && config.paramValue\n ? { type: AuthType.API_KEY, location: ParamLocation.QUERY, name: config.paramName, value: config.paramValue }\n : undefined\n case AuthConfigType.NONE:\n return undefined\n }\n}\n","/**\n * Retry fetch wrapper — exponential backoff with Retry-After header support.\n *\n * Works by wrapping the fetch function rather than using middleware hooks,\n * since retry logic needs to re-execute the entire request.\n */\n\nexport interface RetryOptions {\n /** Max retry attempts (default: 3) */\n maxRetries?: number\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Max delay in ms (default: 30000) */\n maxDelayMs?: number\n /** Backoff multiplier (default: 2) */\n multiplier?: number\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number\n /** Which status codes to retry (default: [429, 500, 502, 503, 504]) */\n retryableStatuses?: number[]\n /** Called on each retry with attempt info */\n onRetry?: (attempt: number, delayMs: number, status?: number) => void\n}\n\nconst DEFAULT_RETRYABLE_STATUSES = [429, 500, 502, 503, 504]\n\n/**\n * Parse the Retry-After header value into milliseconds.\n * Supports both delay-seconds and HTTP-date formats.\n */\nfunction parseRetryAfter(value: string): number | undefined {\n // Try as seconds first\n const seconds = Number(value)\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * 1000\n }\n\n // Try as HTTP-date\n const date = Date.parse(value)\n if (!Number.isNaN(date)) {\n const delayMs = date - Date.now()\n return delayMs > 0 ? delayMs : 0\n }\n\n return undefined\n}\n\n/**\n * Calculate delay with exponential backoff and jitter.\n */\nfunction calculateDelay(\n attempt: number,\n initialDelayMs: number,\n multiplier: number,\n maxDelayMs: number,\n jitter: number,\n): number {\n const base = initialDelayMs * Math.pow(multiplier, attempt)\n const capped = Math.min(base, maxDelayMs)\n const jitterAmount = capped * jitter * (Math.random() * 2 - 1)\n return Math.max(0, Math.round(capped + jitterAmount))\n}\n\n/**\n * Create a fetch wrapper that retries on transient failures.\n * Implements exponential backoff with jitter, and respects the `Retry-After` header.\n *\n * @param options - Retry configuration (max retries, delays, retryable statuses)\n * @param baseFetch - Base fetch function to wrap. Defaults to `globalThis.fetch`.\n * @returns A fetch-compatible function with retry behavior\n *\n * @example\n * ```ts\n * const client = await createClient(url, {\n * fetch: withRetry({ maxRetries: 3 }),\n * })\n * ```\n *\n * @example\n * ```ts\n * // Wrap a custom fetch\n * const client = await createClient(url, {\n * fetch: withRetry({ maxRetries: 3 }, myCustomFetch),\n * })\n * ```\n */\nexport function withRetry(\n options: RetryOptions = {},\n baseFetch?: typeof globalThis.fetch,\n): typeof globalThis.fetch {\n const {\n maxRetries = 3,\n initialDelayMs = 1000,\n maxDelayMs = 30_000,\n multiplier = 2,\n jitter = 0.1,\n retryableStatuses = DEFAULT_RETRYABLE_STATUSES,\n onRetry,\n } = options\n\n const fetchFn = baseFetch ?? globalThis.fetch\n\n return async function retryFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n let lastError: Error | undefined\n let lastResponse: Response | undefined\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetchFn(input, init)\n\n if (retryableStatuses.includes(response.status) && attempt < maxRetries) {\n lastResponse = response\n\n // Check Retry-After header\n const retryAfter = response.headers.get('retry-after')\n let delayMs: number\n\n if (retryAfter) {\n const parsed = parseRetryAfter(retryAfter)\n delayMs = parsed !== undefined\n ? Math.min(parsed, maxDelayMs)\n : calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n } else {\n delayMs = calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n }\n\n onRetry?.(attempt + 1, delayMs, response.status)\n await sleep(delayMs)\n continue\n }\n\n return response\n } catch (error) {\n lastError = error as Error\n\n if (attempt < maxRetries) {\n const delayMs = calculateDelay(attempt, initialDelayMs, multiplier, maxDelayMs, jitter)\n onRetry?.(attempt + 1, delayMs)\n await sleep(delayMs)\n continue\n }\n }\n }\n\n // All retries exhausted — return last response or throw last error\n if (lastResponse) return lastResponse\n throw lastError!\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * CORS proxy middleware — rewrites request URLs through a proxy.\n *\n * Useful when APIs block browser CORS requests. Supports custom\n * proxy URL patterns or the common `/api-proxy/{encodedUrl}` convention.\n */\n\nimport type { Middleware } from '../core/types'\n\nexport interface CorsProxyOptions {\n /**\n * URL rewrite function. Receives the original URL, returns the proxied URL.\n * Default: `/api-proxy/{encodeURIComponent(url)}`\n */\n rewrite?: (url: string) => string\n\n /**\n * Only proxy URLs matching this predicate.\n * Default: proxies all absolute HTTP(S) URLs.\n */\n shouldProxy?: (url: string) => boolean\n}\n\nfunction defaultRewrite(url: string): string {\n return `/api-proxy/${encodeURIComponent(url)}`\n}\n\nfunction defaultShouldProxy(url: string): boolean {\n return url.startsWith('http://') || url.startsWith('https://')\n}\n\n/**\n * Create a CORS proxy middleware that rewrites request URLs through a proxy server.\n * Useful when APIs block browser CORS requests.\n *\n * @param options - Proxy configuration (custom rewrite function, proxy filter)\n * @returns A {@link Middleware} that rewrites URLs through the proxy\n *\n * @example\n * ```ts\n * // Default: rewrites to /api-proxy/{encodedUrl}\n * const client = await createClient(url, {\n * middleware: [corsProxy()],\n * })\n * ```\n *\n * @example\n * ```ts\n * // Custom proxy URL\n * const client = await createClient(url, {\n * middleware: [corsProxy({\n * rewrite: (url) => `https://my-proxy.com/?url=${encodeURIComponent(url)}`,\n * })],\n * })\n * ```\n */\nexport function corsProxy(options: CorsProxyOptions = {}): Middleware {\n const rewrite = options.rewrite ?? defaultRewrite\n const shouldProxy = options.shouldProxy ?? defaultShouldProxy\n\n return {\n name: 'cors-proxy',\n onRequest(url, init) {\n if (shouldProxy(url)) {\n return { url: rewrite(url), init }\n }\n return { url, init }\n },\n }\n}\n","/**\n * Logging middleware — request/response logging with automatic secret masking.\n *\n * Masks Authorization headers, API keys in query strings, and other\n * sensitive values to prevent credential leakage in logs.\n */\n\nimport type { Middleware } from '../core/types'\nimport { HttpMethod } from '../core/types'\n\nexport interface LoggingOptions {\n /** Custom log function (default: console.log) */\n log?: (message: string) => void\n /** Log response bodies (default: false) */\n logBody?: boolean\n /** Additional header names to mask (always masks Authorization) */\n sensitiveHeaders?: string[]\n /** Query parameter names to mask (e.g., ['api_key', 'token']) */\n sensitiveParams?: string[]\n /** Label prefix for log messages (default: 'api-invoke') */\n prefix?: string\n}\n\nconst DEFAULT_SENSITIVE_HEADERS = ['authorization', 'x-api-key', 'cookie']\nconst DEFAULT_SENSITIVE_PARAMS = ['api_key', 'apikey', 'key', 'token', 'access_token']\n\n/**\n * Mask a header value, showing only the scheme for Authorization headers.\n */\nfunction maskHeaderValue(name: string, value: string): string {\n const lower = name.toLowerCase()\n if (lower === 'authorization') {\n const space = value.indexOf(' ')\n if (space > 0) {\n return `${value.substring(0, space)} ***`\n }\n return '***'\n }\n return '***'\n}\n\n/**\n * Mask sensitive query parameters in a URL.\n */\nfunction maskUrl(url: string, sensitiveParams: string[]): string {\n try {\n const parsed = new URL(url)\n let masked = false\n for (const param of sensitiveParams) {\n if (parsed.searchParams.has(param)) {\n parsed.searchParams.set(param, '***')\n masked = true\n }\n }\n return masked ? parsed.toString() : url\n } catch {\n return url\n }\n}\n\n/**\n * Extract and mask headers from RequestInit for logging.\n */\nfunction formatHeaders(\n init: RequestInit,\n sensitiveHeaders: string[],\n): Record<string, string> | undefined {\n const headers = init.headers\n if (!headers) return undefined\n\n const result: Record<string, string> = {}\n const sensitiveSet = new Set(sensitiveHeaders.map(h => h.toLowerCase()))\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n })\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n }\n } else {\n for (const [key, value] of Object.entries(headers)) {\n result[key] = sensitiveSet.has(key.toLowerCase())\n ? maskHeaderValue(key, value)\n : value\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Create a logging middleware that logs requests and responses.\n * Automatically masks sensitive headers (Authorization, cookies) and query parameters.\n *\n * @param options - Logging configuration (custom logger, body logging, sensitive fields)\n * @returns A {@link Middleware} that logs request/response details\n *\n * @example\n * ```ts\n * const client = await createClient(url, {\n * middleware: [logging()],\n * })\n * ```\n *\n * @example\n * ```ts\n * // Custom logger\n * const client = await createClient(url, {\n * middleware: [logging({ log: myLogger.info })],\n * })\n * ```\n */\nexport function logging(options: LoggingOptions = {}): Middleware {\n const {\n log = console.log,\n logBody = false,\n prefix = 'api-invoke',\n } = options\n\n const sensitiveHeaders = [\n ...DEFAULT_SENSITIVE_HEADERS,\n ...(options.sensitiveHeaders ?? []).map(h => h.toLowerCase()),\n ]\n const sensitiveParams = [\n ...DEFAULT_SENSITIVE_PARAMS,\n ...(options.sensitiveParams ?? []),\n ]\n\n let requestStart = 0\n\n return {\n name: 'logging',\n\n onRequest(url, init) {\n requestStart = performance.now()\n\n const maskedUrl = maskUrl(url, sensitiveParams)\n const method = (init.method ?? HttpMethod.GET).toUpperCase()\n const headers = formatHeaders(init, sensitiveHeaders)\n\n const parts = [`[${prefix}] → ${method} ${maskedUrl}`]\n if (headers) {\n parts.push(` headers: ${JSON.stringify(headers)}`)\n }\n if (logBody && init.body) {\n const bodyStr = typeof init.body === 'string' ? init.body : '<binary>'\n parts.push(` body: ${bodyStr}`)\n }\n log(parts.join('\\n'))\n\n return { url, init }\n },\n\n onResponse(response) {\n const elapsed = requestStart ? `${Math.round(performance.now() - requestStart)}ms` : '?ms'\n const status = response.status\n const statusText = response.statusText\n log(`[${prefix}] ← ${status} ${statusText} (${elapsed})`)\n return response\n },\n\n onError(error) {\n log(`[${prefix}] ✕ ${error.message}`)\n },\n }\n}\n","/**\n * OAuth2 token refresh fetch wrapper.\n * Intercepts 401 responses, refreshes the token, and retries the request.\n *\n * Note: Requests with `ReadableStream` bodies cannot be retried — if a stream body\n * is detected after a 401, the original response is returned with a warning.\n */\n\nimport { refreshOAuth2Token } from '../core/auth'\nimport type { OAuth2TokenResult } from '../core/auth'\n\n/** Configuration for the OAuth2 token refresh fetch wrapper ({@link withOAuthRefresh}). */\nexport interface OAuthRefreshOptions {\n /** OAuth2 token endpoint URL. */\n tokenUrl: string\n /** Refresh token to exchange for a new access token. */\n refreshToken: string\n /** OAuth2 client ID (if required by the token endpoint). */\n clientId?: string\n /** OAuth2 client secret (if required by the token endpoint). */\n clientSecret?: string\n /** OAuth2 scopes to request. */\n scopes?: string[]\n /** Called after a successful token refresh. Use this to persist the new tokens. May be async. */\n onTokenRefresh?: (tokens: OAuth2TokenResult) => void | Promise<void>\n}\n\n/**\n * Create a fetch wrapper that auto-refreshes OAuth2 tokens on 401 responses.\n * On a 401, exchanges the refresh token for a new access token and retries the original request.\n * Concurrent 401s are deduplicated — only one refresh and one `onTokenRefresh` callback fire per refresh cycle.\n *\n * @param options - Refresh configuration (token URL, refresh token, client credentials)\n * @param baseFetch - Base fetch function to wrap. Defaults to `globalThis.fetch`.\n * @returns A fetch-compatible function with auto-refresh behavior\n *\n * @example\n * ```ts\n * const client = await createClient(specUrl, {\n * auth: { type: AuthType.OAUTH2, accessToken: 'current-token' },\n * fetch: withOAuthRefresh({\n * tokenUrl: 'https://auth.example.com/token',\n * refreshToken: 'rt_...',\n * onTokenRefresh: (tokens) => saveTokens(tokens),\n * }),\n * })\n * ```\n */\nexport function withOAuthRefresh(\n options: OAuthRefreshOptions,\n baseFetch?: typeof globalThis.fetch,\n): typeof globalThis.fetch {\n const fetchFn = baseFetch ?? globalThis.fetch\n let currentRefreshToken = options.refreshToken\n let refreshPromise: Promise<OAuth2TokenResult> | null = null\n\n return async function oauthRefreshFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const response = await fetchFn(input, init)\n\n if (response.status !== 401) return response\n\n // Cannot retry requests with stream bodies — the stream was consumed on the first attempt\n if (\n init?.body instanceof ReadableStream ||\n (typeof init?.body === 'object' && init.body !== null && Symbol.asyncIterator in (init.body as object)) ||\n (typeof init?.body === 'object' && init.body !== null && typeof (init.body as { pipe?: unknown }).pipe === 'function')\n ) {\n console.warn(\n '[api-invoke] Cannot retry request with stream body after 401 — the stream was consumed. Use a string or Blob body for OAuth2-protected requests.',\n )\n return response\n }\n\n // Deduplicate concurrent refresh attempts — refresh + callback fire exactly once per cycle\n let tokens: OAuth2TokenResult\n try {\n if (!refreshPromise) {\n refreshPromise = refreshOAuth2Token(options.tokenUrl, currentRefreshToken, {\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n scopes: options.scopes,\n fetch: fetchFn,\n }).then(async (result) => {\n if (result.refreshToken) currentRefreshToken = result.refreshToken\n\n if (options.onTokenRefresh) {\n try {\n await options.onTokenRefresh(result)\n } catch (callbackError) {\n console.warn(\n '[api-invoke] onTokenRefresh callback threw — new tokens were NOT persisted. ' +\n 'The refreshed token is used for this request, but may be lost on restart.',\n callbackError,\n )\n }\n }\n\n return result\n }).finally(() => { refreshPromise = null })\n }\n tokens = await refreshPromise\n } catch (error) {\n // Refresh failed — return the original 401\n console.warn(\n '[api-invoke] OAuth2 token refresh failed, returning original 401.',\n error,\n )\n return response\n }\n\n // Retry original request with updated Authorization header\n // Merge headers from both the Request object (if input is a Request) and init\n let baseHeaders: Record<string, string> = {}\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { baseHeaders[key] = value })\n }\n const initHeaders: Record<string, string> =\n typeof init?.headers === 'object' && !Array.isArray(init.headers) && !(init.headers instanceof Headers)\n ? { ...(init.headers as Record<string, string>) }\n : Object.fromEntries(new Headers(init?.headers).entries())\n const existingHeaders: Record<string, string> = { ...baseHeaders, ...initHeaders }\n // Remove any existing authorization header (case-insensitive) before setting the new one\n for (const key of Object.keys(existingHeaders)) {\n if (key.toLowerCase() === 'authorization') delete existingHeaders[key]\n }\n existingHeaders['Authorization'] = `Bearer ${tokens.accessToken}`\n return fetchFn(input, { ...init, headers: existingHeaders })\n }\n}\n","/**\n * Manual API definition builder — define APIs without writing a full OpenAPI spec.\n * Supports multiple endpoints, methods, parameters, and request bodies.\n *\n * @example\n * ```ts\n * const api = defineAPI('My API')\n * .baseUrl('https://api.example.com')\n * .get('/users', { id: 'listUsers', summary: 'List all users' })\n * .post('/users', {\n * id: 'createUser',\n * body: { contentType: 'application/json', properties: { name: 'string', email: 'string' } },\n * })\n * .build()\n * ```\n */\n\nimport type { ParsedAPI, Operation, Parameter, RequestBody, RequestBodyProperty } from '../../core/types'\nimport { ContentType, HttpMethod, ParamLocation, SpecFormat } from '../../core/types'\n\n/**\n * Options for defining an endpoint in the manual builder.\n */\nexport interface EndpointOptions {\n /** Custom operation ID. Auto-generated from method + path if omitted (e.g. 'get_users'). */\n id?: string\n /** Short summary of what this endpoint does. */\n summary?: string\n /** Longer description of the endpoint's behavior. */\n description?: string\n /** Parameter definitions. Keys are parameter names; values are type strings (shorthand) or full {@link ParamDef} objects. Path parameters from `{placeholders}` are auto-detected. */\n params?: Record<string, ParamDef | string>\n /** Request body definition. */\n body?: BodyDef\n /** Expected response content type. Used as the default Accept header. */\n responseContentType?: ContentType | string\n /** Tags for grouping this endpoint. */\n tags?: string[]\n}\n\n/**\n * Parameter definition for the manual builder.\n * All fields are optional — defaults to a non-required query string parameter of type 'string'.\n */\nexport type ParamDef = {\n /** Where the parameter appears. Default: 'query' (path params are always forced to 'path'). */\n in?: ParamLocation\n /** Whether this parameter is required. Default: false (path params are always required). */\n required?: boolean\n /** Data type. Default: 'string'. */\n type?: string\n /** Human-readable description. */\n description?: string\n /** Default value when the parameter is not provided. */\n default?: unknown\n}\n\n/**\n * Request body definition for the manual builder.\n */\nexport type BodyDef = {\n /** Content type for the body. Default: 'application/json'. */\n contentType?: string\n /** Whether the body is required. Default: true. */\n required?: boolean\n /** Body properties. Keys are property names; values are type strings (shorthand) or full {@link PropertyDef} objects. */\n properties?: Record<string, string | PropertyDef>\n /** Names of required properties within the body. */\n requiredFields?: string[]\n}\n\n/**\n * Property definition within a request body.\n */\nexport type PropertyDef = {\n /** Data type (e.g. 'string', 'integer', 'boolean'). */\n type: string\n /** Human-readable description. */\n description?: string\n /** Format hint (e.g. 'date-time', 'email'). */\n format?: string\n /** Allowed values for this property. */\n enum?: unknown[]\n}\n\n/**\n * Fluent builder for manually defining APIs without an OpenAPI spec.\n * Use {@link defineAPI} to create an instance.\n *\n * @example\n * ```ts\n * const api = defineAPI('Users API')\n * .baseUrl('https://api.example.com')\n * .get('/users', { id: 'listUsers' })\n * .get('/users/{userId}', { id: 'getUser' })\n * .post('/users', { id: 'createUser', body: { properties: { name: 'string' } } })\n * .build()\n * ```\n */\nexport class APIBuilder {\n private _title: string\n private _version = '1.0.0'\n private _baseUrl = ''\n private _operations: Operation[] = []\n\n constructor(title: string) {\n this._title = title\n }\n\n /**\n * Set the API version string.\n * @param v - Version string (e.g. '2.0.0'). Default: '1.0.0'.\n */\n version(v: string): this {\n this._version = v\n return this\n }\n\n /**\n * Set the base URL for all endpoints.\n * @param url - Base URL (e.g. 'https://api.example.com/v1'). Required before calling {@link build}.\n */\n baseUrl(url: string): this {\n this._baseUrl = url\n return this\n }\n\n /** Add a GET endpoint. */\n get(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.GET, path, options)\n }\n\n /** Add a POST endpoint. */\n post(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.POST, path, options)\n }\n\n /** Add a PUT endpoint. */\n put(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.PUT, path, options)\n }\n\n /** Add a PATCH endpoint. */\n patch(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.PATCH, path, options)\n }\n\n /** Add a DELETE endpoint. */\n delete(path: string, options: EndpointOptions = {}): this {\n return this.endpoint(HttpMethod.DELETE, path, options)\n }\n\n /**\n * Add an endpoint with any HTTP method.\n * Path parameters are auto-detected from `{placeholder}` segments.\n *\n * @param method - HTTP method (e.g. 'GET', 'POST')\n * @param path - URL path template (e.g. '/users/{userId}')\n * @param options - Endpoint configuration\n */\n endpoint(method: string, path: string, options: EndpointOptions = {}): this {\n const id = options.id ?? `${method.toLowerCase()}_${path.replace(/[{}\\/]/g, '_').replace(/^_|_$/g, '').replace(/_+/g, '_')}`\n\n // Auto-detect path params from {param} placeholders\n const pathParamNames = [...path.matchAll(/\\{(\\w+)\\}/g)].map(m => m[1])\n\n const parameters: Parameter[] = []\n\n // Add path params from path template\n for (const name of pathParamNames) {\n const explicit = options.params?.[name]\n const def = typeof explicit === 'string'\n ? { type: explicit }\n : explicit ?? {}\n parameters.push({\n name,\n in: ParamLocation.PATH,\n required: true,\n description: def.description ?? '',\n schema: { type: def.type ?? 'string', default: def.default },\n })\n }\n\n // Add remaining params (query/header/cookie)\n if (options.params) {\n for (const [name, raw] of Object.entries(options.params)) {\n if (pathParamNames.includes(name)) continue // already added\n const def = typeof raw === 'string' ? { type: raw } : raw\n parameters.push({\n name,\n in: def.in ?? ParamLocation.QUERY,\n required: def.required ?? false,\n description: def.description ?? '',\n schema: { type: def.type ?? 'string', default: def.default },\n })\n }\n }\n\n // Build request body\n let requestBody: RequestBody | undefined\n if (options.body) {\n const properties: Record<string, RequestBodyProperty> = {}\n if (options.body.properties) {\n for (const [name, raw] of Object.entries(options.body.properties)) {\n if (typeof raw === 'string') {\n properties[name] = { type: raw }\n } else {\n properties[name] = {\n type: raw.type,\n description: raw.description,\n format: raw.format,\n enum: raw.enum,\n }\n }\n }\n }\n requestBody = {\n required: options.body.required ?? true,\n contentType: options.body.contentType ?? ContentType.JSON,\n schema: {\n type: 'object',\n raw: {},\n properties,\n required: options.body.requiredFields,\n },\n }\n }\n\n this._operations.push({\n id,\n path,\n method: method.toUpperCase(),\n summary: options.summary,\n description: options.description,\n parameters,\n requestBody,\n responseContentType: options.responseContentType,\n tags: options.tags ?? [],\n })\n\n return this\n }\n\n /**\n * Build the {@link ParsedAPI} from the configured endpoints.\n * @returns A ParsedAPI ready to use with {@link ApiInvokeClient}\n * @throws {Error} If `baseUrl` is not set or no endpoints are defined\n */\n build(): ParsedAPI {\n if (!this._baseUrl) {\n throw new Error('baseUrl is required. Call .baseUrl(\"https://...\") before .build().')\n }\n if (this._operations.length === 0) {\n throw new Error('At least one endpoint is required. Call .get(), .post(), etc. before .build().')\n }\n return {\n title: this._title,\n version: this._version,\n baseUrl: this._baseUrl,\n operations: [...this._operations],\n authSchemes: [],\n specFormat: SpecFormat.MANUAL,\n }\n }\n}\n\n/**\n * Create a new API builder with a fluent interface.\n *\n * @param title - Human-readable API title\n * @returns A new {@link APIBuilder} instance\n *\n * @example\n * ```ts\n * const api = defineAPI('My API')\n * .baseUrl('https://api.example.com')\n * .get('/health', { id: 'healthCheck' })\n * .build()\n * ```\n */\nexport function defineAPI(title: string): APIBuilder {\n return new APIBuilder(title)\n}\n","/**\n * GraphQL error detection and handling utilities.\n * GraphQL APIs return HTTP 200 even on errors — these helpers inspect the response body.\n */\n\nimport type { ExecutionResult } from '../../core/types'\nimport { graphqlError } from '../../core/errors'\n\n/** A single GraphQL error from the response `errors` array. */\nexport interface GraphQLError {\n message: string\n locations?: Array<{ line: number; column: number }>\n path?: Array<string | number>\n extensions?: Record<string, unknown>\n}\n\n/** Check if an ExecutionResult contains GraphQL errors. Returns true for both total and partial errors. Use {@link throwOnGraphQLErrors} to throw only on total failures (when `data` is null). */\nexport function hasGraphQLErrors(result: ExecutionResult): boolean {\n const body = result.data as Record<string, unknown> | null\n return body != null && Array.isArray(body.errors) && body.errors.length > 0\n}\n\n/** Extract GraphQL errors from an ExecutionResult. Returns empty array if none. */\nexport function getGraphQLErrors(result: ExecutionResult): GraphQLError[] {\n const body = result.data as Record<string, unknown> | null\n if (body != null && Array.isArray(body.errors)) return body.errors as GraphQLError[]\n return []\n}\n\n/**\n * Throw if the result has GraphQL errors and no data (total failure).\n * Partial errors (data + errors both present) do not throw — the caller decides how to handle them.\n */\nexport function throwOnGraphQLErrors(result: ExecutionResult): void {\n const body = result.data as Record<string, unknown> | null\n if (body == null || !Array.isArray(body.errors) || body.errors.length === 0) return\n if (body.data != null) return // Partial error — data is present\n\n const errors = body.errors as GraphQLError[]\n const messages = errors.map(e => e.message).join('; ')\n throw graphqlError(messages, result.status, body)\n}\n"]}
|