@foxnose/sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/anonymous.ts","../src/auth/jwt.ts","../src/auth/secure.ts","../src/errors.ts","../src/auth/simple.ts","../src/config.ts","../src/http.ts","../src/management/models.ts","../src/management/paths.ts","../src/management/client.ts","../src/flux/client.ts"],"sourcesContent":["import type { AuthStrategy, RequestData } from './types.js';\n\n/**\n * Placeholder auth strategy when no credentials are required.\n */\nexport class AnonymousAuth implements AuthStrategy {\n buildHeaders(_request: RequestData): Record<string, string> {\n return {};\n }\n}\n","import type { AuthStrategy, RequestData, TokenProvider } from './types.js';\n\n/**\n * Simple token provider that always returns the same token.\n */\nexport class StaticTokenProvider implements TokenProvider {\n constructor(private readonly token: string) {}\n\n getToken(): string {\n return this.token;\n }\n}\n\n/**\n * Adds `Authorization: Bearer` headers using a token provider.\n */\nexport class JWTAuth implements AuthStrategy {\n private readonly provider: TokenProvider;\n private readonly scheme: string;\n\n constructor(provider: TokenProvider, options?: { scheme?: string }) {\n this.provider = provider;\n this.scheme = options?.scheme ?? 'Bearer';\n }\n\n buildHeaders(_request: RequestData): Record<string, string> {\n const token = this.provider.getToken();\n if (!token) {\n throw new Error('Token provider returned an empty token');\n }\n return { Authorization: `${this.scheme} ${token}` };\n }\n\n /**\n * Convenience constructor for scripts with manual token management.\n */\n static fromStaticToken(token: string, options?: { scheme?: string }): JWTAuth {\n return new JWTAuth(new StaticTokenProvider(token), options);\n }\n}\n","import { createHash, createSign } from 'node:crypto';\n\nimport { FoxnoseAuthError } from '../errors.js';\nimport type { AuthStrategy, RequestData } from './types.js';\n\ntype Clock = () => Date;\n\n/**\n * Implements the `Secure <public>:<signature>` header used by both APIs.\n *\n * The signature uses ECDSA P-256 over `<path>|<sha256(body)>|<timestamp>`.\n */\nexport class SecureKeyAuth implements AuthStrategy {\n private readonly publicKey: string;\n private readonly privateKeyPem: string;\n private readonly clock: Clock;\n\n constructor(publicKey: string, privateKey: string, options?: { clock?: Clock }) {\n if (!publicKey || !privateKey) {\n throw new Error('publicKey and privateKey are required');\n }\n this.publicKey = publicKey;\n this.clock = options?.clock ?? (() => new Date());\n\n try {\n // The private key comes as base64-encoded DER. Convert to PEM for node:crypto.\n const derB64 = privateKey;\n this.privateKeyPem =\n `-----BEGIN EC PRIVATE KEY-----\\n` +\n derB64.match(/.{1,64}/g)!.join('\\n') +\n `\\n-----END EC PRIVATE KEY-----`;\n } catch (err) {\n throw new FoxnoseAuthError(`Failed to load private key: ${err}`);\n }\n }\n\n buildHeaders(request: RequestData): Record<string, string> {\n const body = request.body ?? new Uint8Array(0);\n const now = this.clock();\n const timestamp = now.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n\n let path: string;\n try {\n const parsed = new URL(request.url);\n path = parsed.pathname || '/';\n if (parsed.search) {\n path = `${path}${parsed.search}`;\n }\n } catch {\n path = request.path || '/';\n }\n\n const bodyHash = createHash('sha256').update(body).digest('hex');\n const dataToSign = `${path}|${bodyHash}|${timestamp}`;\n\n const signer = createSign('SHA256');\n signer.update(dataToSign);\n signer.end();\n\n const signatureBuffer = signer.sign({\n key: this.privateKeyPem,\n dsaEncoding: 'der',\n });\n const signatureB64 = signatureBuffer.toString('base64');\n\n return {\n Authorization: `Secure ${this.publicKey}:${signatureB64}`,\n Date: timestamp,\n };\n }\n}\n","/**\n * Base class for all SDK errors.\n */\nexport class FoxnoseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FoxnoseError';\n }\n}\n\n/**\n * Raised when the API responds with an error status (4xx/5xx).\n */\nexport class FoxnoseAPIError extends FoxnoseError {\n readonly statusCode: number;\n readonly errorCode?: string;\n readonly detail?: unknown;\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: unknown;\n\n constructor(options: {\n message: string;\n statusCode: number;\n errorCode?: string;\n detail?: unknown;\n responseHeaders?: Record<string, string>;\n responseBody?: unknown;\n }) {\n const code = options.errorCode ? `, error_code=${options.errorCode}` : '';\n super(`${options.message} (status=${options.statusCode}${code})`);\n this.name = 'FoxnoseAPIError';\n this.statusCode = options.statusCode;\n this.errorCode = options.errorCode;\n this.detail = options.detail;\n this.responseHeaders = options.responseHeaders;\n this.responseBody = options.responseBody;\n }\n}\n\n/**\n * Raised when authentication headers cannot be generated.\n */\nexport class FoxnoseAuthError extends FoxnoseError {\n constructor(message: string) {\n super(message);\n this.name = 'FoxnoseAuthError';\n }\n}\n\n/**\n * Raised when the HTTP layer fails before receiving a response.\n */\nexport class FoxnoseTransportError extends FoxnoseError {\n constructor(message: string) {\n super(message);\n this.name = 'FoxnoseTransportError';\n }\n}\n","import type { AuthStrategy, RequestData } from './types.js';\n\n/**\n * Adds `Authorization: Simple` headers for development usage.\n */\nexport class SimpleKeyAuth implements AuthStrategy {\n private readonly publicKey: string;\n private readonly secretKey: string;\n\n constructor(publicKey: string, secretKey: string) {\n if (!publicKey || !secretKey) {\n throw new Error('publicKey and secretKey are required');\n }\n this.publicKey = publicKey;\n this.secretKey = secretKey;\n }\n\n buildHeaders(_request: RequestData): Record<string, string> {\n return { Authorization: `Simple ${this.publicKey}:${this.secretKey}` };\n }\n}\n","/**\n * Controls HTTP retry behavior for idempotent requests.\n */\nexport interface RetryConfig {\n /** Total number of attempts (original request + retries). */\n attempts: number;\n /** Multiplier for exponential backoff delays. */\n backoffFactor: number;\n /** Response statuses that should be retried. */\n statusCodes: readonly number[];\n /** HTTP methods that are eligible for retrying. */\n methods: readonly string[];\n}\n\nexport const DEFAULT_RETRY_CONFIG: Readonly<RetryConfig> = {\n attempts: 3,\n backoffFactor: 0.5,\n statusCodes: [408, 425, 429, 500, 502, 503, 504],\n methods: ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'],\n};\n\nexport const SDK_VERSION = '0.1.0';\n\nexport const DEFAULT_USER_AGENT = `foxnose-sdk-js/${SDK_VERSION}`;\n\n/**\n * General transport-level configuration shared by all clients.\n */\nexport interface FoxnoseConfig {\n /** Root URL (including scheme) for the API. */\n baseUrl: string;\n /** Request timeout in milliseconds. */\n timeout: number;\n /** Headers applied to every request (lower priority than per-call headers). */\n defaultHeaders?: Record<string, string>;\n /** User agent string reported to the API. */\n userAgent: string;\n}\n\n/**\n * Creates a validated FoxnoseConfig with defaults applied.\n */\nexport function createConfig(options: {\n baseUrl: string;\n timeout?: number;\n defaultHeaders?: Record<string, string>;\n userAgent?: string;\n}): FoxnoseConfig {\n if (!options.baseUrl) {\n throw new Error('baseUrl must be provided');\n }\n return {\n baseUrl: options.baseUrl.replace(/\\/+$/, ''),\n timeout: options.timeout ?? 30_000,\n defaultHeaders: options.defaultHeaders,\n userAgent: options.userAgent ?? DEFAULT_USER_AGENT,\n };\n}\n","import { AnonymousAuth } from './auth/anonymous.js';\nimport type { AuthStrategy, RequestData } from './auth/types.js';\nimport type { FoxnoseConfig, RetryConfig } from './config.js';\nimport { DEFAULT_RETRY_CONFIG } from './config.js';\nimport { FoxnoseAPIError, FoxnoseTransportError } from './errors.js';\n\n/**\n * Shared HTTP transport with retry logic built on native `fetch`.\n */\nexport class HttpTransport {\n private readonly config: FoxnoseConfig;\n private readonly auth: AuthStrategy;\n private readonly retry: RetryConfig;\n\n constructor(options: {\n config: FoxnoseConfig;\n auth?: AuthStrategy;\n retryConfig?: RetryConfig;\n }) {\n this.config = options.config;\n this.auth = options.auth ?? new AnonymousAuth();\n this.retry = options.retryConfig ?? { ...DEFAULT_RETRY_CONFIG };\n }\n\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, any>;\n jsonBody?: any;\n content?: Uint8Array;\n headers?: Record<string, string>;\n parseJson?: boolean;\n },\n ): Promise<any> {\n const parseJson = options?.parseJson ?? true;\n const response = await this.sendWithRetries(method, path, options);\n return this.maybeDecodeResponse(response, parseJson);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n close(): void {}\n\n private buildUrl(path: string, params?: Record<string, any>): string {\n const base = this.config.baseUrl + path;\n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n const qs = searchParams.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private buildRequest(\n method: string,\n path: string,\n options?: {\n params?: Record<string, any>;\n jsonBody?: any;\n content?: Uint8Array;\n headers?: Record<string, string>;\n },\n ): { url: string; init: RequestInit; body: Uint8Array } {\n const headers: Record<string, string> = {};\n\n if (this.config.defaultHeaders) {\n Object.assign(headers, this.config.defaultHeaders);\n }\n headers['User-Agent'] = headers['User-Agent'] ?? this.config.userAgent;\n\n if (options?.headers) {\n Object.assign(headers, options.headers);\n }\n\n let body: Uint8Array = new Uint8Array(0);\n let bodyInit: string | Uint8Array | undefined;\n\n if (options?.jsonBody !== undefined) {\n const jsonStr = JSON.stringify(options.jsonBody);\n body = new TextEncoder().encode(jsonStr);\n bodyInit = jsonStr;\n headers['Content-Type'] = headers['Content-Type'] ?? 'application/json';\n } else if (options?.content) {\n body = options.content;\n bodyInit = options.content;\n }\n\n const url = this.buildUrl(path, options?.params);\n\n const requestData: RequestData = {\n method: method.toUpperCase(),\n url,\n path: this.buildSigningPath(path, options?.params),\n body,\n };\n\n const authHeaders = this.auth.buildHeaders(requestData);\n if (authHeaders) {\n Object.assign(headers, authHeaders);\n }\n\n const init: RequestInit = {\n method: method.toUpperCase(),\n headers,\n body: bodyInit,\n };\n\n return { url, init, body };\n }\n\n private buildSigningPath(path: string, params?: Record<string, any>): string {\n if (!params || Object.keys(params).length === 0) {\n return path;\n }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n const qs = searchParams.toString();\n return qs ? `${path}?${qs}` : path;\n }\n\n private shouldRetry(method: string, statusCode: number): boolean {\n if (!this.retry.methods.includes(method.toUpperCase())) {\n return false;\n }\n return this.retry.statusCodes.includes(statusCode);\n }\n\n private computeDelay(attempt: number, retryAfter?: string | null): number {\n if (retryAfter) {\n const parsed = parseFloat(retryAfter);\n if (!isNaN(parsed)) {\n return parsed * 1000;\n }\n return 0;\n }\n const base = this.retry.backoffFactor * Math.pow(2, Math.max(attempt - 1, 0)) * 1000;\n return base * (0.5 + Math.random() * 0.5);\n }\n\n private async maybeDecodeResponse(response: Response, parseJson: boolean): Promise<any> {\n if (!parseJson) {\n return response;\n }\n const text = await response.text();\n if (!text) {\n return null;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n private async sendWithRetries(\n method: string,\n path: string,\n options?: {\n params?: Record<string, any>;\n jsonBody?: any;\n content?: Uint8Array;\n headers?: Record<string, string>;\n },\n ): Promise<Response> {\n for (let attempt = 1; attempt <= this.retry.attempts; attempt++) {\n const { url, init } = this.buildRequest(method, path, options);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n init.signal = controller.signal;\n\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (err) {\n clearTimeout(timeoutId);\n const delay = this.handleTransportError(err, method, attempt);\n if (delay > 0) {\n await this.sleep(delay);\n }\n continue;\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.status >= 400) {\n if (this.shouldRetry(method, response.status) && attempt < this.retry.attempts) {\n const delay = this.computeDelay(attempt, response.headers.get('Retry-After'));\n if (delay > 0) {\n await this.sleep(delay);\n }\n continue;\n }\n await this.raiseAPIError(response);\n }\n\n return response;\n }\n\n throw new FoxnoseTransportError('All retry attempts exhausted');\n }\n\n private handleTransportError(err: unknown, method: string, attempt: number): number {\n const canRetry =\n this.retry.methods.includes(method.toUpperCase()) && attempt < this.retry.attempts;\n if (!canRetry) {\n const message = err instanceof Error ? err.message : String(err);\n throw new FoxnoseTransportError(message);\n }\n return this.computeDelay(attempt);\n }\n\n private async raiseAPIError(response: Response): Promise<never> {\n let message = '';\n let errorCode: string | undefined;\n let detail: unknown;\n let body: unknown;\n\n try {\n const text = await response.text();\n message = text;\n if (text) {\n try {\n const payload = JSON.parse(text);\n message = payload.message ?? message;\n errorCode = payload.error_code;\n detail = payload.detail;\n body = payload;\n } catch {\n body = text;\n }\n }\n } catch {\n // ignore read errors\n }\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n throw new FoxnoseAPIError({\n message: message || 'API request failed',\n statusCode: response.status,\n errorCode,\n detail,\n responseHeaders,\n responseBody: body,\n });\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","// ---------------------------------------------------------------------------\n// Generic pagination\n// ---------------------------------------------------------------------------\n\nexport interface PaginatedResponse<T> {\n count: number;\n next: string | null;\n previous: string | null;\n results: T[];\n}\n\n// ---------------------------------------------------------------------------\n// Resources & Revisions\n// ---------------------------------------------------------------------------\n\nexport interface ResourceSummary {\n key: string;\n folder: string;\n content_type: string;\n created_at: string;\n vectors_size: number;\n name?: string | null;\n component?: string | null;\n resource_owner?: string | null;\n current_revision?: string | null;\n external_id?: string | null;\n}\n\nexport interface RevisionSummary {\n key: string;\n resource: string;\n schema_version: string;\n number: number;\n size: number;\n created_at: string;\n status: string;\n is_valid: boolean | null;\n published_at: string | null;\n unpublished_at: string | null;\n}\n\nexport type ResourceList = PaginatedResponse<ResourceSummary>;\nexport type RevisionList = PaginatedResponse<RevisionSummary>;\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport interface FolderSummary {\n key: string;\n name: string;\n alias: string;\n folder_type: string;\n content_type: string;\n strict_reference: boolean;\n created_at: string;\n parent?: string | null;\n mode?: string | null;\n path?: string | null;\n auto_remove_revisions?: number | null;\n auto_remove_schema_versions?: number | null;\n embedding_model?: string | null;\n embedding_dimension?: number | null;\n}\n\nexport type FolderList = PaginatedResponse<FolderSummary>;\n\n// ---------------------------------------------------------------------------\n// Components\n// ---------------------------------------------------------------------------\n\nexport interface ComponentSummary {\n key: string;\n name: string;\n description?: string | null;\n environment: string;\n content_type: string;\n created_at: string;\n current_version?: string | null;\n}\n\nexport type ComponentList = PaginatedResponse<ComponentSummary>;\n\n// ---------------------------------------------------------------------------\n// Schema versions & fields\n// ---------------------------------------------------------------------------\n\nexport interface SchemaVersionSummary {\n key: string;\n name: string;\n description: string | null;\n version_number: number | null;\n created_at: string;\n published_at: string | null;\n archived_at: string | null;\n json_schema?: Record<string, any> | null;\n}\n\nexport interface FieldSummary {\n key: string;\n name: string;\n description: string | null;\n path: string;\n parent: string | null;\n type: string;\n meta: Record<string, any>;\n json_schema?: Record<string, any> | null;\n required: boolean;\n nullable: boolean;\n multiple?: boolean | null;\n localizable?: boolean | null;\n searchable?: boolean | null;\n private: boolean;\n vectorizable?: boolean | null;\n [extra: string]: any;\n}\n\nexport type SchemaVersionList = PaginatedResponse<SchemaVersionSummary>;\nexport type FieldList = PaginatedResponse<FieldSummary>;\n\n// ---------------------------------------------------------------------------\n// Regions & Projects\n// ---------------------------------------------------------------------------\n\nexport interface RegionInfo {\n location: string;\n name: string;\n code: string;\n}\n\nexport interface ProjectSummary {\n key: string;\n name: string;\n organization: string;\n region: RegionInfo | string;\n environments: Array<Record<string, any>>;\n gdpr?: boolean | null;\n created_at?: string | null;\n [extra: string]: any;\n}\n\nexport type ProjectList = PaginatedResponse<ProjectSummary>;\n\n// ---------------------------------------------------------------------------\n// Environments\n// ---------------------------------------------------------------------------\n\nexport interface UserReference {\n key: string;\n email: string;\n first_name: string;\n last_name: string;\n full_name: string;\n}\n\nexport interface EnvironmentSummary {\n key: string;\n name: string;\n project: string;\n host: string;\n is_enabled: boolean;\n created_at: string;\n protection_level?: string | null;\n protection_level_display?: string | null;\n protected_by_user?: UserReference | null;\n protected_at?: string | null;\n protection_reason?: string | null;\n}\n\nexport type EnvironmentList = EnvironmentSummary[];\n\n// ---------------------------------------------------------------------------\n// Locales\n// ---------------------------------------------------------------------------\n\nexport interface LocaleSummary {\n name: string;\n code: string;\n environment: string;\n is_default: boolean;\n created_at: string;\n}\n\nexport type LocaleList = LocaleSummary[];\n\n// ---------------------------------------------------------------------------\n// API Keys\n// ---------------------------------------------------------------------------\n\nexport interface ManagementAPIKeySummary {\n key: string;\n description?: string | null;\n public_key: string;\n secret_key: string;\n role?: string | null;\n environment: string;\n created_at: string;\n}\n\nexport type ManagementAPIKeyList = PaginatedResponse<ManagementAPIKeySummary>;\n\nexport interface FluxAPIKeySummary {\n key: string;\n description?: string | null;\n public_key: string;\n secret_key: string;\n role?: string | null;\n environment: string;\n created_at: string;\n}\n\nexport type FluxAPIKeyList = PaginatedResponse<FluxAPIKeySummary>;\n\n// ---------------------------------------------------------------------------\n// Roles & Permissions\n// ---------------------------------------------------------------------------\n\nexport interface ManagementRoleSummary {\n key: string;\n name: string;\n description?: string | null;\n full_access: boolean;\n environment: string;\n created_at: string;\n}\n\nexport type ManagementRoleList = PaginatedResponse<ManagementRoleSummary>;\n\nexport interface RolePermission {\n content_type: string;\n actions: string[];\n all_objects: boolean;\n objects?: string[] | null;\n}\n\nexport interface RolePermissionObject {\n content_type: string;\n object_key: string;\n}\n\nexport interface FluxRoleSummary {\n key: string;\n name: string;\n description?: string | null;\n environment: string;\n created_at: string;\n}\n\nexport type FluxRoleList = PaginatedResponse<FluxRoleSummary>;\n\n// ---------------------------------------------------------------------------\n// APIs\n// ---------------------------------------------------------------------------\n\nexport interface APIInfo {\n key: string;\n name: string;\n prefix: string;\n description?: string | null;\n environment: string;\n version?: string | null;\n is_auth_required: boolean;\n created_at: string;\n path?: string | null;\n}\n\nexport type APIList = PaginatedResponse<APIInfo>;\n\nexport interface APIFolderSummary {\n folder: string;\n api?: string | null;\n path?: string | null;\n allowed_methods?: string[] | null;\n created_at?: string | null;\n}\n\nexport type APIFolderList = PaginatedResponse<APIFolderSummary>;\n\n// ---------------------------------------------------------------------------\n// Organizations\n// ---------------------------------------------------------------------------\n\nexport interface OrganizationOwner {\n key: string;\n email: string;\n first_name: string;\n last_name: string;\n full_name: string;\n}\n\nexport interface OrganizationSummary {\n key: string;\n name: string;\n owner: OrganizationOwner;\n tax_num: string;\n city: string;\n province: string;\n address: string;\n country_iso: string | null;\n zip_code: string;\n legal_name: string;\n created_at: string;\n block_dt?: string | null;\n block_reason?: string | null;\n is_blocked: boolean;\n}\n\nexport type OrganizationList = OrganizationSummary[];\n\n// ---------------------------------------------------------------------------\n// Plans & Usage\n// ---------------------------------------------------------------------------\n\nexport interface PlanLimits {\n units_included?: string | null;\n projects?: number | null;\n environments?: number | null;\n folders?: number | null;\n resources?: number | null;\n users?: number | null;\n components?: number | null;\n allow_negative?: boolean | null;\n negative_limit?: number | null;\n unit_cost?: number | null;\n api_keys_max_count?: number | null;\n roles_max_count?: number | null;\n locales_max_count?: number | null;\n schemas_max_count?: number | null;\n schemas_fields_max_count?: number | null;\n flux_api_max_count?: number | null;\n max_component_inheritance_depth?: number | null;\n}\n\nexport interface PlanDetails {\n code: string;\n name: string;\n price: number;\n from?: string | null;\n to?: string | null;\n transferred?: string | null;\n limits: PlanLimits;\n}\n\nexport interface OrganizationPlanStatus {\n active_plan: PlanDetails;\n next_plan: PlanDetails;\n}\n\nexport interface UnitsUsage {\n remained?: string | number | null;\n unit_cost?: number | null;\n allow_negative: boolean;\n negative_limit?: string | null;\n}\n\nexport interface StorageUsage {\n data_storage: number;\n vector_storage: number;\n}\n\nexport interface UsageMetric {\n max: number | null;\n current: number;\n}\n\nexport interface UsageBreakdown {\n projects: UsageMetric;\n environments: UsageMetric;\n folders: UsageMetric;\n resources: UsageMetric;\n users: UsageMetric;\n components: UsageMetric;\n}\n\nexport interface CurrentUsage {\n api_requests: number;\n embedding_tokens: Record<string, any>;\n}\n\nexport interface OrganizationUsage {\n units: UnitsUsage;\n storage: StorageUsage;\n usage: UsageBreakdown;\n current_usage: CurrentUsage;\n}\n\n// ---------------------------------------------------------------------------\n// Batch upsert helpers\n// ---------------------------------------------------------------------------\n\nexport interface BatchUpsertItem {\n external_id: string;\n payload: Record<string, any>;\n component?: string | null;\n}\n\nexport interface BatchItemError {\n index: number;\n external_id: string;\n error: Error;\n}\n\nexport interface BatchUpsertResult {\n succeeded: ResourceSummary[];\n failed: BatchItemError[];\n}\n\n// ---------------------------------------------------------------------------\n// Reference types (allow string key or model object)\n// ---------------------------------------------------------------------------\n\nexport type FolderRef = string | FolderSummary;\nexport type ResourceRef = string | ResourceSummary;\nexport type RevisionRef = string | RevisionSummary;\nexport type ComponentRef = string | ComponentSummary;\nexport type SchemaVersionRef = string | SchemaVersionSummary;\nexport type OrgRef = string | OrganizationSummary;\nexport type ProjectRef = string | ProjectSummary;\nexport type EnvironmentRef = string | EnvironmentSummary;\nexport type ManagementRoleRef = string | ManagementRoleSummary;\nexport type FluxRoleRef = string | FluxRoleSummary;\nexport type ManagementAPIKeyRef = string | ManagementAPIKeySummary;\nexport type FluxAPIKeyRef = string | FluxAPIKeySummary;\nexport type APIRef = string | APIInfo;\n\n/**\n * Extract a string key from a value that is either a string or\n * an object with a `key` attribute.\n */\nexport function resolveKey(value: string | { key: string }): string {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'key' in value && typeof value.key === 'string') {\n return value.key;\n }\n throw new TypeError(\n `Expected a string or an object with a 'key' attribute, got ${typeof value}`,\n );\n}\n","/**\n * URL path builders for Management API endpoints.\n * Equivalent to Python SDK's _ManagementPathsMixin.\n */\nexport function managementPaths(environmentKey: string) {\n return {\n // Organization paths\n orgRoot: (orgKey: string) => `/organizations/${orgKey}`,\n projectsBase: (orgKey: string) => `/organizations/${orgKey}/projects`,\n projectRoot: (orgKey: string, projectKey: string) =>\n `/organizations/${orgKey}/projects/${projectKey}`,\n environmentsBase: (orgKey: string, projectKey: string) =>\n `/organizations/${orgKey}/projects/${projectKey}/environments`,\n environmentRoot: (orgKey: string, projectKey: string, envKey: string) =>\n `/organizations/${orgKey}/projects/${projectKey}/environments/${envKey}`,\n\n // Folder paths\n foldersTreeRoot: () => `/v1/${environmentKey}/folders/tree`,\n foldersTreeItem: () => `/v1/${environmentKey}/folders/tree/folder`,\n folderVersionsBase: (folderKey: string) =>\n `/v1/${environmentKey}/folders/${folderKey}/model/versions`,\n folderSchemaTree: (folderKey: string, versionKey: string) =>\n `/v1/${environmentKey}/folders/${folderKey}/model/versions/${versionKey}/schema/tree`,\n\n // Component paths\n componentsRoot: () => `/v1/${environmentKey}/components`,\n componentRoot: (componentKey: string) => `/v1/${environmentKey}/components/${componentKey}`,\n componentVersionsBase: (componentKey: string) =>\n `/v1/${environmentKey}/components/${componentKey}/model/versions`,\n componentSchemaTree: (componentKey: string, versionKey: string) =>\n `/v1/${environmentKey}/components/${componentKey}/model/versions/${versionKey}/schema/tree`,\n\n // Resource paths\n resourceBase: (folderKey: string) =>\n `/v1/${environmentKey}/folders/${folderKey}/resources`,\n revisionBase: (folderKey: string, resourceKey: string) =>\n `/v1/${environmentKey}/folders/${folderKey}/resources/${resourceKey}/revisions`,\n\n // Management API key paths\n managementApiKeysRoot: () =>\n `/v1/${environmentKey}/permissions/management-api/api-keys`,\n managementApiKeyRoot: (apiKey: string) =>\n `/v1/${environmentKey}/permissions/management-api/api-keys/${apiKey}`,\n\n // Flux API key paths\n fluxApiKeysRoot: () => `/v1/${environmentKey}/permissions/flux-api/api-keys`,\n fluxApiKeyRoot: (apiKey: string) =>\n `/v1/${environmentKey}/permissions/flux-api/api-keys/${apiKey}`,\n\n // API management paths\n apisRoot: () => `/v1/${environmentKey}/api`,\n apiRoot: (apiKey: string) => `/v1/${environmentKey}/api/${apiKey}`,\n apiFoldersRoot: (apiKey: string) => `/v1/${environmentKey}/api/${apiKey}/folders`,\n\n // Management role paths\n managementRolesRoot: () => `/v1/${environmentKey}/permissions/management-api/roles`,\n managementRoleRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/management-api/roles/${roleKey}`,\n rolePermissionsRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/management-api/roles/${roleKey}/permissions`,\n rolePermissionsBatch: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/management-api/roles/${roleKey}/permissions/batch`,\n rolePermissionObjectsRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/management-api/roles/${roleKey}/permissions/objects`,\n\n // Flux role paths\n fluxRolesRoot: () => `/v1/${environmentKey}/permissions/flux-api/roles`,\n fluxRoleRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/flux-api/roles/${roleKey}`,\n fluxRolePermissionsRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/flux-api/roles/${roleKey}/permissions`,\n fluxRolePermissionsBatch: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/flux-api/roles/${roleKey}/permissions/batch`,\n fluxRolePermissionObjectsRoot: (roleKey: string) =>\n `/v1/${environmentKey}/permissions/flux-api/roles/${roleKey}/permissions/objects`,\n\n // Locale paths\n localesRoot: () => `/v1/${environmentKey}/locales`,\n localeRoot: (code: string) => `/v1/${environmentKey}/locales/${code}`,\n };\n}\n\nexport type ManagementPaths = ReturnType<typeof managementPaths>;\n","import type { AuthStrategy } from '../auth/types.js';\nimport type { RetryConfig } from '../config.js';\nimport { createConfig } from '../config.js';\nimport { HttpTransport } from '../http.js';\nimport type {\n APIFolderList,\n APIFolderSummary,\n APIInfo,\n APIList,\n APIRef,\n BatchItemError,\n BatchUpsertItem,\n BatchUpsertResult,\n ComponentList,\n ComponentRef,\n ComponentSummary,\n EnvironmentList,\n EnvironmentRef,\n EnvironmentSummary,\n FieldList,\n FieldSummary,\n FluxAPIKeyList,\n FluxAPIKeyRef,\n FluxAPIKeySummary,\n FluxRoleList,\n FluxRoleRef,\n FluxRoleSummary,\n FolderList,\n FolderRef,\n FolderSummary,\n LocaleList,\n LocaleSummary,\n ManagementAPIKeyList,\n ManagementAPIKeyRef,\n ManagementAPIKeySummary,\n ManagementRoleList,\n ManagementRoleRef,\n ManagementRoleSummary,\n OrgRef,\n OrganizationList,\n OrganizationPlanStatus,\n OrganizationSummary,\n OrganizationUsage,\n ProjectList,\n ProjectRef,\n ProjectSummary,\n RegionInfo,\n ResourceList,\n ResourceRef,\n ResourceSummary,\n RevisionList,\n RevisionRef,\n RevisionSummary,\n RolePermission,\n RolePermissionObject,\n SchemaVersionList,\n SchemaVersionRef,\n SchemaVersionSummary,\n} from './models.js';\nimport { resolveKey } from './models.js';\nimport { managementPaths } from './paths.js';\nimport type { ManagementPaths } from './paths.js';\n\nexport interface ManagementClientOptions {\n baseUrl?: string;\n environmentKey: string;\n auth: AuthStrategy;\n timeout?: number;\n retryConfig?: RetryConfig;\n defaultHeaders?: Record<string, string>;\n}\n\n/**\n * Client for the FoxNose Management API.\n *\n * All methods are async and return parsed response objects.\n */\nexport class ManagementClient {\n readonly environmentKey: string;\n private readonly transport: HttpTransport;\n private readonly paths: ManagementPaths;\n\n constructor(options: ManagementClientOptions) {\n if (!options.environmentKey) {\n throw new Error('environmentKey must be provided');\n }\n this.environmentKey = options.environmentKey;\n const config = createConfig({\n baseUrl: options.baseUrl ?? 'https://api.foxnose.net',\n timeout: options.timeout,\n defaultHeaders: options.defaultHeaders,\n });\n this.transport = new HttpTransport({\n config,\n auth: options.auth,\n retryConfig: options.retryConfig,\n });\n this.paths = managementPaths(options.environmentKey);\n }\n\n /**\n * Low-level escape hatch for calling arbitrary endpoints.\n */\n async request(\n method: string,\n path: string,\n options?: {\n params?: Record<string, any>;\n jsonBody?: any;\n headers?: Record<string, string>;\n parseJson?: boolean;\n },\n ): Promise<any> {\n return this.transport.request(method, path, options);\n }\n\n close(): void {\n this.transport.close();\n }\n\n // ------------------------------------------------------------------ //\n // Organization operations\n // ------------------------------------------------------------------ //\n\n async listOrganizations(): Promise<OrganizationList> {\n const payload = (await this.request('GET', '/organizations/')) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async getOrganization(orgKey: OrgRef): Promise<OrganizationSummary> {\n const key = resolveKey(orgKey);\n return this.request('GET', `${this.paths.orgRoot(key)}/`);\n }\n\n async updateOrganization(\n orgKey: OrgRef,\n payload: Record<string, any>,\n ): Promise<OrganizationSummary> {\n const key = resolveKey(orgKey);\n return this.request('PUT', `${this.paths.orgRoot(key)}/`, { jsonBody: payload });\n }\n\n async listRegions(): Promise<RegionInfo[]> {\n const payload = (await this.request('GET', '/regions/')) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async getAvailablePlans(): Promise<OrganizationPlanStatus> {\n return this.request('GET', '/plans/');\n }\n\n async getOrganizationPlan(orgKey: OrgRef): Promise<OrganizationPlanStatus> {\n const key = resolveKey(orgKey);\n return this.request('GET', `${this.paths.orgRoot(key)}/plan/`);\n }\n\n async setOrganizationPlan(\n orgKey: OrgRef,\n planCode: string,\n ): Promise<OrganizationPlanStatus> {\n const key = resolveKey(orgKey);\n return this.request('POST', `${this.paths.orgRoot(key)}/plan/${planCode}/`);\n }\n\n async getOrganizationUsage(orgKey: OrgRef): Promise<OrganizationUsage> {\n const key = resolveKey(orgKey);\n return this.request('GET', `${this.paths.orgRoot(key)}/usage/`);\n }\n\n // ------------------------------------------------------------------ //\n // Management API key operations\n // ------------------------------------------------------------------ //\n\n async listManagementApiKeys(params?: Record<string, any>): Promise<ManagementAPIKeyList> {\n return this.request('GET', `${this.paths.managementApiKeysRoot()}/`, { params });\n }\n\n async createManagementApiKey(payload: Record<string, any>): Promise<ManagementAPIKeySummary> {\n return this.request('POST', `${this.paths.managementApiKeysRoot()}/`, {\n jsonBody: payload,\n });\n }\n\n async getManagementApiKey(key: ManagementAPIKeyRef): Promise<ManagementAPIKeySummary> {\n const k = resolveKey(key);\n return this.request('GET', `${this.paths.managementApiKeyRoot(k)}/`);\n }\n\n async updateManagementApiKey(\n key: ManagementAPIKeyRef,\n payload: Record<string, any>,\n ): Promise<ManagementAPIKeySummary> {\n const k = resolveKey(key);\n return this.request('PUT', `${this.paths.managementApiKeyRoot(k)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteManagementApiKey(key: ManagementAPIKeyRef): Promise<void> {\n const k = resolveKey(key);\n await this.request('DELETE', `${this.paths.managementApiKeyRoot(k)}/`, {\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Flux API key operations\n // ------------------------------------------------------------------ //\n\n async listFluxApiKeys(params?: Record<string, any>): Promise<FluxAPIKeyList> {\n return this.request('GET', `${this.paths.fluxApiKeysRoot()}/`, { params });\n }\n\n async createFluxApiKey(payload: Record<string, any>): Promise<FluxAPIKeySummary> {\n return this.request('POST', `${this.paths.fluxApiKeysRoot()}/`, { jsonBody: payload });\n }\n\n async getFluxApiKey(key: FluxAPIKeyRef): Promise<FluxAPIKeySummary> {\n const k = resolveKey(key);\n return this.request('GET', `${this.paths.fluxApiKeyRoot(k)}/`);\n }\n\n async updateFluxApiKey(\n key: FluxAPIKeyRef,\n payload: Record<string, any>,\n ): Promise<FluxAPIKeySummary> {\n const k = resolveKey(key);\n return this.request('PUT', `${this.paths.fluxApiKeyRoot(k)}/`, { jsonBody: payload });\n }\n\n async deleteFluxApiKey(key: FluxAPIKeyRef): Promise<void> {\n const k = resolveKey(key);\n await this.request('DELETE', `${this.paths.fluxApiKeyRoot(k)}/`, { parseJson: false });\n }\n\n // ------------------------------------------------------------------ //\n // API management operations\n // ------------------------------------------------------------------ //\n\n async listApis(params?: Record<string, any>): Promise<APIList> {\n return this.request('GET', `${this.paths.apisRoot()}/`, { params });\n }\n\n async createApi(payload: Record<string, any>): Promise<APIInfo> {\n return this.request('POST', `${this.paths.apisRoot()}/`, { jsonBody: payload });\n }\n\n async getApi(apiKey: APIRef): Promise<APIInfo> {\n const key = resolveKey(apiKey);\n return this.request('GET', `${this.paths.apiRoot(key)}/`);\n }\n\n async updateApi(apiKey: APIRef, payload: Record<string, any>): Promise<APIInfo> {\n const key = resolveKey(apiKey);\n return this.request('PUT', `${this.paths.apiRoot(key)}/`, { jsonBody: payload });\n }\n\n async deleteApi(apiKey: APIRef): Promise<void> {\n const key = resolveKey(apiKey);\n await this.request('DELETE', `${this.paths.apiRoot(key)}/`, { parseJson: false });\n }\n\n // ------------------------------------------------------------------ //\n // API Folder associations\n // ------------------------------------------------------------------ //\n\n async listApiFolders(apiKey: APIRef, params?: Record<string, any>): Promise<APIFolderList> {\n const key = resolveKey(apiKey);\n return this.request('GET', `${this.paths.apiFoldersRoot(key)}/`, { params });\n }\n\n async addApiFolder(\n apiKey: APIRef,\n folderKey: FolderRef,\n options?: { allowedMethods?: string[] },\n ): Promise<APIFolderSummary> {\n const aKey = resolveKey(apiKey);\n const fKey = resolveKey(folderKey);\n const body: Record<string, any> = { folder: fKey };\n if (options?.allowedMethods) {\n body.allowed_methods = options.allowedMethods;\n }\n return this.request('POST', `${this.paths.apiFoldersRoot(aKey)}/`, { jsonBody: body });\n }\n\n async getApiFolder(apiKey: APIRef, folderKey: FolderRef): Promise<APIFolderSummary> {\n const aKey = resolveKey(apiKey);\n const fKey = resolveKey(folderKey);\n return this.request('GET', `${this.paths.apiFoldersRoot(aKey)}/${fKey}/`);\n }\n\n async updateApiFolder(\n apiKey: APIRef,\n folderKey: FolderRef,\n options?: { allowedMethods?: string[] },\n ): Promise<APIFolderSummary> {\n const aKey = resolveKey(apiKey);\n const fKey = resolveKey(folderKey);\n const body: Record<string, any> = {};\n if (options?.allowedMethods) {\n body.allowed_methods = options.allowedMethods;\n }\n return this.request('PUT', `${this.paths.apiFoldersRoot(aKey)}/${fKey}/`, {\n jsonBody: body,\n });\n }\n\n async removeApiFolder(apiKey: APIRef, folderKey: FolderRef): Promise<void> {\n const aKey = resolveKey(apiKey);\n const fKey = resolveKey(folderKey);\n await this.request('DELETE', `${this.paths.apiFoldersRoot(aKey)}/${fKey}/`, {\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Management role operations\n // ------------------------------------------------------------------ //\n\n async listManagementRoles(params?: Record<string, any>): Promise<ManagementRoleList> {\n return this.request('GET', `${this.paths.managementRolesRoot()}/`, { params });\n }\n\n async createManagementRole(payload: Record<string, any>): Promise<ManagementRoleSummary> {\n return this.request('POST', `${this.paths.managementRolesRoot()}/`, {\n jsonBody: payload,\n });\n }\n\n async getManagementRole(roleKey: ManagementRoleRef): Promise<ManagementRoleSummary> {\n const key = resolveKey(roleKey);\n return this.request('GET', `${this.paths.managementRoleRoot(key)}/`);\n }\n\n async updateManagementRole(\n roleKey: ManagementRoleRef,\n payload: Record<string, any>,\n ): Promise<ManagementRoleSummary> {\n const key = resolveKey(roleKey);\n return this.request('PUT', `${this.paths.managementRoleRoot(key)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteManagementRole(roleKey: ManagementRoleRef): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request('DELETE', `${this.paths.managementRoleRoot(key)}/`, {\n parseJson: false,\n });\n }\n\n // Management role permissions\n\n async listManagementRolePermissions(roleKey: ManagementRoleRef): Promise<RolePermission[]> {\n const key = resolveKey(roleKey);\n const payload = (await this.request('GET', `${this.paths.rolePermissionsRoot(key)}/`)) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async upsertManagementRolePermission(\n roleKey: ManagementRoleRef,\n payload: Record<string, any>,\n ): Promise<RolePermission> {\n const key = resolveKey(roleKey);\n return this.request('POST', `${this.paths.rolePermissionsRoot(key)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteManagementRolePermission(\n roleKey: ManagementRoleRef,\n contentType: string,\n ): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request('DELETE', `${this.paths.rolePermissionsRoot(key)}/`, {\n params: { content_type: contentType },\n parseJson: false,\n });\n }\n\n async replaceManagementRolePermissions(\n roleKey: ManagementRoleRef,\n permissions: Array<Record<string, any>>,\n ): Promise<RolePermission[]> {\n const key = resolveKey(roleKey);\n const payload = await this.request('POST', `${this.paths.rolePermissionsBatch(key)}/`, {\n jsonBody: permissions,\n });\n return Array.isArray(payload) ? payload : [];\n }\n\n // Management permission objects\n\n async listManagementPermissionObjects(\n roleKey: ManagementRoleRef,\n contentType: string,\n ): Promise<RolePermissionObject[]> {\n const key = resolveKey(roleKey);\n const payload =\n (await this.request('GET', `${this.paths.rolePermissionObjectsRoot(key)}/`, {\n params: { content_type: contentType },\n })) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async addManagementPermissionObject(\n roleKey: ManagementRoleRef,\n payload: Record<string, any>,\n ): Promise<RolePermissionObject> {\n const key = resolveKey(roleKey);\n return this.request('POST', `${this.paths.rolePermissionObjectsRoot(key)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteManagementPermissionObject(\n roleKey: ManagementRoleRef,\n payload: Record<string, any>,\n ): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request('DELETE', `${this.paths.rolePermissionObjectsRoot(key)}/`, {\n jsonBody: payload,\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Flux role operations\n // ------------------------------------------------------------------ //\n\n async listFluxRoles(params?: Record<string, any>): Promise<FluxRoleList> {\n return this.request('GET', `${this.paths.fluxRolesRoot()}/`, { params });\n }\n\n async createFluxRole(payload: Record<string, any>): Promise<FluxRoleSummary> {\n return this.request('POST', `${this.paths.fluxRolesRoot()}/`, { jsonBody: payload });\n }\n\n async getFluxRole(roleKey: FluxRoleRef): Promise<FluxRoleSummary> {\n const key = resolveKey(roleKey);\n return this.request('GET', `${this.paths.fluxRoleRoot(key)}/`);\n }\n\n async updateFluxRole(\n roleKey: FluxRoleRef,\n payload: Record<string, any>,\n ): Promise<FluxRoleSummary> {\n const key = resolveKey(roleKey);\n return this.request('PUT', `${this.paths.fluxRoleRoot(key)}/`, { jsonBody: payload });\n }\n\n async deleteFluxRole(roleKey: FluxRoleRef): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request('DELETE', `${this.paths.fluxRoleRoot(key)}/`, { parseJson: false });\n }\n\n // Flux role permissions\n\n async listFluxRolePermissions(roleKey: FluxRoleRef): Promise<RolePermission[]> {\n const key = resolveKey(roleKey);\n const payload =\n (await this.request('GET', `${this.paths.fluxRolePermissionsRoot(key)}/`)) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async upsertFluxRolePermission(\n roleKey: FluxRoleRef,\n payload: Record<string, any>,\n ): Promise<RolePermission> {\n const key = resolveKey(roleKey);\n return this.request('POST', `${this.paths.fluxRolePermissionsRoot(key)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteFluxRolePermission(roleKey: FluxRoleRef, contentType: string): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request(\n 'DELETE',\n `${this.paths.fluxRolePermissionsRoot(key)}/`,\n { params: { content_type: contentType }, parseJson: false },\n );\n }\n\n async replaceFluxRolePermissions(\n roleKey: FluxRoleRef,\n permissions: Array<Record<string, any>>,\n ): Promise<RolePermission[]> {\n const key = resolveKey(roleKey);\n const payload = await this.request('POST', `${this.paths.fluxRolePermissionsBatch(key)}/`, {\n jsonBody: permissions,\n });\n return Array.isArray(payload) ? payload : [];\n }\n\n // Flux permission objects\n\n async listFluxPermissionObjects(\n roleKey: FluxRoleRef,\n contentType: string,\n ): Promise<RolePermissionObject[]> {\n const key = resolveKey(roleKey);\n const payload =\n (await this.request('GET', `${this.paths.fluxRolePermissionObjectsRoot(key)}/`, {\n params: { content_type: contentType },\n })) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async addFluxPermissionObject(\n roleKey: FluxRoleRef,\n payload: Record<string, any>,\n ): Promise<RolePermissionObject> {\n const key = resolveKey(roleKey);\n return this.request('POST', `${this.paths.fluxRolePermissionObjectsRoot(key)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteFluxPermissionObject(\n roleKey: FluxRoleRef,\n payload: Record<string, any>,\n ): Promise<void> {\n const key = resolveKey(roleKey);\n await this.request('DELETE', `${this.paths.fluxRolePermissionObjectsRoot(key)}/`, {\n jsonBody: payload,\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Folder operations\n // ------------------------------------------------------------------ //\n\n async listFolders(params?: Record<string, any>): Promise<FolderList> {\n return this.request('GET', `${this.paths.foldersTreeRoot()}/`, { params });\n }\n\n async getFolder(folderKey: FolderRef): Promise<FolderSummary> {\n const key = resolveKey(folderKey);\n return this.request('GET', `${this.paths.foldersTreeItem()}/`, {\n params: { key },\n });\n }\n\n async getFolderByPath(path: string): Promise<FolderSummary> {\n return this.request('GET', `${this.paths.foldersTreeItem()}/`, {\n params: { path },\n });\n }\n\n async listFolderTree(options?: {\n key?: string;\n mode?: string;\n }): Promise<FolderList> {\n const params: Record<string, any> = {};\n if (options?.key) params.key = options.key;\n if (options?.mode) params.mode = options.mode;\n return this.request('GET', `${this.paths.foldersTreeRoot()}/`, { params });\n }\n\n async createFolder(payload: Record<string, any>): Promise<FolderSummary> {\n return this.request('POST', `${this.paths.foldersTreeRoot()}/`, { jsonBody: payload });\n }\n\n async updateFolder(\n folderKey: FolderRef,\n payload: Record<string, any>,\n ): Promise<FolderSummary> {\n const key = resolveKey(folderKey);\n return this.request('PUT', `${this.paths.foldersTreeItem()}/`, {\n params: { key },\n jsonBody: payload,\n });\n }\n\n async deleteFolder(folderKey: FolderRef): Promise<void> {\n const key = resolveKey(folderKey);\n await this.request('DELETE', `${this.paths.foldersTreeItem()}/`, {\n params: { key },\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Folder version operations\n // ------------------------------------------------------------------ //\n\n async listFolderVersions(\n folderKey: FolderRef,\n params?: Record<string, any>,\n ): Promise<SchemaVersionList> {\n const key = resolveKey(folderKey);\n return this.request('GET', `${this.paths.folderVersionsBase(key)}/`, { params });\n }\n\n async createFolderVersion(\n folderKey: FolderRef,\n payload: Record<string, any>,\n options?: { copyFrom?: SchemaVersionRef },\n ): Promise<SchemaVersionSummary> {\n const key = resolveKey(folderKey);\n const params: Record<string, any> = {};\n if (options?.copyFrom) {\n params.copy_from = resolveKey(options.copyFrom);\n }\n return this.request('POST', `${this.paths.folderVersionsBase(key)}/`, {\n jsonBody: payload,\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n }\n\n async getFolderVersion(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n options?: { includeSchema?: boolean },\n ): Promise<SchemaVersionSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n const params: Record<string, any> = {};\n if (options?.includeSchema !== undefined) {\n params.include_schema = options.includeSchema;\n }\n return this.request('GET', `${this.paths.folderVersionsBase(fKey)}/${vKey}/`, {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n }\n\n async updateFolderVersion(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n payload: Record<string, any>,\n ): Promise<SchemaVersionSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request('PUT', `${this.paths.folderVersionsBase(fKey)}/${vKey}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteFolderVersion(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n ): Promise<void> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n await this.request('DELETE', `${this.paths.folderVersionsBase(fKey)}/${vKey}/`, {\n parseJson: false,\n });\n }\n\n async publishFolderVersion(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n ): Promise<SchemaVersionSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'POST',\n `${this.paths.folderVersionsBase(fKey)}/${vKey}/publish/`,\n );\n }\n\n // ------------------------------------------------------------------ //\n // Folder field operations\n // ------------------------------------------------------------------ //\n\n async listFolderFields(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n params?: Record<string, any>,\n ): Promise<FieldList> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request('GET', `${this.paths.folderSchemaTree(fKey, vKey)}/`, { params });\n }\n\n async createFolderField(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n payload: Record<string, any>,\n ): Promise<FieldSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request('POST', `${this.paths.folderSchemaTree(fKey, vKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async getFolderField(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n ): Promise<FieldSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'GET',\n `${this.paths.folderSchemaTree(fKey, vKey)}/field/`,\n { params: { path: fieldPath } },\n );\n }\n\n async updateFolderField(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n payload: Record<string, any>,\n ): Promise<FieldSummary> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'PUT',\n `${this.paths.folderSchemaTree(fKey, vKey)}/field/`,\n { params: { path: fieldPath }, jsonBody: payload },\n );\n }\n\n async deleteFolderField(\n folderKey: FolderRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n ): Promise<void> {\n const fKey = resolveKey(folderKey);\n const vKey = resolveKey(versionKey);\n await this.request(\n 'DELETE',\n `${this.paths.folderSchemaTree(fKey, vKey)}/field/`,\n { params: { path: fieldPath }, parseJson: false },\n );\n }\n\n // ------------------------------------------------------------------ //\n // Component operations\n // ------------------------------------------------------------------ //\n\n async listComponents(params?: Record<string, any>): Promise<ComponentList> {\n return this.request('GET', `${this.paths.componentsRoot()}/`, { params });\n }\n\n async getComponent(componentKey: ComponentRef): Promise<ComponentSummary> {\n const key = resolveKey(componentKey);\n return this.request('GET', `${this.paths.componentRoot(key)}/`);\n }\n\n async createComponent(payload: Record<string, any>): Promise<ComponentSummary> {\n return this.request('POST', `${this.paths.componentsRoot()}/`, { jsonBody: payload });\n }\n\n async updateComponent(\n componentKey: ComponentRef,\n payload: Record<string, any>,\n ): Promise<ComponentSummary> {\n const key = resolveKey(componentKey);\n return this.request('PUT', `${this.paths.componentRoot(key)}/`, { jsonBody: payload });\n }\n\n async deleteComponent(componentKey: ComponentRef): Promise<void> {\n const key = resolveKey(componentKey);\n await this.request('DELETE', `${this.paths.componentRoot(key)}/`, { parseJson: false });\n }\n\n // ------------------------------------------------------------------ //\n // Component version operations\n // ------------------------------------------------------------------ //\n\n async listComponentVersions(\n componentKey: ComponentRef,\n params?: Record<string, any>,\n ): Promise<SchemaVersionList> {\n const key = resolveKey(componentKey);\n return this.request('GET', `${this.paths.componentVersionsBase(key)}/`, { params });\n }\n\n async createComponentVersion(\n componentKey: ComponentRef,\n payload: Record<string, any>,\n options?: { copyFrom?: SchemaVersionRef },\n ): Promise<SchemaVersionSummary> {\n const key = resolveKey(componentKey);\n const params: Record<string, any> = {};\n if (options?.copyFrom) {\n params.copy_from = resolveKey(options.copyFrom);\n }\n return this.request('POST', `${this.paths.componentVersionsBase(key)}/`, {\n jsonBody: payload,\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n }\n\n async getComponentVersion(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n options?: { includeSchema?: boolean },\n ): Promise<SchemaVersionSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n const params: Record<string, any> = {};\n if (options?.includeSchema !== undefined) {\n params.include_schema = options.includeSchema;\n }\n return this.request('GET', `${this.paths.componentVersionsBase(cKey)}/${vKey}/`, {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n }\n\n async publishComponentVersion(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n ): Promise<SchemaVersionSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'POST',\n `${this.paths.componentVersionsBase(cKey)}/${vKey}/publish/`,\n );\n }\n\n async updateComponentVersion(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n payload: Record<string, any>,\n ): Promise<SchemaVersionSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request('PUT', `${this.paths.componentVersionsBase(cKey)}/${vKey}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteComponentVersion(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n ): Promise<void> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n await this.request('DELETE', `${this.paths.componentVersionsBase(cKey)}/${vKey}/`, {\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Component field operations\n // ------------------------------------------------------------------ //\n\n async listComponentFields(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n params?: Record<string, any>,\n ): Promise<FieldList> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request('GET', `${this.paths.componentSchemaTree(cKey, vKey)}/`, { params });\n }\n\n async createComponentField(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n payload: Record<string, any>,\n ): Promise<FieldSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request('POST', `${this.paths.componentSchemaTree(cKey, vKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async getComponentField(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n ): Promise<FieldSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'GET',\n `${this.paths.componentSchemaTree(cKey, vKey)}/field/`,\n { params: { path: fieldPath } },\n );\n }\n\n async updateComponentField(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n payload: Record<string, any>,\n ): Promise<FieldSummary> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n return this.request(\n 'PUT',\n `${this.paths.componentSchemaTree(cKey, vKey)}/field/`,\n { params: { path: fieldPath }, jsonBody: payload },\n );\n }\n\n async deleteComponentField(\n componentKey: ComponentRef,\n versionKey: SchemaVersionRef,\n fieldPath: string,\n ): Promise<void> {\n const cKey = resolveKey(componentKey);\n const vKey = resolveKey(versionKey);\n await this.request(\n 'DELETE',\n `${this.paths.componentSchemaTree(cKey, vKey)}/field/`,\n { params: { path: fieldPath }, parseJson: false },\n );\n }\n\n // ------------------------------------------------------------------ //\n // Resource operations\n // ------------------------------------------------------------------ //\n\n async listResources(\n folderKey: FolderRef,\n params?: Record<string, any>,\n ): Promise<ResourceList> {\n const key = resolveKey(folderKey);\n return this.request('GET', `${this.paths.resourceBase(key)}/`, { params });\n }\n\n async getResource(folderKey: FolderRef, resourceKey: ResourceRef): Promise<ResourceSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n return this.request('GET', `${this.paths.resourceBase(fKey)}/${rKey}/`);\n }\n\n async createResource(\n folderKey: FolderRef,\n payload: Record<string, any>,\n options?: { component?: ComponentRef; externalId?: string },\n ): Promise<ResourceSummary> {\n const key = resolveKey(folderKey);\n const params: Record<string, string> = {};\n if (options?.component) {\n params.component = resolveKey(options.component);\n }\n const body = { ...payload };\n if (options?.externalId) {\n body.external_id = options.externalId;\n }\n return this.request('POST', `${this.paths.resourceBase(key)}/`, {\n params: Object.keys(params).length ? params : undefined,\n jsonBody: body,\n });\n }\n\n async upsertResource(\n folderKey: FolderRef,\n payload: Record<string, any>,\n options: { externalId: string; component?: ComponentRef },\n ): Promise<ResourceSummary> {\n const key = resolveKey(folderKey);\n const params: Record<string, string> = { external_id: options.externalId };\n if (options.component) {\n params.component = resolveKey(options.component);\n }\n return this.request('PUT', `${this.paths.resourceBase(key)}/`, {\n params,\n jsonBody: payload,\n });\n }\n\n async batchUpsertResources(\n folderKey: FolderRef,\n items: BatchUpsertItem[],\n options?: {\n maxConcurrency?: number;\n failFast?: boolean;\n onProgress?: (completed: number, total: number) => void;\n },\n ): Promise<BatchUpsertResult> {\n const fKey = resolveKey(folderKey);\n const maxConcurrency = options?.maxConcurrency ?? 5;\n if (maxConcurrency < 1) {\n throw new Error('maxConcurrency must be at least 1');\n }\n if (items.length === 0) {\n return { succeeded: [], failed: [] };\n }\n const failFast = options?.failFast ?? false;\n const onProgress = options?.onProgress;\n\n const succeeded: ResourceSummary[] = [];\n const failed: BatchItemError[] = [];\n let completed = 0;\n\n const queue = [...items.entries()];\n\n const processItem = async (index: number, item: BatchUpsertItem): Promise<void> => {\n try {\n const params: Record<string, string> = { external_id: item.external_id };\n if (item.component) {\n params.component = item.component;\n }\n const result: ResourceSummary = await this.request(\n 'PUT',\n `${this.paths.resourceBase(fKey)}/`,\n { params, jsonBody: item.payload },\n );\n succeeded.push(result);\n } catch (err) {\n failed.push({\n index,\n external_id: item.external_id,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n if (failFast) {\n throw err;\n }\n } finally {\n completed++;\n onProgress?.(completed, items.length);\n }\n };\n\n // Process in batches of maxConcurrency\n let i = 0;\n while (i < queue.length) {\n const batch = queue.slice(i, i + maxConcurrency);\n try {\n await Promise.all(batch.map(([index, item]) => processItem(index, item)));\n } catch (err) {\n if (failFast) throw err;\n }\n i += maxConcurrency;\n }\n\n return { succeeded, failed };\n }\n\n async updateResource(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n payload: Record<string, any>,\n ): Promise<ResourceSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n await this.request('PUT', `${this.paths.resourceBase(fKey)}/${rKey}/`, {\n jsonBody: payload,\n parseJson: false,\n });\n return this.getResource(fKey, rKey);\n }\n\n async deleteResource(folderKey: FolderRef, resourceKey: ResourceRef): Promise<void> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n await this.request('DELETE', `${this.paths.resourceBase(fKey)}/${rKey}/`, {\n parseJson: false,\n });\n }\n\n async getResourceData(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n ): Promise<Record<string, any>> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n return this.request('GET', `${this.paths.resourceBase(fKey)}/${rKey}/data/`);\n }\n\n // ------------------------------------------------------------------ //\n // Revision operations\n // ------------------------------------------------------------------ //\n\n async listRevisions(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n params?: Record<string, any>,\n ): Promise<RevisionList> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n return this.request('GET', `${this.paths.revisionBase(fKey, rKey)}/`, { params });\n }\n\n async createRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n payload: Record<string, any>,\n ): Promise<RevisionSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n return this.request('POST', `${this.paths.revisionBase(fKey, rKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async getRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n ): Promise<RevisionSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n return this.request('GET', `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/`);\n }\n\n async updateRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n payload: Record<string, any>,\n ): Promise<RevisionSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n return this.request('PUT', `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n ): Promise<void> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n await this.request('DELETE', `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/`, {\n parseJson: false,\n });\n }\n\n async publishRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n payload?: Record<string, any>,\n ): Promise<RevisionSummary> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n return this.request(\n 'POST',\n `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/publish/`,\n payload ? { jsonBody: payload } : undefined,\n );\n }\n\n async validateRevision(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n ): Promise<Record<string, any>> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n return this.request(\n 'POST',\n `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/validate/`,\n );\n }\n\n async getRevisionData(\n folderKey: FolderRef,\n resourceKey: ResourceRef,\n revisionKey: RevisionRef,\n ): Promise<Record<string, any>> {\n const fKey = resolveKey(folderKey);\n const rKey = resolveKey(resourceKey);\n const rvKey = resolveKey(revisionKey);\n return this.request('GET', `${this.paths.revisionBase(fKey, rKey)}/${rvKey}/data/`);\n }\n\n // ------------------------------------------------------------------ //\n // Locale operations\n // ------------------------------------------------------------------ //\n\n async listLocales(): Promise<LocaleList> {\n const payload = (await this.request('GET', `${this.paths.localesRoot()}/`)) ?? [];\n return Array.isArray(payload) ? payload : [payload];\n }\n\n async createLocale(payload: Record<string, any>): Promise<LocaleSummary> {\n return this.request('POST', `${this.paths.localesRoot()}/`, { jsonBody: payload });\n }\n\n async getLocale(code: string): Promise<LocaleSummary> {\n return this.request('GET', `${this.paths.localeRoot(code)}/`);\n }\n\n async updateLocale(code: string, payload: Record<string, any>): Promise<LocaleSummary> {\n return this.request('PUT', `${this.paths.localeRoot(code)}/`, { jsonBody: payload });\n }\n\n async deleteLocale(code: string): Promise<void> {\n await this.request('DELETE', `${this.paths.localeRoot(code)}/`, { parseJson: false });\n }\n\n // ------------------------------------------------------------------ //\n // Project operations\n // ------------------------------------------------------------------ //\n\n async listProjects(orgKey: OrgRef, params?: Record<string, any>): Promise<ProjectList> {\n const key = resolveKey(orgKey);\n return this.request('GET', `${this.paths.projectsBase(key)}/`, { params });\n }\n\n async getProject(orgKey: OrgRef, projectKey: ProjectRef): Promise<ProjectSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n return this.request('GET', `${this.paths.projectRoot(oKey, pKey)}/`);\n }\n\n async createProject(orgKey: OrgRef, payload: Record<string, any>): Promise<ProjectSummary> {\n const key = resolveKey(orgKey);\n return this.request('POST', `${this.paths.projectsBase(key)}/`, { jsonBody: payload });\n }\n\n async updateProject(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n payload: Record<string, any>,\n ): Promise<ProjectSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n return this.request('PUT', `${this.paths.projectRoot(oKey, pKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteProject(orgKey: OrgRef, projectKey: ProjectRef): Promise<void> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n await this.request('DELETE', `${this.paths.projectRoot(oKey, pKey)}/`, {\n parseJson: false,\n });\n }\n\n // ------------------------------------------------------------------ //\n // Environment operations\n // ------------------------------------------------------------------ //\n\n async listEnvironments(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n ): Promise<EnvironmentList> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const payload =\n (await this.request('GET', `${this.paths.environmentsBase(oKey, pKey)}/`)) ?? [];\n if (Array.isArray(payload)) {\n return payload;\n }\n if (payload && typeof payload === 'object' && 'results' in payload) {\n return (payload as { results: EnvironmentSummary[] }).results;\n }\n return [payload];\n }\n\n async getEnvironment(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n ): Promise<EnvironmentSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const eKey = resolveKey(envKey);\n return this.request('GET', `${this.paths.environmentRoot(oKey, pKey, eKey)}/`);\n }\n\n async createEnvironment(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n payload: Record<string, any>,\n ): Promise<EnvironmentSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n return this.request('POST', `${this.paths.environmentsBase(oKey, pKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async updateEnvironment(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n payload: Record<string, any>,\n ): Promise<EnvironmentSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const eKey = resolveKey(envKey);\n return this.request('PUT', `${this.paths.environmentRoot(oKey, pKey, eKey)}/`, {\n jsonBody: payload,\n });\n }\n\n async deleteEnvironment(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n ): Promise<void> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const eKey = resolveKey(envKey);\n await this.request('DELETE', `${this.paths.environmentRoot(oKey, pKey, eKey)}/`, {\n parseJson: false,\n });\n }\n\n async toggleEnvironment(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n isEnabled: boolean,\n ): Promise<void> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const eKey = resolveKey(envKey);\n await this.request(\n 'POST',\n `${this.paths.environmentRoot(oKey, pKey, eKey)}/toggle/`,\n { jsonBody: { is_enabled: isEnabled } },\n );\n }\n\n async updateEnvironmentProtection(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n options: { protectionLevel: string; protectionReason?: string },\n ): Promise<EnvironmentSummary> {\n const oKey = resolveKey(orgKey);\n const pKey = resolveKey(projectKey);\n const eKey = resolveKey(envKey);\n const body: Record<string, any> = { protection_level: options.protectionLevel };\n if (options.protectionReason) {\n body.protection_reason = options.protectionReason;\n }\n return this.request(\n 'PATCH',\n `${this.paths.environmentRoot(oKey, pKey, eKey)}/protection/`,\n { jsonBody: body },\n );\n }\n\n async clearEnvironmentProtection(\n orgKey: OrgRef,\n projectKey: ProjectRef,\n envKey: EnvironmentRef,\n ): Promise<EnvironmentSummary> {\n return this.updateEnvironmentProtection(orgKey, projectKey, envKey, {\n protectionLevel: 'none',\n });\n }\n}\n","import type { AuthStrategy } from '../auth/types.js';\nimport type { RetryConfig } from '../config.js';\nimport { createConfig } from '../config.js';\nimport { HttpTransport } from '../http.js';\n\nfunction cleanPrefix(prefix: string): string {\n const value = prefix.replace(/^\\/+|\\/+$/g, '');\n if (!value) {\n throw new Error('apiPrefix cannot be empty');\n }\n return value;\n}\n\nfunction normalizeFolderPath(folderPath: string): string {\n return folderPath.replace(/^\\/+|\\/+$/g, '');\n}\n\nexport interface FluxClientOptions {\n baseUrl: string;\n apiPrefix: string;\n auth: AuthStrategy;\n timeout?: number;\n retryConfig?: RetryConfig;\n defaultHeaders?: Record<string, string>;\n}\n\n/**\n * Client for FoxNose Flux delivery APIs.\n *\n * All methods are async and return parsed JSON responses.\n */\nexport class FluxClient {\n readonly apiPrefix: string;\n private readonly transport: HttpTransport;\n\n constructor(options: FluxClientOptions) {\n this.apiPrefix = cleanPrefix(options.apiPrefix);\n const config = createConfig({\n baseUrl: options.baseUrl,\n timeout: options.timeout ?? 15_000,\n defaultHeaders: options.defaultHeaders,\n });\n this.transport = new HttpTransport({\n config,\n auth: options.auth,\n retryConfig: options.retryConfig,\n });\n }\n\n private buildPath(folderPath: string, suffix = ''): string {\n const folder = normalizeFolderPath(folderPath);\n const base = `/${this.apiPrefix}/${folder}`;\n return suffix ? `${base}${suffix}` : base;\n }\n\n async listResources<T = any>(folderPath: string, params?: Record<string, any>): Promise<T> {\n const path = this.buildPath(folderPath);\n return this.transport.request('GET', path, { params });\n }\n\n async getResource<T = any>(\n folderPath: string,\n resourceKey: string,\n params?: Record<string, any>,\n ): Promise<T> {\n const path = this.buildPath(folderPath, `/${resourceKey}`);\n return this.transport.request('GET', path, { params });\n }\n\n async search<T = any>(folderPath: string, body: Record<string, any>): Promise<T> {\n const path = this.buildPath(folderPath, '/_search');\n return this.transport.request('POST', path, { jsonBody: body });\n }\n\n close(): void {\n this.transport.close();\n }\n}\n"],"mappings":";AAKO,IAAM,gBAAN,MAA4C;AAAA,EACjD,aAAa,UAA+C;AAC1D,WAAO,CAAC;AAAA,EACV;AACF;;;ACJO,IAAM,sBAAN,MAAmD;AAAA,EACxD,YAA6B,OAAe;AAAf;AAAA,EAAgB;AAAA,EAE7C,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,UAAN,MAAM,SAAgC;AAAA,EAC1B;AAAA,EACA;AAAA,EAEjB,YAAY,UAAyB,SAA+B;AAClE,SAAK,WAAW;AAChB,SAAK,SAAS,SAAS,UAAU;AAAA,EACnC;AAAA,EAEA,aAAa,UAA+C;AAC1D,UAAM,QAAQ,KAAK,SAAS,SAAS;AACrC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,WAAO,EAAE,eAAe,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,OAAe,SAAwC;AAC5E,WAAO,IAAI,SAAQ,IAAI,oBAAoB,KAAK,GAAG,OAAO;AAAA,EAC5D;AACF;;;ACvCA,SAAS,YAAY,kBAAkB;;;ACGhC,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAOT;AACD,UAAM,OAAO,QAAQ,YAAY,gBAAgB,QAAQ,SAAS,KAAK;AACvE,UAAM,GAAG,QAAQ,OAAO,YAAY,QAAQ,UAAU,GAAG,IAAI,GAAG;AAChE,SAAK,OAAO;AACZ,SAAK,aAAa,QAAQ;AAC1B,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ;AACtB,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,eAAe,QAAQ;AAAA,EAC9B;AACF;AAKO,IAAM,mBAAN,cAA+B,aAAa;AAAA,EACjD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EACtD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AD7CO,IAAM,gBAAN,MAA4C;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,WAAmB,YAAoB,SAA6B;AAC9E,QAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,SAAK,YAAY;AACjB,SAAK,QAAQ,SAAS,UAAU,MAAM,oBAAI,KAAK;AAE/C,QAAI;AAEF,YAAM,SAAS;AACf,WAAK,gBACH;AAAA,IACA,OAAO,MAAM,UAAU,EAAG,KAAK,IAAI,IACnC;AAAA;AAAA,IACJ,SAAS,KAAK;AACZ,YAAM,IAAI,iBAAiB,+BAA+B,GAAG,EAAE;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,aAAa,SAA8C;AACzD,UAAM,OAAO,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAC7C,UAAM,MAAM,KAAK,MAAM;AACvB,UAAM,YAAY,IAAI,YAAY,EAAE,QAAQ,aAAa,GAAG;AAE5D,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,QAAQ,GAAG;AAClC,aAAO,OAAO,YAAY;AAC1B,UAAI,OAAO,QAAQ;AACjB,eAAO,GAAG,IAAI,GAAG,OAAO,MAAM;AAAA,MAChC;AAAA,IACF,QAAQ;AACN,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,UAAM,WAAW,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC/D,UAAM,aAAa,GAAG,IAAI,IAAI,QAAQ,IAAI,SAAS;AAEnD,UAAM,SAAS,WAAW,QAAQ;AAClC,WAAO,OAAO,UAAU;AACxB,WAAO,IAAI;AAEX,UAAM,kBAAkB,OAAO,KAAK;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,UAAM,eAAe,gBAAgB,SAAS,QAAQ;AAEtD,WAAO;AAAA,MACL,eAAe,UAAU,KAAK,SAAS,IAAI,YAAY;AAAA,MACvD,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AEjEO,IAAM,gBAAN,MAA4C;AAAA,EAChC;AAAA,EACA;AAAA,EAEjB,YAAY,WAAmB,WAAmB;AAChD,QAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,aAAa,UAA+C;AAC1D,WAAO,EAAE,eAAe,UAAU,KAAK,SAAS,IAAI,KAAK,SAAS,GAAG;AAAA,EACvE;AACF;;;ACNO,IAAM,uBAA8C;AAAA,EACzD,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC/C,SAAS,CAAC,OAAO,QAAQ,WAAW,OAAO,QAAQ;AACrD;AAEO,IAAM,cAAc;AAEpB,IAAM,qBAAqB,kBAAkB,WAAW;AAmBxD,SAAS,aAAa,SAKX;AAChB,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IAC3C,SAAS,QAAQ,WAAW;AAAA,IAC5B,gBAAgB,QAAQ;AAAA,IACxB,WAAW,QAAQ,aAAa;AAAA,EAClC;AACF;;;AChDO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAIT;AACD,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ,QAAQ,IAAI,cAAc;AAC9C,SAAK,QAAQ,QAAQ,eAAe,EAAE,GAAG,qBAAqB;AAAA,EAChE;AAAA,EAEA,MAAM,QACJ,QACA,MACA,SAOc;AACd,UAAM,YAAY,SAAS,aAAa;AACxC,UAAM,WAAW,MAAM,KAAK,gBAAgB,QAAQ,MAAM,OAAO;AACjE,WAAO,KAAK,oBAAoB,UAAU,SAAS;AAAA,EACrD;AAAA;AAAA,EAGA,QAAc;AAAA,EAAC;AAAA,EAEP,SAAS,MAAc,QAAsC;AACnE,UAAM,OAAO,KAAK,OAAO,UAAU;AACnC,QAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAC/C,aAAO;AAAA,IACT;AACA,UAAM,eAAe,IAAI,gBAAgB;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,qBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,IACF;AACA,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AAAA,EAChC;AAAA,EAEQ,aACN,QACA,MACA,SAMsD;AACtD,UAAM,UAAkC,CAAC;AAEzC,QAAI,KAAK,OAAO,gBAAgB;AAC9B,aAAO,OAAO,SAAS,KAAK,OAAO,cAAc;AAAA,IACnD;AACA,YAAQ,YAAY,IAAI,QAAQ,YAAY,KAAK,KAAK,OAAO;AAE7D,QAAI,SAAS,SAAS;AACpB,aAAO,OAAO,SAAS,QAAQ,OAAO;AAAA,IACxC;AAEA,QAAI,OAAmB,IAAI,WAAW,CAAC;AACvC,QAAI;AAEJ,QAAI,SAAS,aAAa,QAAW;AACnC,YAAM,UAAU,KAAK,UAAU,QAAQ,QAAQ;AAC/C,aAAO,IAAI,YAAY,EAAE,OAAO,OAAO;AACvC,iBAAW;AACX,cAAQ,cAAc,IAAI,QAAQ,cAAc,KAAK;AAAA,IACvD,WAAW,SAAS,SAAS;AAC3B,aAAO,QAAQ;AACf,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,MAAM,KAAK,SAAS,MAAM,SAAS,MAAM;AAE/C,UAAM,cAA2B;AAAA,MAC/B,QAAQ,OAAO,YAAY;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK,iBAAiB,MAAM,SAAS,MAAM;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,KAAK,aAAa,WAAW;AACtD,QAAI,aAAa;AACf,aAAO,OAAO,SAAS,WAAW;AAAA,IACpC;AAEA,UAAM,OAAoB;AAAA,MACxB,QAAQ,OAAO,YAAY;AAAA,MAC3B;AAAA,MACA,MAAM;AAAA,IACR;AAEA,WAAO,EAAE,KAAK,MAAM,KAAK;AAAA,EAC3B;AAAA,EAEQ,iBAAiB,MAAc,QAAsC;AAC3E,QAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAC/C,aAAO;AAAA,IACT;AACA,UAAM,eAAe,IAAI,gBAAgB;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,qBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,IACF;AACA,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AAAA,EAChC;AAAA,EAEQ,YAAY,QAAgB,YAA6B;AAC/D,QAAI,CAAC,KAAK,MAAM,QAAQ,SAAS,OAAO,YAAY,CAAC,GAAG;AACtD,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,YAAY,SAAS,UAAU;AAAA,EACnD;AAAA,EAEQ,aAAa,SAAiB,YAAoC;AACxE,QAAI,YAAY;AACd,YAAM,SAAS,WAAW,UAAU;AACpC,UAAI,CAAC,MAAM,MAAM,GAAG;AAClB,eAAO,SAAS;AAAA,MAClB;AACA,aAAO;AAAA,IACT;AACA,UAAM,OAAO,KAAK,MAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI;AAChF,WAAO,QAAQ,MAAM,KAAK,OAAO,IAAI;AAAA,EACvC;AAAA,EAEA,MAAc,oBAAoB,UAAoB,WAAkC;AACtF,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,QACA,MACA,SAMmB;AACnB,aAAS,UAAU,GAAG,WAAW,KAAK,MAAM,UAAU,WAAW;AAC/D,YAAM,EAAE,KAAK,KAAK,IAAI,KAAK,aAAa,QAAQ,MAAM,OAAO;AAE7D,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO,OAAO;AAC1E,WAAK,SAAS,WAAW;AAEzB,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,MAAM,KAAK,IAAI;AAAA,MAClC,SAAS,KAAK;AACZ,qBAAa,SAAS;AACtB,cAAM,QAAQ,KAAK,qBAAqB,KAAK,QAAQ,OAAO;AAC5D,YAAI,QAAQ,GAAG;AACb,gBAAM,KAAK,MAAM,KAAK;AAAA,QACxB;AACA;AAAA,MACF,UAAE;AACA,qBAAa,SAAS;AAAA,MACxB;AAEA,UAAI,SAAS,UAAU,KAAK;AAC1B,YAAI,KAAK,YAAY,QAAQ,SAAS,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU;AAC9E,gBAAM,QAAQ,KAAK,aAAa,SAAS,SAAS,QAAQ,IAAI,aAAa,CAAC;AAC5E,cAAI,QAAQ,GAAG;AACb,kBAAM,KAAK,MAAM,KAAK;AAAA,UACxB;AACA;AAAA,QACF;AACA,cAAM,KAAK,cAAc,QAAQ;AAAA,MACnC;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,sBAAsB,8BAA8B;AAAA,EAChE;AAAA,EAEQ,qBAAqB,KAAc,QAAgB,SAAyB;AAClF,UAAM,WACJ,KAAK,MAAM,QAAQ,SAAS,OAAO,YAAY,CAAC,KAAK,UAAU,KAAK,MAAM;AAC5E,QAAI,CAAC,UAAU;AACb,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,IAAI,sBAAsB,OAAO;AAAA,IACzC;AACA,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA,EAEA,MAAc,cAAc,UAAoC;AAC9D,QAAI,UAAU;AACd,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAU;AACV,UAAI,MAAM;AACR,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,oBAAU,QAAQ,WAAW;AAC7B,sBAAY,QAAQ;AACpB,mBAAS,QAAQ;AACjB,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,kBAA0C,CAAC;AACjD,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,sBAAgB,GAAG,IAAI;AAAA,IACzB,CAAC;AAED,UAAM,IAAI,gBAAgB;AAAA,MACxB,SAAS,WAAW;AAAA,MACpB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AACF;;;ACsKO,SAAS,WAAW,OAAyC;AAClE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,SAAS,SAAS,OAAO,MAAM,QAAQ,UAAU;AACzF,WAAO,MAAM;AAAA,EACf;AACA,QAAM,IAAI;AAAA,IACR,8DAA8D,OAAO,KAAK;AAAA,EAC5E;AACF;;;ACnbO,SAAS,gBAAgB,gBAAwB;AACtD,SAAO;AAAA;AAAA,IAEL,SAAS,CAAC,WAAmB,kBAAkB,MAAM;AAAA,IACrD,cAAc,CAAC,WAAmB,kBAAkB,MAAM;AAAA,IAC1D,aAAa,CAAC,QAAgB,eAC5B,kBAAkB,MAAM,aAAa,UAAU;AAAA,IACjD,kBAAkB,CAAC,QAAgB,eACjC,kBAAkB,MAAM,aAAa,UAAU;AAAA,IACjD,iBAAiB,CAAC,QAAgB,YAAoB,WACpD,kBAAkB,MAAM,aAAa,UAAU,iBAAiB,MAAM;AAAA;AAAA,IAGxE,iBAAiB,MAAM,OAAO,cAAc;AAAA,IAC5C,iBAAiB,MAAM,OAAO,cAAc;AAAA,IAC5C,oBAAoB,CAAC,cACnB,OAAO,cAAc,YAAY,SAAS;AAAA,IAC5C,kBAAkB,CAAC,WAAmB,eACpC,OAAO,cAAc,YAAY,SAAS,mBAAmB,UAAU;AAAA;AAAA,IAGzE,gBAAgB,MAAM,OAAO,cAAc;AAAA,IAC3C,eAAe,CAAC,iBAAyB,OAAO,cAAc,eAAe,YAAY;AAAA,IACzF,uBAAuB,CAAC,iBACtB,OAAO,cAAc,eAAe,YAAY;AAAA,IAClD,qBAAqB,CAAC,cAAsB,eAC1C,OAAO,cAAc,eAAe,YAAY,mBAAmB,UAAU;AAAA;AAAA,IAG/E,cAAc,CAAC,cACb,OAAO,cAAc,YAAY,SAAS;AAAA,IAC5C,cAAc,CAAC,WAAmB,gBAChC,OAAO,cAAc,YAAY,SAAS,cAAc,WAAW;AAAA;AAAA,IAGrE,uBAAuB,MACrB,OAAO,cAAc;AAAA,IACvB,sBAAsB,CAAC,WACrB,OAAO,cAAc,wCAAwC,MAAM;AAAA;AAAA,IAGrE,iBAAiB,MAAM,OAAO,cAAc;AAAA,IAC5C,gBAAgB,CAAC,WACf,OAAO,cAAc,kCAAkC,MAAM;AAAA;AAAA,IAG/D,UAAU,MAAM,OAAO,cAAc;AAAA,IACrC,SAAS,CAAC,WAAmB,OAAO,cAAc,QAAQ,MAAM;AAAA,IAChE,gBAAgB,CAAC,WAAmB,OAAO,cAAc,QAAQ,MAAM;AAAA;AAAA,IAGvE,qBAAqB,MAAM,OAAO,cAAc;AAAA,IAChD,oBAAoB,CAAC,YACnB,OAAO,cAAc,qCAAqC,OAAO;AAAA,IACnE,qBAAqB,CAAC,YACpB,OAAO,cAAc,qCAAqC,OAAO;AAAA,IACnE,sBAAsB,CAAC,YACrB,OAAO,cAAc,qCAAqC,OAAO;AAAA,IACnE,2BAA2B,CAAC,YAC1B,OAAO,cAAc,qCAAqC,OAAO;AAAA;AAAA,IAGnE,eAAe,MAAM,OAAO,cAAc;AAAA,IAC1C,cAAc,CAAC,YACb,OAAO,cAAc,+BAA+B,OAAO;AAAA,IAC7D,yBAAyB,CAAC,YACxB,OAAO,cAAc,+BAA+B,OAAO;AAAA,IAC7D,0BAA0B,CAAC,YACzB,OAAO,cAAc,+BAA+B,OAAO;AAAA,IAC7D,+BAA+B,CAAC,YAC9B,OAAO,cAAc,+BAA+B,OAAO;AAAA;AAAA,IAG7D,aAAa,MAAM,OAAO,cAAc;AAAA,IACxC,YAAY,CAAC,SAAiB,OAAO,cAAc,YAAY,IAAI;AAAA,EACrE;AACF;;;ACHO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,SAAkC;AAC5C,QAAI,CAAC,QAAQ,gBAAgB;AAC3B,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,SAAK,iBAAiB,QAAQ;AAC9B,UAAM,SAAS,aAAa;AAAA,MAC1B,SAAS,QAAQ,WAAW;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,SAAK,YAAY,IAAI,cAAc;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,SAAK,QAAQ,gBAAgB,QAAQ,cAAc;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,QACA,MACA,SAMc;AACd,WAAO,KAAK,UAAU,QAAQ,QAAQ,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAA+C;AACnD,UAAM,UAAW,MAAM,KAAK,QAAQ,OAAO,iBAAiB,KAAM,CAAC;AACnE,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,gBAAgB,QAA8C;AAClE,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,GAAG;AAAA,EAC1D;AAAA,EAEA,MAAM,mBACJ,QACA,SAC8B;AAC9B,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,cAAqC;AACzC,UAAM,UAAW,MAAM,KAAK,QAAQ,OAAO,WAAW,KAAM,CAAC;AAC7D,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,oBAAqD;AACzD,WAAO,KAAK,QAAQ,OAAO,SAAS;AAAA,EACtC;AAAA,EAEA,MAAM,oBAAoB,QAAiD;AACzE,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,QAAQ;AAAA,EAC/D;AAAA,EAEA,MAAM,oBACJ,QACA,UACiC;AACjC,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,SAAS,QAAQ,GAAG;AAAA,EAC5E;AAAA,EAEA,MAAM,qBAAqB,QAA4C;AACrE,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,SAAS;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBAAsB,QAA6D;AACvF,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,uBAAuB,SAAgE;AAC3F,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,sBAAsB,CAAC,KAAK;AAAA,MACpE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,KAA4D;AACpF,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,qBAAqB,CAAC,CAAC,GAAG;AAAA,EACrE;AAAA,EAEA,MAAM,uBACJ,KACA,SACkC;AAClC,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,qBAAqB,CAAC,CAAC,KAAK;AAAA,MACnE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,uBAAuB,KAAyC;AACpE,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,qBAAqB,CAAC,CAAC,KAAK;AAAA,MACrE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,QAAuD;AAC3E,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,iBAAiB,SAA0D;AAC/E,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,cAAc,KAAgD;AAClE,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,CAAC,CAAC,GAAG;AAAA,EAC/D;AAAA,EAEA,MAAM,iBACJ,KACA,SAC4B;AAC5B,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACtF;AAAA,EAEA,MAAM,iBAAiB,KAAmC;AACxD,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,QAAgD;AAC7D,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,UAAU,SAAgD;AAC9D,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,SAAS,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,QAAkC;AAC7C,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,GAAG;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAU,QAAgB,SAAgD;AAC9E,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,UAAU,QAA+B;AAC7C,UAAM,MAAM,WAAW,MAAM;AAC7B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,QAAgB,QAAsD;AACzF,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,aACJ,QACA,WACA,SAC2B;AAC3B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAA4B,EAAE,QAAQ,KAAK;AACjD,QAAI,SAAS,gBAAgB;AAC3B,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AACA,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,aAAa,QAAgB,WAAiD;AAClF,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,IAAI,IAAI,GAAG;AAAA,EAC1E;AAAA,EAEA,MAAM,gBACJ,QACA,WACA,SAC2B;AAC3B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAA4B,CAAC;AACnC,QAAI,SAAS,gBAAgB;AAC3B,WAAK,kBAAkB,QAAQ;AAAA,IACjC;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MACxE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,QAAgB,WAAqC;AACzE,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC1E,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,QAA2D;AACnF,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,qBAAqB,SAA8D;AACvF,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,oBAAoB,CAAC,KAAK;AAAA,MAClE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,SAA4D;AAClF,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,GAAG;AAAA,EACrE;AAAA,EAEA,MAAM,qBACJ,SACA,SACgC;AAChC,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,KAAK;AAAA,MACnE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBAAqB,SAA2C;AACpE,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,KAAK;AAAA,MACrE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,8BAA8B,SAAuD;AACzF,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UAAW,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,oBAAoB,GAAG,CAAC,GAAG,KAAM,CAAC;AAC3F,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,+BACJ,SACA,SACyB;AACzB,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,oBAAoB,GAAG,CAAC,KAAK;AAAA,MACrE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,+BACJ,SACA,aACe;AACf,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,oBAAoB,GAAG,CAAC,KAAK;AAAA,MACtE,QAAQ,EAAE,cAAc,YAAY;AAAA,MACpC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iCACJ,SACA,aAC2B;AAC3B,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UAAU,MAAM,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,qBAAqB,GAAG,CAAC,KAAK;AAAA,MACrF,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,EAC7C;AAAA;AAAA,EAIA,MAAM,gCACJ,SACA,aACiC;AACjC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UACH,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,0BAA0B,GAAG,CAAC,KAAK;AAAA,MAC1E,QAAQ,EAAE,cAAc,YAAY;AAAA,IACtC,CAAC,KAAM,CAAC;AACV,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,8BACJ,SACA,SAC+B;AAC/B,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,0BAA0B,GAAG,CAAC,KAAK;AAAA,MAC3E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iCACJ,SACA,SACe;AACf,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,0BAA0B,GAAG,CAAC,KAAK;AAAA,MAC5E,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,QAAqD;AACvE,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,eAAe,SAAwD;AAC3E,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,cAAc,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,YAAY,SAAgD;AAChE,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,GAAG;AAAA,EAC/D;AAAA,EAEA,MAAM,eACJ,SACA,SAC0B;AAC1B,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACtF;AAAA,EAEA,MAAM,eAAe,SAAqC;AACxD,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EACvF;AAAA;AAAA,EAIA,MAAM,wBAAwB,SAAiD;AAC7E,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UACH,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,wBAAwB,GAAG,CAAC,GAAG,KAAM,CAAC;AACjF,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,yBACJ,SACA,SACyB;AACzB,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,wBAAwB,GAAG,CAAC,KAAK;AAAA,MACzE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,SAAsB,aAAoC;AACvF,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK;AAAA,MACT;AAAA,MACA,GAAG,KAAK,MAAM,wBAAwB,GAAG,CAAC;AAAA,MAC1C,EAAE,QAAQ,EAAE,cAAc,YAAY,GAAG,WAAW,MAAM;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,2BACJ,SACA,aAC2B;AAC3B,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UAAU,MAAM,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,yBAAyB,GAAG,CAAC,KAAK;AAAA,MACzF,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,EAC7C;AAAA;AAAA,EAIA,MAAM,0BACJ,SACA,aACiC;AACjC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,UACH,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,8BAA8B,GAAG,CAAC,KAAK;AAAA,MAC9E,QAAQ,EAAE,cAAc,YAAY;AAAA,IACtC,CAAC,KAAM,CAAC;AACV,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,wBACJ,SACA,SAC+B;AAC/B,UAAM,MAAM,WAAW,OAAO;AAC9B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,8BAA8B,GAAG,CAAC,KAAK;AAAA,MAC/E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,2BACJ,SACA,SACe;AACf,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,8BAA8B,GAAG,CAAC,KAAK;AAAA,MAChF,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,QAAmD;AACnE,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,UAAU,WAA8C;AAC5D,UAAM,MAAM,WAAW,SAAS;AAChC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK;AAAA,MAC7D,QAAQ,EAAE,IAAI;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,MAAsC;AAC1D,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK;AAAA,MAC7D,QAAQ,EAAE,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,SAGG;AACtB,UAAM,SAA8B,CAAC;AACrC,QAAI,SAAS,IAAK,QAAO,MAAM,QAAQ;AACvC,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ;AACzC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,aAAa,SAAsD;AACvE,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,aACJ,WACA,SACwB;AACxB,UAAM,MAAM,WAAW,SAAS;AAChC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK;AAAA,MAC7D,QAAQ,EAAE,IAAI;AAAA,MACd,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,WAAqC;AACtD,UAAM,MAAM,WAAW,SAAS;AAChC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,gBAAgB,CAAC,KAAK;AAAA,MAC/D,QAAQ,EAAE,IAAI;AAAA,MACd,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBACJ,WACA,QAC4B;AAC5B,UAAM,MAAM,WAAW,SAAS;AAChC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,oBACJ,WACA,SACA,SAC+B;AAC/B,UAAM,MAAM,WAAW,SAAS;AAChC,UAAM,SAA8B,CAAC;AACrC,QAAI,SAAS,UAAU;AACrB,aAAO,YAAY,WAAW,QAAQ,QAAQ;AAAA,IAChD;AACA,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,KAAK;AAAA,MACpE,UAAU;AAAA,MACV,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBACJ,WACA,YACA,SAC+B;AAC/B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,SAA8B,CAAC;AACrC,QAAI,SAAS,kBAAkB,QAAW;AACxC,aAAO,iBAAiB,QAAQ;AAAA,IAClC;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,mBAAmB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC5E,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBACJ,WACA,YACA,SAC+B;AAC/B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,mBAAmB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC5E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBACJ,WACA,YACe;AACf,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,mBAAmB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC9E,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBACJ,WACA,YAC+B;AAC/B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,mBAAmB,IAAI,CAAC,IAAI,IAAI;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBACJ,WACA,YACA,QACoB;AACpB,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACtF;AAAA,EAEA,MAAM,kBACJ,WACA,YACA,SACuB;AACvB,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC,KAAK;AAAA,MACzE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,WACA,YACA,WACuB;AACvB,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC;AAAA,MAC1C,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,WACA,YACA,WACA,SACuB;AACvB,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC;AAAA,MAC1C,EAAE,QAAQ,EAAE,MAAM,UAAU,GAAG,UAAU,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,WACA,YACA,WACe;AACf,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC;AAAA,MAC1C,EAAE,QAAQ,EAAE,MAAM,UAAU,GAAG,WAAW,MAAM;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,QAAsD;AACzE,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,aAAa,cAAuD;AACxE,UAAM,MAAM,WAAW,YAAY;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,cAAc,GAAG,CAAC,GAAG;AAAA,EAChE;AAAA,EAEA,MAAM,gBAAgB,SAAyD;AAC7E,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,eAAe,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACtF;AAAA,EAEA,MAAM,gBACJ,cACA,SAC2B;AAC3B,UAAM,MAAM,WAAW,YAAY;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,gBAAgB,cAA2C;AAC/D,UAAM,MAAM,WAAW,YAAY;AACnC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBACJ,cACA,QAC4B;AAC5B,UAAM,MAAM,WAAW,YAAY;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,uBACJ,cACA,SACA,SAC+B;AAC/B,UAAM,MAAM,WAAW,YAAY;AACnC,UAAM,SAA8B,CAAC;AACrC,QAAI,SAAS,UAAU;AACrB,aAAO,YAAY,WAAW,QAAQ,QAAQ;AAAA,IAChD;AACA,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,sBAAsB,GAAG,CAAC,KAAK;AAAA,MACvE,UAAU;AAAA,MACV,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBACJ,cACA,YACA,SAC+B;AAC/B,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,SAA8B,CAAC;AACrC,QAAI,SAAS,kBAAkB,QAAW;AACxC,aAAO,iBAAiB,QAAQ;AAAA,IAClC;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,sBAAsB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC/E,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,wBACJ,cACA,YAC+B;AAC/B,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,sBAAsB,IAAI,CAAC,IAAI,IAAI;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,uBACJ,cACA,YACA,SAC+B;AAC/B,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,sBAAsB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MAC/E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,uBACJ,cACA,YACe;AACf,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,sBAAsB,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MACjF,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBACJ,cACA,YACA,QACoB;AACpB,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,oBAAoB,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,qBACJ,cACA,YACA,SACuB;AACvB,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,oBAAoB,MAAM,IAAI,CAAC,KAAK;AAAA,MAC5E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,cACA,YACA,WACuB;AACvB,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,oBAAoB,MAAM,IAAI,CAAC;AAAA,MAC7C,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,cACA,YACA,WACA,SACuB;AACvB,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,oBAAoB,MAAM,IAAI,CAAC;AAAA,MAC7C,EAAE,QAAQ,EAAE,MAAM,UAAU,GAAG,UAAU,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,cACA,YACA,WACe;AACf,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,GAAG,KAAK,MAAM,oBAAoB,MAAM,IAAI,CAAC;AAAA,MAC7C,EAAE,QAAQ,EAAE,MAAM,UAAU,GAAG,WAAW,MAAM;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,WACA,QACuB;AACvB,UAAM,MAAM,WAAW,SAAS;AAChC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,YAAY,WAAsB,aAAoD;AAC1F,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,IAAI,GAAG;AAAA,EACxE;AAAA,EAEA,MAAM,eACJ,WACA,SACA,SAC0B;AAC1B,UAAM,MAAM,WAAW,SAAS;AAChC,UAAM,SAAiC,CAAC;AACxC,QAAI,SAAS,WAAW;AACtB,aAAO,YAAY,WAAW,QAAQ,SAAS;AAAA,IACjD;AACA,UAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,QAAI,SAAS,YAAY;AACvB,WAAK,cAAc,QAAQ;AAAA,IAC7B;AACA,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK;AAAA,MAC9D,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,MAC9C,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,WACA,SACA,SAC0B;AAC1B,UAAM,MAAM,WAAW,SAAS;AAChC,UAAM,SAAiC,EAAE,aAAa,QAAQ,WAAW;AACzE,QAAI,QAAQ,WAAW;AACrB,aAAO,YAAY,WAAW,QAAQ,SAAS;AAAA,IACjD;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK;AAAA,MAC7D;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBACJ,WACA,OACA,SAK4B;AAC5B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,iBAAiB,SAAS,kBAAkB;AAClD,QAAI,iBAAiB,GAAG;AACtB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IACrC;AACA,UAAM,WAAW,SAAS,YAAY;AACtC,UAAM,aAAa,SAAS;AAE5B,UAAM,YAA+B,CAAC;AACtC,UAAM,SAA2B,CAAC;AAClC,QAAI,YAAY;AAEhB,UAAM,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC;AAEjC,UAAM,cAAc,OAAO,OAAe,SAAyC;AACjF,UAAI;AACF,cAAM,SAAiC,EAAE,aAAa,KAAK,YAAY;AACvE,YAAI,KAAK,WAAW;AAClB,iBAAO,YAAY,KAAK;AAAA,QAC1B;AACA,cAAM,SAA0B,MAAM,KAAK;AAAA,UACzC;AAAA,UACA,GAAG,KAAK,MAAM,aAAa,IAAI,CAAC;AAAA,UAChC,EAAE,QAAQ,UAAU,KAAK,QAAQ;AAAA,QACnC;AACA,kBAAU,KAAK,MAAM;AAAA,MACvB,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV;AAAA,UACA,aAAa,KAAK;AAAA,UAClB,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,QAC3D,CAAC;AACD,YAAI,UAAU;AACZ,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA;AACA,qBAAa,WAAW,MAAM,MAAM;AAAA,MACtC;AAAA,IACF;AAGA,QAAI,IAAI;AACR,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,cAAc;AAC/C,UAAI;AACF,cAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,YAAY,OAAO,IAAI,CAAC,CAAC;AAAA,MAC1E,SAAS,KAAK;AACZ,YAAI,SAAU,OAAM;AAAA,MACtB;AACA,WAAK;AAAA,IACP;AAEA,WAAO,EAAE,WAAW,OAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,eACJ,WACA,aACA,SAC0B;AAC1B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MACrE,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK,YAAY,MAAM,IAAI;AAAA,EACpC;AAAA,EAEA,MAAM,eAAe,WAAsB,aAAyC;AAClF,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,IAAI,KAAK;AAAA,MACxE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBACJ,WACA,aAC8B;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,IAAI,CAAC,IAAI,IAAI,QAAQ;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,WACA,aACA,QACuB;AACvB,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,eACJ,WACA,aACA,SAC0B;AAC1B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,KAAK;AAAA,MACrE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YACJ,WACA,aACA,aAC0B;AAC1B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK,GAAG;AAAA,EAC/E;AAAA,EAEA,MAAM,eACJ,WACA,aACA,aACA,SAC0B;AAC1B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK,KAAK;AAAA,MAC7E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,WACA,aACA,aACe;AACf,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK,KAAK;AAAA,MAC/E,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBACJ,WACA,aACA,aACA,SAC0B;AAC1B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK;AAAA,MAC/C,UAAU,EAAE,UAAU,QAAQ,IAAI;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,WACA,aACA,aAC8B;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAM,gBACJ,WACA,aACA,aAC8B;AAC9B,UAAM,OAAO,WAAW,SAAS;AACjC,UAAM,OAAO,WAAW,WAAW;AACnC,UAAM,QAAQ,WAAW,WAAW;AACpC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,MAAM,IAAI,CAAC,IAAI,KAAK,QAAQ;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAmC;AACvC,UAAM,UAAW,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,YAAY,CAAC,GAAG,KAAM,CAAC;AAChF,WAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,aAAa,SAAsD;AACvE,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,YAAY,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,UAAU,MAAsC;AACpD,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,WAAW,IAAI,CAAC,GAAG;AAAA,EAC9D;AAAA,EAEA,MAAM,aAAa,MAAc,SAAsD;AACrF,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,WAAW,IAAI,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,aAAa,MAA6B;AAC9C,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,WAAW,IAAI,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAAgB,QAAoD;AACrF,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,WAAW,QAAgB,YAAiD;AAChF,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,YAAY,MAAM,IAAI,CAAC,GAAG;AAAA,EACrE;AAAA,EAEA,MAAM,cAAc,QAAgB,SAAuD;AACzF,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,cACJ,QACA,YACA,SACyB;AACzB,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,YAAY,MAAM,IAAI,CAAC,KAAK;AAAA,MACnE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,QAAgB,YAAuC;AACzE,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,YAAY,MAAM,IAAI,CAAC,KAAK;AAAA,MACrE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBACJ,QACA,YAC0B;AAC1B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,UACH,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC,GAAG,KAAM,CAAC;AACjF,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,WAAW,OAAO,YAAY,YAAY,aAAa,SAAS;AAClE,aAAQ,QAA8C;AAAA,IACxD;AACA,WAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EAEA,MAAM,eACJ,QACA,YACA,QAC6B;AAC7B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,OAAO,WAAW,MAAM;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,MAAM,MAAM,IAAI,CAAC,GAAG;AAAA,EAC/E;AAAA,EAEA,MAAM,kBACJ,QACA,YACA,SAC6B;AAC7B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,MAAM,iBAAiB,MAAM,IAAI,CAAC,KAAK;AAAA,MACzE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,QACA,YACA,QACA,SAC6B;AAC7B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,OAAO,WAAW,MAAM;AAC9B,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,MAAM,gBAAgB,MAAM,MAAM,IAAI,CAAC,KAAK;AAAA,MAC7E,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,QACA,YACA,QACe;AACf,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,KAAK,QAAQ,UAAU,GAAG,KAAK,MAAM,gBAAgB,MAAM,MAAM,IAAI,CAAC,KAAK;AAAA,MAC/E,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,QACA,YACA,QACA,WACe;AACf,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,KAAK;AAAA,MACT;AAAA,MACA,GAAG,KAAK,MAAM,gBAAgB,MAAM,MAAM,IAAI,CAAC;AAAA,MAC/C,EAAE,UAAU,EAAE,YAAY,UAAU,EAAE;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,4BACJ,QACA,YACA,QACA,SAC6B;AAC7B,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAAO,WAAW,UAAU;AAClC,UAAM,OAAO,WAAW,MAAM;AAC9B,UAAM,OAA4B,EAAE,kBAAkB,QAAQ,gBAAgB;AAC9E,QAAI,QAAQ,kBAAkB;AAC5B,WAAK,oBAAoB,QAAQ;AAAA,IACnC;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAG,KAAK,MAAM,gBAAgB,MAAM,MAAM,IAAI,CAAC;AAAA,MAC/C,EAAE,UAAU,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,2BACJ,QACA,YACA,QAC6B;AAC7B,WAAO,KAAK,4BAA4B,QAAQ,YAAY,QAAQ;AAAA,MAClE,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACh0CA,SAAS,YAAY,QAAwB;AAC3C,QAAM,QAAQ,OAAO,QAAQ,cAAc,EAAE;AAC7C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,YAA4B;AACvD,SAAO,WAAW,QAAQ,cAAc,EAAE;AAC5C;AAgBO,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACQ;AAAA,EAEjB,YAAY,SAA4B;AACtC,SAAK,YAAY,YAAY,QAAQ,SAAS;AAC9C,UAAM,SAAS,aAAa;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ,WAAW;AAAA,MAC5B,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,SAAK,YAAY,IAAI,cAAc;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,YAAoB,SAAS,IAAY;AACzD,UAAM,SAAS,oBAAoB,UAAU;AAC7C,UAAM,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM;AACzC,WAAO,SAAS,GAAG,IAAI,GAAG,MAAM,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,cAAuB,YAAoB,QAA0C;AACzF,UAAM,OAAO,KAAK,UAAU,UAAU;AACtC,WAAO,KAAK,UAAU,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,YACJ,YACA,aACA,QACY;AACZ,UAAM,OAAO,KAAK,UAAU,YAAY,IAAI,WAAW,EAAE;AACzD,WAAO,KAAK,UAAU,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,OAAgB,YAAoB,MAAuC;AAC/E,UAAM,OAAO,KAAK,UAAU,YAAY,UAAU;AAClD,WAAO,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,UAAU,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@foxnose/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official FoxNose SDK for TypeScript and JavaScript",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.cts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "LICENSE",
25
+ "README.md"
26
+ ],
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "test": "vitest run",
33
+ "test:watch": "vitest",
34
+ "test:coverage": "vitest run --coverage",
35
+ "lint": "eslint src/ tests/",
36
+ "format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'",
37
+ "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'",
38
+ "typecheck": "tsc --noEmit",
39
+ "prepublishOnly": "pnpm run build"
40
+ },
41
+ "keywords": [
42
+ "foxnose",
43
+ "cms",
44
+ "headless-cms",
45
+ "content-management",
46
+ "api-client",
47
+ "sdk"
48
+ ],
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/foxnose/ts-sdk.git"
52
+ },
53
+ "packageManager": "pnpm@10.29.2",
54
+ "homepage": "https://foxnose.net",
55
+ "devDependencies": {
56
+ "@types/node": "^20.0.0",
57
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
58
+ "@typescript-eslint/parser": "^7.0.0",
59
+ "@vitest/coverage-v8": "^2.0.0",
60
+ "eslint": "^8.57.0",
61
+ "prettier": "^3.3.0",
62
+ "tsup": "^8.0.0",
63
+ "typescript": "^5.5.0",
64
+ "vitest": "^2.0.0"
65
+ }
66
+ }