{"version":3,"sources":["../src/server.ts","../../eden/src/utils/noop.ts","../../eden/src/links/internal/observable.ts","../../eden/src/links/internal/operation.ts","../../eden/src/links/internal/create-chain.ts","../../eden/src/links/internal/operators.ts","../../eden/src/constants.ts","../../eden/src/errors.ts","../../eden/src/http.ts","../../eden/src/links/internal/transformer.ts","../../eden/src/utils/file.ts","../../eden/src/utils/http.ts","../../eden/src/utils/parse.ts","../../eden/src/resolve.ts","../../eden/src/utils/null.ts","../../eden/src/links/internal/universal-requester.ts","../../eden/src/links/http-link.ts","../../eden/src/links/internal/batched-data-loader.ts","../../eden/src/links/http-batch-link.ts","../../eden/src/links/logger-link.ts","../../eden/src/links/split-link.ts","../../eden/src/ws.ts","../../eden/src/plugins/batch.ts","../../eden/src/utils/create-url.ts","../../eden/src/utils/set.ts","../../eden/src/plugins/transform.ts","../../eden/src/plugins/index.ts"],"sourcesContent":["export * from '@aydee-app/eden/server'\n","export function noop() {\n  /* noop */\n}\n\nexport async function asyncNoop() {\n  /* noop */\n}\n\nexport function constNoop<T>(value: T): () => T {\n  return () => value\n}\n\nexport function asyncConstNoop<T>(value: T): () => Promise<T> {\n  return async () => value\n}\n\nexport type Noop = typeof noop\n","/* eslint-disable no-dupe-class-members */\n\nimport { type Noop, noop } from '../../utils/noop'\n\nexport type TeardownLogic = Unsubscribable | Noop | void\n\nexport type UnaryFunction<TSource = any, TReturn = any> = (source: TSource) => TReturn\n\nexport type MonoTypeOperatorFunction<TValue, TError> = OperatorFunction<\n  TValue,\n  TError,\n  TValue,\n  TError\n>\n\nexport type OperatorFunction<\n  TValueBefore = any,\n  TErrorBefore = any,\n  TValueAfter = any,\n  TErrorAfter = any,\n> = UnaryFunction<Subscribable<TValueBefore, TErrorBefore>, Subscribable<TValueAfter, TErrorAfter>>\n\nexport type Observer<TValue = any, TError = any> = {\n  next: (value: TValue) => void\n  error: (err: TError) => void\n  complete: () => void\n}\n\nexport type Unsubscribable = {\n  unsubscribe(): void\n}\n\nexport type InferObservableValue<TObservable> =\n  TObservable extends Observable<infer TValue, unknown> ? TValue : never\n\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n  return typeof x === 'object' && x !== null && 'subscribe' in x\n}\n\nexport function pipeReducer(previousValue: any, next: UnaryFunction) {\n  return next(previousValue)\n}\n\nexport function promisifyObservable<T>(observable: Observable<T>) {\n  let abort = noop\n\n  const promise = new Promise<T>((resolve, reject) => {\n    let isDone = false\n\n    const onDone = () => {\n      if (isDone) return\n      isDone = true\n      reject(new ObservableAbortError('This operation was aborted.'))\n      obs$.unsubscribe()\n    }\n\n    const obs$ = observable.subscribe({\n      next: (data) => {\n        isDone = true\n        resolve(data)\n        onDone()\n      },\n      error: (data) => {\n        isDone = true\n        reject(data)\n        onDone()\n      },\n      complete: () => {\n        isDone = true\n        onDone()\n      },\n    })\n\n    abort = onDone\n  })\n\n  return { promise, abort }\n}\n\nexport class ObservableAbortError extends Error {\n  constructor(message?: string) {\n    super(message)\n    this.name = 'ObservableAbortError'\n    Object.setPrototypeOf(this, ObservableAbortError.prototype)\n  }\n}\n\nexport class Subscribable<TValue = any, TError = any> {\n  constructor(public onSubscribe: (observer: Observer<TValue, TError>) => TeardownLogic) {}\n\n  subscribe(observer?: Partial<Observer<TValue, TError>>): Unsubscribable {\n    let teardownRef: TeardownLogic | null = null\n    let isDone = false\n    let unsubscribed = false\n    let teardownImmediately = false\n\n    let unsubscribe = () => {\n      if (unsubscribed) return\n\n      if (teardownRef === null) {\n        teardownImmediately = true\n        return\n      }\n\n      unsubscribed = true\n\n      if (typeof teardownRef === 'function') {\n        teardownRef()\n      } else if (teardownRef) {\n        teardownRef.unsubscribe()\n      }\n    }\n\n    teardownRef = this.onSubscribe({\n      next: (value) => {\n        if (isDone) return\n        observer?.next?.(value)\n      },\n      error: (err) => {\n        if (isDone) return\n        isDone = true\n        observer?.error?.(err)\n        unsubscribe()\n      },\n      complete: () => {\n        if (isDone) return\n        isDone = true\n        observer?.complete?.()\n        unsubscribe()\n      },\n    })\n\n    if (teardownImmediately) {\n      unsubscribe()\n    }\n\n    return {\n      unsubscribe,\n    }\n  }\n}\n\nexport class Observable<TValue = any, TError = any> extends Subscribable<TValue, TError> {\n  constructor(onSubscribe: (observer: Observer<TValue, TError>) => TeardownLogic) {\n    super(onSubscribe)\n  }\n\n  pipe(): Observable<TValue, TError>\n\n  pipe<TValue1, TError1>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n  ): Observable<TValue1, TError1>\n\n  pipe<TValue1, TError1, TValue2, TError2>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n  ): Observable<TValue2, TError2>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n  ): Observable<TValue3, TError3>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3, TValue4, TError4>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n    op4: OperatorFunction<TValue3, TError3, TValue4, TError4>,\n  ): Observable<TValue4, TError4>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3, TValue4, TError4, TValue5, TError5>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n    op4: OperatorFunction<TValue3, TError3, TValue4, TError4>,\n    op5: OperatorFunction<TValue4, TError4, TValue5, TError5>,\n  ): Observable<TValue5, TError5>\n\n  pipe(...operations: OperatorFunction[]): Observable {\n    return operations.reduce(pipeReducer, this)\n  }\n}\n","import type { AnyElysia } from 'elysia'\n\nimport type { EdenRequestParams } from '../../resolve'\nimport type { Observable, Observer } from './observable'\n\nexport type OperationType = 'query' | 'mutation' | 'subscription'\n\nexport interface OperationContext extends Record<string, unknown> {}\n\nexport type Operation<T extends AnyElysia = any> = {\n  id: number\n  type: OperationType\n  params: EdenRequestParams<T>\n  context: OperationContext\n}\n\nexport type OperationLink<\n  TElysia extends AnyElysia = AnyElysia,\n  TInput = unknown,\n  TOutput = unknown,\n> = (\n  options: OperationLinkOptions<TElysia, TInput, TOutput>,\n) => OperationResultObservable<TElysia, TOutput>\n\nexport type OperationLinkOptions<\n  TElysia extends AnyElysia = AnyElysia,\n  _TInput = unknown,\n  TOutput = unknown,\n> = {\n  operation: Operation<TElysia>\n  next: (operation: Operation<TElysia>) => OperationResultObservable<TElysia, TOutput>\n}\n\nexport type OperationResultObservable<TElysia extends AnyElysia, TOutput> = Observable<\n  OperationResultEnvelope<TOutput>,\n  EdenClientError<TElysia>\n>\n\nexport type OperationResultObserver<TRoute extends AnyElysia, TOutput> = Observer<\n  OperationResultEnvelope<TOutput>,\n  EdenClientError<TRoute>\n>\n\nexport type OperationResultEnvelope<T = any> = (EdenResultMessage<T> | EdenSuccessResponse<T>) & {\n  context?: OperationContext\n}\n\nexport type EdenResultMessage<T> =\n  | { type: 'started'; data?: never }\n  | { type: 'stopped'; data?: never }\n  | { data: T; type: 'data' }\n\nexport type EdenSuccessResponse<T> = { data: T; type?: 'data' }\n\nexport type EdenLink<T extends AnyElysia = any, TMeta = {}> = ((\n  opts: EdenClientRuntime,\n) => OperationLink<T>) &\n  TMeta\n\nexport type EdenClientRuntime = {}\n\nexport type EdenClientOptions<T extends AnyElysia> = {\n  links: EdenLink<T>[]\n}\n\n/**\n * TODO: placeholder for TRPCClientError<TInferrable>.\n */\nexport type EdenClientError<_T extends AnyElysia> = any\n\nexport class OperationError extends Error {\n  constructor(message?: string) {\n    super(message)\n  }\n}\n","import type { AnyElysia } from 'elysia'\n\nimport { Observable } from './observable'\nimport {\n  type Operation,\n  OperationError,\n  type OperationLink,\n  type OperationResultObservable,\n} from './operation'\n\nexport type ChainOptions<TElysia extends AnyElysia, TInput = unknown, TOutput = unknown> = {\n  links: OperationLink<TElysia, TInput, TOutput>[]\n  operation: Operation<TElysia>\n}\n\nexport function createChain<TElysia extends AnyElysia, TInput = unknown, TOutput = unknown>(\n  options: ChainOptions<TElysia, TInput, TOutput>,\n): OperationResultObservable<TElysia, TOutput> {\n  const observable = new Observable((observer) => {\n    const execute = (index = 0, operation = options.operation) => {\n      const next = options.links[index]\n\n      if (next == null) {\n        throw new OperationError('No more links to execute - did you forget to add an ending link?')\n      }\n\n      const subscription = next({\n        operation,\n        next: (nextOp) => {\n          const nextObserver = execute(index + 1, nextOp)\n          return nextObserver\n        },\n      })\n\n      return subscription\n    }\n\n    const rootObservable = execute()\n\n    const $rootObservable = rootObservable.subscribe(observer)\n\n    return $rootObservable\n  })\n\n  return observable\n}\n","import type {\n  MonoTypeOperatorFunction,\n  Observer,\n  OperatorFunction,\n  Unsubscribable,\n} from './observable'\nimport { Observable } from './observable'\n\nexport function map<TValueBefore, TError, TValueAfter>(\n  project: (value: TValueBefore, index: number) => TValueAfter,\n): OperatorFunction<TValueBefore, TError, TValueAfter, TError> {\n  return (source) => {\n    const observable = new Observable((subscriber) => {\n      let index = 0\n\n      const subscription = source.subscribe({\n        next: (value) => {\n          subscriber.next(project(value, index++))\n        },\n        error: (error) => {\n          subscriber.error(error)\n        },\n        complete: () => {\n          subscriber.complete()\n        },\n      })\n      return subscription\n    })\n    return observable\n  }\n}\n\ninterface ShareOptions {}\n\nexport function share<TValue, TError>(\n  _options?: ShareOptions,\n): MonoTypeOperatorFunction<TValue, TError> {\n  return (source) => {\n    let refCount = 0\n\n    let subscription: Unsubscribable | null = null\n\n    const observers: Partial<Observer<TValue, TError>>[] = []\n\n    const startIfNeeded = () => {\n      if (subscription != null) return\n\n      // Make shallow copy of observers in case they unsubscribe during the loop.\n\n      subscription = source.subscribe({\n        next: (value) => {\n          for (const observer of [...observers]) {\n            observer.next?.(value)\n          }\n        },\n        error: (error) => {\n          for (const observer of [...observers]) {\n            observer.error?.(error)\n          }\n        },\n        complete: () => {\n          for (const observer of [...observers]) {\n            observer.complete?.()\n          }\n        },\n      })\n    }\n\n    const resetIfNeeded = () => {\n      if (refCount === 0 && subscription != null) {\n        const _sub = subscription\n        subscription = null\n        _sub.unsubscribe()\n      }\n    }\n\n    return new Observable((observer) => {\n      refCount++\n\n      observers.push(observer)\n\n      startIfNeeded()\n\n      return {\n        unsubscribe: () => {\n          refCount--\n\n          resetIfNeeded()\n\n          const index = observers.findIndex((observer) => observer === observer)\n\n          if (index >= 0) {\n            observers.splice(index, 1)\n          }\n        },\n      }\n    })\n  }\n}\n\nexport function tap<TValue, TError>(\n  observer: Partial<Observer<TValue, TError>>,\n): MonoTypeOperatorFunction<TValue, TError> {\n  return (source) => {\n    return new Observable((subscriber) => {\n      const subscription = source.subscribe({\n        next: (value) => {\n          observer.next?.(value)\n          subscriber.next(value)\n        },\n        error: (error) => {\n          observer.error?.(error)\n          subscriber.error(error)\n        },\n        complete: () => {\n          observer.complete?.()\n          subscriber.complete()\n        },\n      })\n      return subscription\n    })\n  }\n}\n","export const GET_OR_HEAD_HTTP_METHODS = ['get', 'head', 'subscribe'] as const\n\nexport const HTTP_METHODS = [\n  ...GET_OR_HEAD_HTTP_METHODS,\n  'post',\n  'put',\n  'delete',\n  'patch',\n  'options',\n  'connect',\n] as const\n\nexport const LOOPBACK_ADDRESSES = ['localhost', '127.0.0.1', '0.0.0.0']\n\nexport const IS_SERVER = typeof FileList === 'undefined'\n\nexport const CLIENT_WARNING =\n  'Elysia instance server found on client side, this is not recommended for security reason. Use generic type instead.'\n\nexport const DEMO_DOMAIN = 'http://e.ly'\n\nexport const ISO8601_REGEX =\n  /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/\n\nexport const FORMAL_DATE_REGEX =\n  /(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s\\d{2}\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}\\sGMT(?:\\+|-)\\d{4}\\s\\([^)]+\\)/\n\nexport const SHORTENED_DATE_REGEX =\n  /^(?:(?:(?:(?:0?[1-9]|[12][0-9]|3[01])[/\\s-](?:0?[1-9]|1[0-2])[/\\s-](?:19|20)\\d{2})|(?:(?:19|20)\\d{2}[/\\s-](?:0?[1-9]|1[0-2])[/\\s-](?:0?[1-9]|[12][0-9]|3[01]))))(?:\\s(?:1[012]|0?[1-9]):[0-5][0-9](?::[0-5][0-9])?(?:\\s[AP]M)?)?$/\n\nexport const BATCH_ENDPOINT = '/batch'\n","import type { AnyElysia } from 'elysia'\n\nimport type { Range } from './utils/types'\n\nexport class EdenFetchError<Status extends number = number, Value = unknown> extends Error {\n  constructor(\n    public status: Status,\n    public value: Value,\n  ) {\n    super(value + '')\n  }\n}\n\nexport class EdenFatalError extends Error {\n  static throw() {\n    return new EdenFatalError()\n  }\n\n  constructor() {\n    super(\n      'Something went wrong. Please submit an issue at https://github.com/aydee-app/eden-query/issues/new',\n    )\n  }\n}\n\nexport type MapError<T extends Record<number, unknown>> = [\n  {\n    [K in keyof T]-?: K extends ErrorRange ? K : never\n  }[keyof T],\n] extends [infer A extends number]\n  ? {\n      [K in A]: EdenFetchError<K, T[K]>\n    }[A]\n  : false\n\nexport type ErrorRange = Range<300, 599>\n\n/**\n * @todo\n */\nexport type EdenClientErrorLike<_T extends AnyElysia> = any\n\nexport const ERROR_SYMBOL = Symbol('TypeError')\n\nexport type TypeError<TMessage extends string> = TMessage & {\n  _: typeof ERROR_SYMBOL\n}\n","import type { Nullish } from './utils/null'\n\nexport interface HeadersInitEsque {\n  [Symbol.iterator](): IterableIterator<[string, string]>\n}\n\nexport type HTTPHeaders = HeadersInitEsque | Record<string, string[] | string | undefined>\n\nexport type AbortControllerEsque = new () => AbortControllerInstanceEsque\n\n/**\n * Allows you to abort one or more requests.\n */\nexport interface AbortControllerInstanceEsque {\n  /**\n   * The AbortSignal object associated with this object.\n   */\n  readonly signal: AbortSignal\n\n  /**\n   * Sets this object's AbortSignal's aborted flag and signals to\n   * any observers that the associated activity is to be aborted.\n   */\n  abort(): void\n}\n\nexport type HTTPLinkBaseOptions = {\n  /**\n   * Define AbortController implementation.\n   */\n  AbortController?: AbortControllerEsque | null\n\n  /**\n   * Send all requests `as POST`s requests regardless of the procedure type.\n   * The HTTP handler must separately allow overriding the method.\n   *\n   * @see https://trpc.io/docs/rpc\n   */\n  methodOverride?: 'POST'\n}\n\nexport function getAbortController(\n  abortControllerPolyfill?: AbortControllerEsque | Nullish,\n): AbortControllerEsque | null {\n  if (abortControllerPolyfill) {\n    return abortControllerPolyfill\n  }\n\n  if (typeof window !== 'undefined' && window.AbortController) {\n    return window.AbortController\n  }\n\n  if (typeof globalThis !== 'undefined' && globalThis.AbortController) {\n    return globalThis.AbortController\n  }\n\n  return null\n}\n\nexport const httpQueryMethods = ['get', 'options', 'head'] as const\n\nexport const httpMutationMethods = ['post', 'put', 'patch', 'delete'] as const\n\nexport const httpSubscriptionMethods = ['connect', 'subscribe'] as const\n\nexport const httpMethods = [\n  ...httpQueryMethods,\n  ...httpMutationMethods,\n  ...httpSubscriptionMethods,\n] as const\n\n/**\n * Recognized HTTP methods for queries.\n */\nexport type HttpQueryMethod = (typeof httpQueryMethods)[number]\n\n/**\n * Recognized HTTP methods for mutations.\n */\nexport type HttpMutationMethod = (typeof httpMutationMethods)[number]\n\n/**\n * Recognized HTTP methods for subscriptions.\n */\nexport type HttpSubscriptionMethod = (typeof httpSubscriptionMethods)[number]\n\n/**\n * All recognized HTTP methods.\n */\nexport type HttMethod = (typeof httpMethods)[number]\n","/**\n * @see https://github.com/trpc/trpc/blob/next/packages/server/src/unstable-core-do-not-import/transformer.ts\n */\n\n/**\n * Data-transformers share the same interface, but have different semantics depending\n * on where they are executed during a request.\n */\nexport type DataTransformer = {\n  /**\n   * Convert a raw value from the program into a JSON-serializable value.\n   *\n   * The raw JSON value needs to be a valid input into {@link JSON.stringify}.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * Take a raw JSON value and convert it into the desired value to be used in the program.\n   *\n   * The raw JSON value can be anything returned from {@link JSON.parse}.\n   */\n  deserialize: (object: any) => any\n}\n\ninterface InputDataTransformer extends DataTransformer {\n  /**\n   * This function runs **on the client** before sending the data to the server.\n   *\n   * This should return a JSON-serializable value, e.g. a string.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * This function runs **on the server** to transform the data before it is passed to the resolver\n   */\n  deserialize: (object: any) => any\n}\n\ninterface OutputDataTransformer extends DataTransformer {\n  /**\n   * This function runs **on the server** before sending the data to the client.\n   *\n   * This should return a JSON-serializable value, e.g. a string.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * This function runs **only on the client** to transform the data sent from the server.\n   */\n  deserialize: (object: any) => any\n}\n\nexport interface CombinedDataTransformer {\n  /**\n   * Specify how the data sent from the client to the server should be transformed.\n   */\n  input: InputDataTransformer\n  /**\n   * Specify how the data sent from the server to the client should be transformed.\n   */\n  output: OutputDataTransformer\n}\n\nexport type DataTransformerOptions = CombinedDataTransformer | DataTransformer\n\nconst defaultTransformer: DataTransformer = {\n  serialize: (value) => value,\n  deserialize: (value) => value,\n}\n\nconst defaultDataTransformer: CombinedDataTransformer = {\n  input: defaultTransformer,\n  output: defaultTransformer,\n}\n\nexport function getDataTransformer(transformer?: DataTransformerOptions): CombinedDataTransformer {\n  if (transformer == null) {\n    return defaultDataTransformer\n  }\n\n  if ('serialize' in transformer) {\n    return { input: transformer, output: transformer }\n  }\n\n  return transformer\n}\n","import { IS_SERVER } from '../constants'\n\nexport function isFile(v: any) {\n  if (IS_SERVER) return v instanceof Blob\n\n  return v instanceof FileList || v instanceof File\n}\n\nexport function hasFile(object?: Record<string, any>): boolean {\n  if (!object) {\n    return false\n  }\n\n  for (const key in object) {\n    if (isFile(object[key])) return true\n\n    if (Array.isArray(object[key]) && (object[key] as unknown[]).find(isFile)) return true\n  }\n\n  return false\n}\n","import { GET_OR_HEAD_HTTP_METHODS, HTTP_METHODS } from '../constants'\n\nexport function isHttpMethod(value: unknown): boolean {\n  return HTTP_METHODS.includes(value as any)\n}\n\nexport function isGetOrHeadMethod(value: unknown): boolean {\n  return GET_OR_HEAD_HTTP_METHODS.includes(value as any)\n}\n","import { FORMAL_DATE_REGEX, ISO8601_REGEX, SHORTENED_DATE_REGEX } from '../constants'\n\nfunction isNumericString(message: string) {\n  return message.trim().length !== 0 && !Number.isNaN(Number(message))\n}\n\nfunction isStringifiedObject(value: string): boolean {\n  const start = value.charCodeAt(0)\n  const end = value.charCodeAt(value.length - 1)\n\n  return (start === 123 && end === 125) || (start === 91 && end === 93)\n}\n\nexport function parseStringifiedDate(value: unknown): Date | null {\n  if (typeof value !== 'string') {\n    return null\n  }\n\n  // Remove quote from stringified date\n  const temp = value.replace(/\"/g, '')\n\n  if (ISO8601_REGEX.test(temp) || FORMAL_DATE_REGEX.test(temp) || SHORTENED_DATE_REGEX.test(temp)) {\n    const date = new Date(temp)\n\n    if (!Number.isNaN(date.getTime())) {\n      return date\n    }\n  }\n\n  return null\n}\n\nexport function parseStringifiedObject(data: string) {\n  return JSON.parse(data, (_, value) => {\n    const date = parseStringifiedDate(value)\n\n    if (date) {\n      return date\n    }\n\n    return value\n  })\n}\n\nexport function parseStringifiedValue(value: string) {\n  if (!value) {\n    return value\n  }\n\n  if (isNumericString(value)) {\n    return +value\n  }\n\n  if (value === 'true') {\n    return true\n  }\n\n  if (value === 'false') {\n    return false\n  }\n\n  const date = parseStringifiedDate(value)\n\n  if (date) {\n    return date\n  }\n\n  if (isStringifiedObject(value)) {\n    try {\n      return parseStringifiedObject(value)\n    } catch {\n      // noop\n    }\n  }\n\n  return value\n}\n\nexport function parseMessageEvent(event: MessageEvent) {\n  const messageString = event.data.toString()\n\n  return messageString === 'null' ? null : parseStringifiedValue(messageString)\n}\n","import type { AnyElysia } from 'elysia'\n\nimport type { EdenConfig } from './config'\nimport { DEMO_DOMAIN, IS_SERVER, LOOPBACK_ADDRESSES } from './constants'\nimport { EdenFetchError } from './errors'\nimport type { InferRouteBody, InferRouteOptions } from './infer'\nimport { getDataTransformer } from './links/internal/transformer'\nimport type { EdenRequestOptions, EdenResponse } from './request'\nimport { hasFile } from './utils/file'\nimport { isGetOrHeadMethod } from './utils/http'\nimport { parseStringifiedValue } from './utils/parse'\nimport { EdenWS } from './ws'\n\nfunction createNewFile(v: File) {\n  if (IS_SERVER) {\n    return v\n  }\n\n  return new Promise<File>((resolve) => {\n    const reader = new FileReader()\n\n    reader.onload = () => {\n      const filebits = reader.result != null ? [reader.result] : []\n      const name = v.name\n      const lastModified = v.lastModified\n      const type = v.type\n\n      const file = new File(filebits, name, { lastModified, type })\n\n      resolve(file)\n    }\n\n    reader.readAsArrayBuffer(v)\n  })\n}\n\nasync function processHeaders(\n  configHeaders: EdenConfig['headers'],\n  path: string,\n  options: RequestInit = {},\n  headers: Record<string, string> = {},\n): Promise<Record<string, string>> {\n  if (Array.isArray(configHeaders)) {\n    for (const value of configHeaders)\n      if (!Array.isArray(value)) {\n        headers = await processHeaders(value, path, options, headers)\n      } else {\n        const key = value[0]\n        if (typeof key === 'string') {\n          headers[key.toLowerCase()] = value[1] as string\n        } else {\n          for (const [k, value] of key) {\n            if (k) {\n              headers[k.toLowerCase()] = value as string\n            }\n          }\n        }\n      }\n\n    return headers\n  }\n\n  if (!configHeaders) {\n    return headers\n  }\n\n  switch (typeof configHeaders) {\n    case 'function': {\n      if (configHeaders instanceof Headers) {\n        return processHeaders(configHeaders, path, options, headers)\n      }\n\n      const customHeaders = await configHeaders(path, options)\n\n      if (customHeaders) {\n        return processHeaders(customHeaders, path, options, headers)\n      }\n\n      return headers\n    }\n\n    case 'object': {\n      if (configHeaders instanceof Headers) {\n        configHeaders.forEach((value, key) => {\n          headers[key.toLowerCase()] = value\n        })\n\n        return headers\n      }\n\n      for (const [key, value] of Object.entries(configHeaders)) {\n        headers[key.toLowerCase()] = value\n      }\n\n      return headers\n    }\n\n    default: {\n      return headers\n    }\n  }\n}\n\nexport async function* streamResponse(response: Response) {\n  const body = response.body\n\n  if (!body) return\n\n  const reader = body.getReader()\n  const decoder = new TextDecoder()\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read()\n\n      if (done) break\n\n      const data = decoder.decode(value)\n\n      yield parseStringifiedValue(data)\n    }\n  } finally {\n    reader.releaseLock()\n  }\n}\n\nfunction buildQueryString(query?: any) {\n  let q = ''\n\n  if (!query) {\n    return q\n  }\n\n  for (const [key, value] of Object.entries(query)) {\n    if (Array.isArray(value)) {\n      for (const v of value) {\n        q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(v)}`\n      }\n    } else if (typeof value === 'object') {\n      const stringifiedValue = JSON.stringify(value)\n      q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(stringifiedValue)}`\n    } else if (value != null) {\n      q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(`${value}`)}`\n    }\n  }\n\n  return q\n}\n\nexport async function parseResponse<T extends AnyElysia = AnyElysia, TRaw extends boolean = false>(\n  response: Response,\n  params?: EdenRequestParams<T, TRaw>,\n) {\n  if (params?.onResponse != null) {\n    const onResponse = Array.isArray(params.onResponse) ? params.onResponse : [params.onResponse]\n\n    for (const value of onResponse) {\n      try {\n        const data = await value(response.clone())\n        if (data != null) {\n          return { data, error: null, status: response.status }\n        }\n      } catch (err) {\n        const error = err instanceof EdenFetchError ? err : new EdenFetchError(422, err)\n        return { data: null, error, status: response.status }\n      }\n    }\n  }\n\n  let data: any\n\n  switch (response.headers.get('Content-Type')?.split(';')[0]) {\n    case 'text/event-stream': {\n      data = streamResponse(response)\n      break\n    }\n\n    case 'application/json': {\n      data = await response.json()\n\n      const transformer = getDataTransformer(params?.transformer)\n\n      const deserialize = transformer?.output.deserialize\n\n      if (deserialize != null) {\n        data = deserialize(data)\n      }\n\n      break\n    }\n\n    case 'application/octet-stream': {\n      data = await response.arrayBuffer()\n      break\n    }\n\n    case 'multipart/form-data': {\n      const temp = await response.formData()\n\n      data = {}\n\n      temp.forEach((value, key) => {\n        data[key] = value\n      })\n\n      break\n    }\n\n    default: {\n      data = await response.text().then(parseStringifiedValue)\n    }\n  }\n\n  if (response.status >= 300 || response.status < 200) {\n    const error = new EdenFetchError(response.status, data)\n    return {\n      data: null,\n      error,\n      status: response.status,\n      statusText: response.statusText,\n    }\n  } else {\n    return {\n      data,\n      error: null,\n      status: response.status,\n      statusText: response.statusText,\n    }\n  }\n}\n\n/**\n * Parameters that control how an Eden request is resolved.\n */\nexport type EdenRequestParams<\n  T extends AnyElysia = AnyElysia,\n  TRaw extends boolean = false,\n> = EdenRequestOptions<T, TRaw> & {\n  /**\n   */\n  domain?: T | string\n\n  /**\n   * Fetch options for a \"query\" method, i.e. \"GET\", \"HEAD\", \"OPTIONS\".\n   */\n  options?: InferRouteOptions\n\n  /**\n   * The request body for \"POST\", \"PATCH\", etc. requests.\n   */\n  body?: InferRouteBody\n\n  /**\n   */\n  path?: string\n\n  /**\n   */\n  method?: string\n}\n\nexport async function resolveEdenRequest<\n  T extends AnyElysia = AnyElysia,\n  TRaw extends boolean = false,\n>(params: EdenRequestParams<T, TRaw>): Promise<EdenResponse<TRaw> | EdenWS> {\n  let path = params.path ?? ''\n\n  if (params.options?.params != null) {\n    Object.entries(params.options.params).forEach(([key, value]) => {\n      if (value != null) {\n        path = path.replace(`:${key}`, String(value))\n      }\n    })\n  }\n\n  const isGetOrHead = isGetOrHeadMethod(params.method)\n\n  const headers = await processHeaders(params.headers, path, params.options?.headers)\n\n  let q = buildQueryString(params.options?.query)\n\n  if (params.method === 'subscribe') {\n    const domain = typeof params.domain === 'string' ? params.domain : DEMO_DOMAIN\n\n    const protocol = domain.startsWith('https://')\n      ? 'wss://'\n      : domain.startsWith('http://')\n        ? 'ws://'\n        : LOOPBACK_ADDRESSES.find((address) => domain.includes(address))\n          ? 'ws://'\n          : 'wss://'\n\n    const origin = domain.replace(/^([^]+):\\/\\//, protocol)\n\n    const url = origin + path + q\n\n    return new EdenWS(url)\n  }\n\n  let fetchInit = {\n    method: params.method?.toUpperCase(),\n    body: params.body as any,\n    ...params.fetch,\n    headers,\n  } satisfies BunFetchRequestInit\n\n  fetchInit.headers = {\n    ...headers,\n    ...(await processHeaders(params.options?.headers, path, fetchInit)),\n  }\n\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  if (params.onRequest) {\n    const onRequest = Array.isArray(params.onRequest) ? params.onRequest : [params.onRequest]\n\n    for (const value of onRequest) {\n      const temp = await value(path, fetchInit)\n\n      if (typeof temp === 'object')\n        fetchInit = {\n          ...fetchInit,\n          ...temp,\n          headers: {\n            ...fetchInit.headers,\n            ...(await processHeaders(temp?.headers, path, fetchInit)),\n          },\n        }\n    }\n  }\n\n  // ? Duplicate because end-user might add a body in onRequest\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  // Don't handle raw FormData if given.\n  if (FormData != null && params.body instanceof FormData) {\n    // noop\n  } else if (hasFile(params.body as any)) {\n    const formData = new FormData()\n\n    // FormData is 1 level deep\n    for (const [key, field] of Object.entries(fetchInit.body)) {\n      if (IS_SERVER) {\n        formData.append(key, field as any)\n\n        continue\n      }\n\n      if (field instanceof File) {\n        formData.append(key, await createNewFile(field as any))\n\n        continue\n      }\n\n      if (field instanceof FileList) {\n        for (let i = 0; i < field.length; i++)\n          formData.append(key as any, await createNewFile((field as any)[i]))\n\n        continue\n      }\n\n      if (Array.isArray(field)) {\n        for (let i = 0; i < field.length; i++) {\n          const value = (field as any)[i]\n\n          formData.append(key as any, value instanceof File ? await createNewFile(value) : value)\n        }\n\n        continue\n      }\n\n      formData.append(key, field as string)\n    }\n\n    // We don't do this because we need to let the browser set the content type with the correct boundary\n    // fetchInit.headers['content-type'] = 'multipart/form-data'\n    fetchInit.body = formData\n  } else if (typeof params.body === 'object') {\n    fetchInit.headers['content-type'] = 'application/json'\n\n    const transformer = getDataTransformer(params.transformer)\n\n    const body = transformer ? transformer.input.serialize(params.body) : params.body\n\n    fetchInit.body = JSON.stringify(body)\n  } else if (params.body !== null) {\n    fetchInit.headers['content-type'] = 'text/plain'\n  }\n\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  if (params.onRequest) {\n    const onRequest = Array.isArray(params.onRequest) ? params.onRequest : [params.onRequest]\n\n    for (const value of onRequest) {\n      const temp = await value(path, fetchInit)\n\n      if (typeof temp === 'object')\n        fetchInit = {\n          ...fetchInit,\n          ...temp,\n          headers: {\n            ...fetchInit.headers,\n            ...(await processHeaders(temp?.headers, path, fetchInit)),\n          } as Record<string, string>,\n        }\n    }\n  }\n\n  const domain = typeof params.domain === 'string' ? params.domain : ''\n\n  const url = domain + path + q\n\n  const elysia = typeof params.domain === 'string' ? undefined : params.domain\n\n  const fetcher = params.fetcher ?? globalThis.fetch\n\n  const response = await (elysia?.handle(new Request(url, fetchInit)) ?? fetcher(url, fetchInit))\n\n  const edenResponse = await parseResponse(response, params)\n\n  if (edenResponse.data !== null) {\n    return {\n      ...edenResponse,\n      ...(params.raw && { response, headers: response.headers, statusText: response.statusText }),\n    } as EdenResponse\n  }\n\n  if (response.status >= 300 || response.status < 200) {\n    edenResponse.error = new EdenFetchError(response.status, edenResponse.data)\n    edenResponse.data = null\n  }\n\n  return {\n    ...edenResponse,\n    ...(params.raw && { response, headers: response.headers, statusText: response.statusText }),\n  } as EdenResponse\n}\n","export type Nullish = null | undefined | void\n\nexport function notNull<T>(value: T): value is NonNullable<T> {\n  return value != null\n}\n","import type { EdenConfig as EdenRequestOptions } from '../../config'\nimport type { HTTPLinkBaseOptions } from '../../http'\nimport type { EdenResponse } from '../../request'\nimport { type EdenRequestParams, resolveEdenRequest } from '../../resolve'\nimport type { Noop } from '../../utils/noop'\nimport type { Operation } from './operation'\n\nexport type Requester = (options: RequesterOptions) => PromiseAndCancel<EdenResponse>\n\nexport type RequesterOptions = Operation & HTTPLinkBaseOptions & EdenRequestOptions\n\nexport type PromiseAndCancel<T> = {\n  promise: Promise<T>\n  cancel: Noop\n}\n\n/**\n * Default eden HTTP requester normalizes operation options to params.\n */\nexport const universalRequester: Requester = (options) => {\n  const {\n    id: _id,\n    type: _type,\n    AbortController,\n    methodOverride,\n    params,\n    ...defaultParams\n  } = options\n\n  const abortController = AbortController ? new AbortController() : null\n\n  let done = false\n\n  const cancel = () => {\n    if (!done) {\n      abortController?.abort()\n    }\n  }\n\n  /**\n   * @TODO\n   *\n   * Deep merge fetch, headers, onRequest, onResponse ?\n   */\n  const resolvedParams: EdenRequestParams = { ...defaultParams, ...params }\n\n  if (options.params.fetch?.signal) {\n    options.params.fetch.signal.addEventListener('abort', cancel)\n    resolvedParams.fetch = { ...resolvedParams.fetch, signal: abortController?.signal }\n  }\n\n  if (methodOverride != null) {\n    resolvedParams.method = methodOverride\n  }\n\n  const promise = new Promise<EdenResponse>((resolve, reject) => {\n    resolveEdenRequest(resolvedParams)\n      .then((response) => {\n        done = true\n        resolve(response as EdenResponse)\n      })\n      .catch((err) => {\n        done = true\n        reject(err)\n      })\n  })\n\n  return { promise, cancel }\n}\n","import type { AnyElysia } from 'elysia'\n\nimport type { EdenQueryStoreKey } from '../constraints'\nimport { getAbortController, type HTTPHeaders, type HTTPLinkBaseOptions } from '../http'\nimport type { EdenRequestOptions } from '../request'\nimport type { NonEmptyArray } from '../utils/types'\nimport { Observable, type Observer } from './internal/observable'\nimport type { EdenLink, Operation, OperationLink } from './internal/operation'\nimport type { DataTransformerOptions } from './internal/transformer'\nimport { type Requester, universalRequester } from './internal/universal-requester'\n\nexport type HTTPLinkFactoryOptions = {\n  requester: Requester\n}\n\nexport type HTTPLinkOptions<\n  T extends AnyElysia = AnyElysia,\n  /**\n   * @todo Maybe check if T['store'][EdenQueryStoreKey] matches a certain interface?\n   */\n  TTransformer = T['store'][typeof EdenQueryStoreKey]['transformer'],\n> = HTTPLinkBaseOptions &\n  Omit<EdenRequestOptions<T>, 'headers' | 'transformer'> & {\n    /**\n     * @todo: Merge this headers type into {@link EdenRequestOptions}\n     */\n    headers?:\n      | HTTPHeaders\n      | ((operations: NonEmptyArray<Operation>) => HTTPHeaders | Promise<HTTPHeaders>)\n  } & (TTransformer extends DataTransformerOptions\n    ? { transformer: TTransformer }\n    : {\n        transformer?: DataTransformerOptions\n      })\n\nexport type HTTPLinkFactory = <T extends AnyElysia>(options?: HTTPLinkOptions<T>) => EdenLink<T>\n\nexport function httpLinkFactory(factoryOptions: HTTPLinkFactoryOptions): HTTPLinkFactory {\n  const factory: HTTPLinkFactory = (linkOptions = {} as any) => {\n    const link: EdenLink = (_runtime) => {\n      const resolveOperation = (operation: Operation, observer: Observer<any, any>) => {\n        const { fetch, domain, AbortController, methodOverride, ...defaultParams } = linkOptions\n\n        const { id, context, type, params } = operation\n\n        const options = {\n          fetch,\n          AbortController: getAbortController(AbortController),\n          methodOverride,\n          id,\n          context,\n          type,\n          params: { ...defaultParams, domain, ...params },\n        }\n\n        const { promise, cancel } = factoryOptions.requester(options)\n\n        promise\n          .then((result) => {\n            observer.next(result)\n            observer.complete()\n          })\n          .catch((cause) => {\n            observer.error(cause)\n          })\n\n        return cancel\n      }\n\n      const operationLink: OperationLink = ({ operation }) => {\n        const observable = new Observable(resolveOperation.bind(undefined, operation))\n        return observable\n      }\n\n      return operationLink\n    }\n\n    return link\n  }\n\n  return factory\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport const safeHttpLink = httpLinkFactory({ requester: universalRequester })\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport function httpLink<T extends AnyElysia>(options?: HTTPLinkOptions<T, true>): EdenLink<T> {\n  return safeHttpLink(options as any)\n}\n","import { EdenFatalError } from '../../errors'\nimport type { Noop } from '../../utils/noop'\n\nexport type Batch<TKey, TValue> = {\n  items: BatchItem<TKey, TValue>[]\n  cancel: Noop\n}\n\nexport type BatchItem<TKey, TValue> = {\n  aborted: boolean\n  key: TKey\n  resolve: ((value: TValue) => void) | null\n  reject: ((error: Error) => void) | null\n  batch: Batch<TKey, TValue> | null\n}\n\nexport type BatchLoader<TKey = any, TValue = any> = {\n  /**\n   * Determines whether the current operation fits in the same batch.\n   */\n  validate: (keys: TKey[]) => boolean\n\n  /**\n   * Queues a request.\n   */\n  fetch: BatchFetcher<TKey, TValue>\n}\n\nexport type BatchFetcher<TKey, TValue> = (\n  keys: TKey[],\n  unitResolver: (index: number, value: NonNullable<TValue>) => void,\n) => {\n  promise: Promise<TValue[]>\n  cancel: Noop\n}\n\nexport class BatchError extends Error {\n  constructor(message?: string) {\n    super(message)\n  }\n}\n\n/**\n * {@see https://github.com/graphql/dataloader}\n *\n * Less configuration, no caching, and allows you to cancel requests.\n * When cancelling a single fetch the whole batch will be cancelled only when _all_ items are cancelled.\n */\nexport function batchedDataLoader<TKey, TValue>(loader: BatchLoader<TKey, TValue>) {\n  let pendingItems: BatchItem<TKey, TValue>[] = []\n  let dispatchTimer: ReturnType<typeof setTimeout> | null = null\n\n  const destroyTimerAndPendingItems = () => {\n    clearTimeout(dispatchTimer as any)\n    dispatchTimer = null\n    pendingItems = []\n  }\n\n  /**\n   * Iterate through the items and split them into groups based on the `batchLoader`'s validate function\n   */\n  const groupItems = (items: BatchItem<TKey, TValue>[]) => {\n    const groupedItems: BatchItem<TKey, TValue>[][] = [[]]\n\n    let i = 0\n    let item: BatchItem<TKey, TValue> | undefined\n    let lastGroup: BatchItem<TKey, TValue>[] | undefined\n\n    for (; i < items.length && (lastGroup = groupedItems.at(-1)) && (item = items[i]); ++i) {\n      // Item was aborted before it was dispatched.\n      if (item.aborted) {\n        item.reject?.(new BatchError('Aborted'))\n        continue\n      }\n\n      // Create a new group to test whether the resulting group would be valid;\n      // do not mutate the original group reference if it is not.\n      const lastGroupWithNewItem = [...lastGroup, item]\n\n      const keys = lastGroupWithNewItem.map((item) => item.key)\n\n      const isValid = loader.validate(keys)\n\n      // Add consecutive, valid items that have not been aborted to the end of the queue.\n      if (isValid) {\n        lastGroup.push(item)\n        continue\n      }\n\n      // Failed to add any items to an existing group.\n      if (lastGroup.length === 0) {\n        item.reject?.(new BatchError('Invalid item failed to be added to batch.'))\n        continue\n      }\n\n      const newGroup = [item]\n      const newKeys = [item.key]\n\n      const isNewGroupValid = loader.validate(newKeys)\n\n      if (isNewGroupValid) {\n        groupedItems.push(newGroup)\n      } else {\n        item.reject?.(new BatchError('Invalid item failed to be added to batch.'))\n        groupedItems.push([])\n      }\n    }\n\n    return groupedItems\n  }\n\n  const dispatch = () => {\n    const groupedItems = groupItems(pendingItems)\n\n    destroyTimerAndPendingItems()\n\n    // Create batches for each group of items\n    for (const items of groupedItems) {\n      if (items.length === 0) continue\n\n      const batch: Batch<TKey, TValue> = { items, cancel: EdenFatalError.throw }\n\n      for (const item of items) {\n        item.batch = batch\n      }\n\n      const unitResolver = (index: number, value: NonNullable<TValue>) => {\n        const item = batch.items[index]\n\n        if (item == null) return\n\n        item.resolve?.(value)\n        item.batch = null\n        item.reject = null\n        item.resolve = null\n      }\n\n      const { promise, cancel } = loader.fetch(\n        batch.items.map((item) => item.key),\n        unitResolver,\n      )\n\n      batch.cancel = cancel\n\n      promise\n        .then((result) => {\n          for (let i = 0; i < result.length; i++) {\n            const value = result[i]\n            if (value != null) {\n              unitResolver(i, value)\n            }\n          }\n\n          for (const item of batch.items) {\n            item.reject?.(new Error('Missing result'))\n            item.batch = null\n          }\n        })\n        .catch((cause) => {\n          for (const item of batch.items) {\n            item.reject?.(cause)\n            item.batch = null\n          }\n        })\n    }\n  }\n\n  const load = (key: TKey) => {\n    const item: BatchItem<TKey, TValue> = {\n      aborted: false,\n      key,\n      batch: null,\n      resolve: EdenFatalError.throw,\n      reject: EdenFatalError.throw,\n    }\n\n    const promise = new Promise<TValue>((resolve, reject) => {\n      item.reject = reject\n      item.resolve = resolve\n      pendingItems.push(item)\n    })\n\n    dispatchTimer ??= setTimeout(dispatch)\n\n    const cancel = () => {\n      item.aborted = true\n\n      // All items in the batch have been cancelled\n      if (item.batch?.items.every((item) => item.aborted)) {\n        item.batch.cancel()\n        item.batch = null\n      }\n    }\n\n    return { promise, cancel }\n  }\n\n  return { load }\n}\n","import type { AnyElysia } from 'elysia'\n\nimport { BATCH_ENDPOINT } from '../constants'\nimport type { EdenQueryStoreKey } from '../constraints'\nimport type { TypeError } from '../errors'\nimport type { HTTPHeaders } from '../http'\nimport type { BatchPluginOptions } from '../plugins'\nimport { type EdenRequestOptions, type EdenResponse } from '../request'\nimport { type EdenRequestParams, resolveEdenRequest } from '../resolve'\nimport { notNull } from '../utils/null'\nimport type { NonEmptyArray } from '../utils/types'\nimport { httpLinkFactory } from './http-link'\nimport { batchedDataLoader, type BatchLoader } from './internal/batched-data-loader'\nimport type { EdenLink, Operation, OperationType } from './internal/operation'\nimport { type DataTransformerOptions, getDataTransformer } from './internal/transformer'\nimport {\n  type Requester,\n  type RequesterOptions,\n  universalRequester,\n} from './internal/universal-requester'\n\n/**\n * @remarks Do not derive this from HTTPLinkOptions, because it breaks the types for some reason...\n *\n * @template TTransformer\n * @todo Maybe check if T['store'][EdenQueryStoreKey] matches a certain interface?\n */\nexport type HttpBatchLinkOptions<\n  T extends AnyElysia = AnyElysia,\n  TTransformer = T['store'][typeof EdenQueryStoreKey]['transformer'],\n> = Omit<EdenRequestOptions, 'headers' | 'method' | 'transformer'> & {\n  /**\n   * Path for the batch endpoint.\n   *\n   * @example /batch\n   */\n  endpoint?: string\n\n  /**\n   * Configure the maximum URL length if making batch requests with GET.\n   */\n  maxURLLength?: number\n\n  /**\n   * @todo: Merge this headers type into {@link EdenRequestOptions}\n   */\n  headers?:\n    | HTTPHeaders\n    | ((operations: NonEmptyArray<Operation>) => HTTPHeaders | Promise<HTTPHeaders>)\n\n  method?: BatchMethod\n} & (TTransformer extends false\n    ? {\n        transformer?: DataTransformerOptions\n      }\n    : TTransformer extends DataTransformerOptions\n      ? { transformer: TTransformer }\n      : {\n          transformer?: DataTransformerOptions\n        })\n\nexport type BatchMethod = 'GET' | 'POST'\n\n/**\n * If using GET request to batch, the request data will be encoded in query parameters.\n * This is only possible if all requests are GET requests.\n *\n * The query will look like this\n *\n * // GET request to /api/b?name=elysia, i.e. query of name=elysia\n *\n * batch=1&0.path=/api/b&0.method=GET&0.query.name=elysia\n */\nexport function generateGetBatchRequestInformation(operations: Operation[]) {\n  const query: Record<string, any> = {}\n\n  const headers = new Headers()\n\n  operations.forEach((operation, index) => {\n    let operationPath = operation.params.path ?? ''\n\n    // Handle path params.\n    for (const key in operation.params.options?.params) {\n      const placeholder = `:${key}`\n      const param = operation.params.options.params[key as never]\n      if (param != null) {\n        operationPath = operationPath.replace(placeholder, param)\n      }\n    }\n\n    query[`${index}.path`] = operationPath\n\n    if (operation.params.method != null) {\n      query[`${index}.method`] = operation.params.method\n    }\n\n    for (const key in operation.params.options?.query) {\n      const value = operation.params.options.query[key as never]\n      if (value != null) {\n        query[`${index}.query.${key}`] = value\n      }\n    }\n\n    // Handle headers.\n\n    /**\n     * These headers may be set at the root of the client as defaults.\n     */\n    const defaultHeaders =\n      typeof operation.params.headers === 'function'\n        ? operation.params.headers(operationPath, operation.params.fetch)\n        : operation.params.headers\n\n    /**\n     * These headers are set on this specific request.\n     */\n    const requestHeaders = operation.params.options?.headers\n\n    const resolvedHeaders = { ...defaultHeaders, ...requestHeaders }\n\n    for (const key in resolvedHeaders) {\n      const header = resolvedHeaders[key as never]\n      if (header != null) {\n        headers.append(key, header)\n      }\n    }\n  })\n\n  return { body: null, query, headers }\n}\n\n/**\n * If using POST request to batch, most of the request data will be encoded in the FormData body.\n *\n * It will look like this:\n *\n * {\n *   // POST request to /api/a with a JSON body of { value: 0 }\n *\n *   '0.path': '/api/a',\n *   '0.method': 'POST',\n *   '0.body_type': 'JSON',\n *   '0.body': '{ value: 0 }'\n *\n *   // GET request to /api/b?name=elysia, i.e. query of name=elysia\n *\n *   '1.path': '/api/b',\n *   '1.method': 'GET',\n *   '1.query.name': 'elysia'\n * }\n */\nexport function generatePostBatchRequestInformation(\n  operations: Operation[],\n  options?: HttpBatchLinkOptions,\n) {\n  const body = new FormData()\n\n  const headers = new Headers()\n\n  operations.forEach((operation, index) => {\n    let operationPath = operation.params.path ?? ''\n\n    // Specify method of the request.\n    if (operation.params.method != null) {\n      body.append(`${index}.method`, operation.params.method)\n    }\n\n    // Handle path parameters.\n    for (const key in operation.params.options?.params) {\n      const placeholder = `:${key}`\n      const param = operation.params.options.params[key as never]\n      if (param != null) {\n        operationPath = operationPath.replace(placeholder, param)\n      }\n    }\n\n    // Specify the path of the request.\n    body.append(`${index}.path`, operationPath)\n\n    // Handle query parameters.\n    for (const key in operation.params.options?.query) {\n      const value = operation.params.options.query[key as never]\n\n      if (value != null) {\n        body.append(`${index}.query.${key}`, value)\n      }\n    }\n\n    // Handle headers.\n\n    /**\n     * These headers may be set at the root of the client as defaults.\n     */\n    const defaultHeaders =\n      typeof operation.params.headers === 'function'\n        ? operation.params.headers(operationPath, operation.params.fetch)\n        : operation.params.headers\n\n    /**\n     * These headers are set on this specific request.\n     */\n    const requestHeaders = operation.params.options?.headers\n\n    const resolvedHeaders = { ...defaultHeaders, ...requestHeaders }\n\n    for (const key in resolvedHeaders) {\n      const header = resolvedHeaders[key as never]\n      if (header != null) {\n        headers.append(key, header)\n      }\n    }\n\n    // Handle body.\n\n    if (operation.params?.body == null) return\n\n    const rawTransformer = options?.transformer ?? operation.params.transformer\n\n    const transformer = getDataTransformer(rawTransformer)\n\n    if (operation.params.body instanceof FormData) {\n      body.append(`${index}.body_type`, 'formdata')\n\n      operation.params.body.forEach((value, key) => {\n        const serialized = transformer.input.serialize(value)\n\n        // FormData is special and can handle additional data types, like Files.\n        // So we will not JSON.stringify the serialized result.\n        body.set(`${index}.body.${key}`, serialized)\n      })\n    } else {\n      body.append(`${index}.body_type`, 'json')\n\n      const serialized = transformer.input.serialize(operation.params.body)\n      const stringified = JSON.stringify(serialized)\n\n      body.set(`${index}.body`, stringified)\n    }\n  })\n\n  return { body, query: {}, headers }\n}\n\nconst generateBatchRequestInformation = {\n  GET: generateGetBatchRequestInformation,\n  POST: generatePostBatchRequestInformation,\n}\n\nfunction createBatchRequester(options: HttpBatchLinkOptions = {}): Requester {\n  const resolvedFactoryOptions = { maxURLLength: Infinity, ...options }\n\n  const { endpoint, maxURLLength, headers, transformer, method, domain, ...requestOptions } =\n    resolvedFactoryOptions\n\n  const createBatchLoader = (_type: OperationType): BatchLoader<Operation> => {\n    return {\n      validate: (batchOps) => {\n        // Escape hatch for quick calculations.\n        if (maxURLLength === Infinity) return true\n\n        const requestInformation = generateGetBatchRequestInformation(batchOps)\n\n        const searchParams = new URLSearchParams(requestInformation.query)\n\n        const path = endpoint ?? BATCH_ENDPOINT\n\n        const url = `${path}${searchParams.size ? '?' : ''}${searchParams}`\n\n        return url.length <= maxURLLength\n      },\n      fetch: (batchOps) => {\n        if (batchOps.length === 1) {\n          const [firstOperation] = batchOps\n\n          if (firstOperation != null) {\n            const requesterOptions: RequesterOptions = {\n              transformer,\n              ...requestOptions,\n              ...firstOperation,\n            }\n\n            // Forward domain.\n            if (domain != null) {\n              requesterOptions.params = { ...requesterOptions.params, domain }\n            }\n\n            const singleResult = universalRequester(requesterOptions)\n\n            // Batched-data-loader expects an array of results,\n            // which will each be resolved to the corresponding promise.\n            const promise = singleResult.promise.then((result) => [result])\n\n            return { promise, cancel: singleResult.cancel }\n          }\n        }\n\n        const signals = batchOps.map((b) => b.params.fetch?.signal).filter(notNull)\n\n        const abortController = signals.length ? new AbortController() : null\n\n        signals.forEach((signal) => {\n          signal.addEventListener('abort', () => {\n            abortController?.abort()\n          })\n        })\n\n        const cancel = () => {\n          abortController?.abort()\n        }\n\n        const defaultBatchMethod: BatchMethod = method ?? 'POST'\n\n        /**\n         * If any operations are a POST requests, can't batch with GET request...\n         */\n        const resolvedMethod: BatchMethod =\n          defaultBatchMethod === 'GET'\n            ? batchOps.find((op) => op.params.method === 'POST')\n              ? 'POST'\n              : 'GET'\n            : 'POST'\n\n        const batchInformationGenerator = generateBatchRequestInformation[resolvedMethod]\n\n        const information = batchInformationGenerator(batchOps, resolvedFactoryOptions)\n\n        const path = endpoint ?? BATCH_ENDPOINT\n\n        const defaultHeaders =\n          headers == null\n            ? undefined\n            : typeof headers === 'function'\n              ? headers(batchOps as NonEmptyArray<Operation>)\n              : headers\n\n        // Force to await headers.\n        const awaitDefaultHeaders = async () => await defaultHeaders\n\n        const promise = awaitDefaultHeaders().then(async (defaultHeaders) => {\n          const { body, query } = information\n\n          for (const key in defaultHeaders) {\n            const header = defaultHeaders[key as never]\n            if (header != null) {\n              information.headers.append(key, header)\n            }\n          }\n\n          const resolvedParams: EdenRequestParams<any, true> = {\n            domain,\n            transformer,\n            path,\n            method: resolvedMethod,\n            options: { query },\n            body,\n            headers: information.headers,\n            ...requestOptions,\n            raw: true,\n          }\n\n          if (signals.length) {\n            resolvedParams.fetch ??= {}\n            resolvedParams.fetch.signal = abortController?.signal\n          }\n\n          const result = await resolveEdenRequest(resolvedParams)\n\n          /**\n           * result.data should be an array of JSON data from each request in the batch.\n           */\n          if (!('data' in result) || !Array.isArray(result.data)) {\n            return []\n          }\n\n          const batchedData: EdenResponse<true>[] = result.data\n\n          const resolvedTransformer = getDataTransformer(transformer)\n\n          /**\n           * The batch plugin also encodes its data into a JSON.\n           *\n           * @example\n           * If the data from a batched request is [3, 'OK', false],\n           * the batch plugin should return a JSON like\n           * [\n           *   { data: 3, error: null, status: 200, statusText: 'OK' },\n           *   { data: 'OK', error: null, status: 200, statusText: 'OK' }\n           *   { data: false, error: null, status: 200, statusText: 'OK' }\n           * ]\n           */\n          const transformedResponses = batchedData.map((batchedResult, index) => {\n            // The raw data from each request has not be de-serialized yet.\n            // De-serialize it so every entry is the finalized result.\n            if (resolvedTransformer != null && batchedResult.data != null) {\n              batchedResult.data = resolvedTransformer.output.deserialize(batchedResult.data)\n            }\n\n            const operation = batchOps[index]\n\n            // If this specific operation wanted the raw information, append the required properties.\n            if (operation?.params.raw) {\n              // Recreate custom headers object.\n              const headers = new Headers()\n\n              /**\n               * If the header value has a numeric prefix, only assign it if it matches the operation index,\n               * otherwise, assign it.\n               *\n               * The batch plugin will add a numeric prefix to organize the headers.\n               *\n               * @example\n               * '0.set-cookie': 'abc' should be a header only for request 0.\n               * 'set-cookie': should be a header for all the batched requests.\n               */\n              result.headers.forEach((value, key) => {\n                const [prefix, name] = key.split('.')\n\n                if (Number(prefix) === index && name != null) {\n                  headers.set(name, value)\n                } else {\n                  headers.set(key, value)\n                }\n              })\n\n              /**\n               * TODO: how to guarantee that this value is the correct body?\n               */\n              const body =\n                resolvedTransformer != null\n                  ? resolvedTransformer.output.serialize(batchedResult.data)\n                  : JSON.stringify(batchedResult.data)\n\n              /**\n               * Create a new response using the re-serialized body.\n               */\n              const response = new Response(body, {\n                status: batchedResult.status,\n                statusText: batchedResult.statusText,\n                headers,\n              })\n\n              batchedResult.headers = headers\n              batchedResult.response = response\n            }\n\n            return batchedResult\n          })\n\n          return transformedResponses\n        })\n\n        return { promise, cancel }\n      },\n    }\n  }\n\n  const queryBatchLoader = createBatchLoader('query')\n  const mutationBatchLoader = createBatchLoader('mutation')\n  const subscriptionBatchLoader = createBatchLoader('subscription')\n\n  const query = batchedDataLoader(queryBatchLoader)\n  const mutation = batchedDataLoader(mutationBatchLoader)\n  const subscription = batchedDataLoader(subscriptionBatchLoader)\n\n  const loaders = { query, subscription, mutation }\n\n  return (options) => loaders[options.type].load(options)\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport const safeHttpBatchLink = <T extends AnyElysia>(\n  options?: HttpBatchLinkOptions<T>,\n): T['store'][typeof EdenQueryStoreKey]['batch'] extends true | BatchPluginOptions\n  ? EdenLink<T>\n  : TypeError<'Batch plugin not detected on Elysia.js app instance'> => {\n  const batchRequester = createBatchRequester(options)\n  return httpLinkFactory({ requester: batchRequester })() as any\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport function httpBatchLink<T extends AnyElysia>(\n  options?: HttpBatchLinkOptions<T, false>,\n): EdenLink<T> {\n  return safeHttpBatchLink(options as any) as any\n}\n","import type { AnyElysia } from 'elysia'\n\nimport { constNoop } from '../utils/noop'\nimport { Observable } from './internal/observable'\nimport type { EdenLink, Operation, OperationResultEnvelope } from './internal/operation'\nimport { tap } from './internal/operators'\n\ntype ConsoleEsque = {\n  log: (...args: any[]) => void\n  error: (...args: any[]) => void\n}\n\ntype EnableFnOptions =\n  | {\n      direction: 'down'\n      result: OperationResultEnvelope<unknown>\n    }\n  | (Operation & {\n      direction: 'up'\n    })\n\ntype EnabledFn = (opts: EnableFnOptions) => boolean\n\ntype LoggerLinkFnOptions = Operation &\n  (\n    | {\n        /**\n         * Request result\n         */\n        direction: 'down'\n        result: OperationResultEnvelope<unknown>\n        elapsedMs: number\n      }\n    | {\n        /**\n         * Request was just initialized\n         */\n        direction: 'up'\n      }\n  )\n\ntype LoggerLinkFn = (opts: LoggerLinkFnOptions) => void\n\ntype ColorMode = 'ansi' | 'css' | 'none'\n\nexport interface LoggerLinkOptions {\n  logger?: LoggerLinkFn\n\n  enabled?: EnabledFn\n\n  /**\n   * Used in the built-in defaultLogger\n   */\n  console?: ConsoleEsque\n\n  /**\n   * Color mode\n   * @default typeof window === 'undefined' ? 'ansi' : 'css'\n   */\n  colorMode?: ColorMode\n\n  /**\n   * Include context in the log - defaults to false unless `colorMode` is 'css'\n   */\n  withContext?: boolean\n}\n\nconst palettes = {\n  css: {\n    query: ['72e3ff', '3fb0d8'],\n    mutation: ['c5a3fc', '904dfc'],\n    subscription: ['ff49e1', 'd83fbe'],\n  },\n  ansi: {\n    regular: {\n      // Cyan background, black and white text respectively\n      query: ['\\x1b[30;46m', '\\x1b[97;46m'],\n\n      // Magenta background, black and white text respectively\n      mutation: ['\\x1b[30;45m', '\\x1b[97;45m'],\n\n      // Green background, black and white text respectively\n      subscription: ['\\x1b[30;42m', '\\x1b[97;42m'],\n    },\n    bold: {\n      query: ['\\x1b[1;30;46m', '\\x1b[1;97;46m'],\n      mutation: ['\\x1b[1;30;45m', '\\x1b[1;97;45m'],\n      subscription: ['\\x1b[1;30;42m', '\\x1b[1;97;42m'],\n    },\n  },\n} as const\n\nexport type ExtendedLoggerFnOptions = LoggerLinkFnOptions & {\n  colorMode: ColorMode\n  withContext?: boolean\n}\n\nfunction constructPartsAndArgs(opts: ExtendedLoggerFnOptions) {\n  const { direction, type, withContext, id, params } = opts\n\n  const parts: string[] = []\n  const args: any[] = []\n\n  const path = params.path ?? ''\n\n  if (opts.colorMode === 'none') {\n    parts.push(direction === 'up' ? '>>' : '<<', type, `#${id}`, path)\n  } else if (opts.colorMode === 'ansi') {\n    const [lightRegular, darkRegular] = palettes.ansi.regular[type]\n    const [lightBold, darkBold] = palettes.ansi.bold[type]\n    const reset = '\\x1b[0m'\n\n    parts.push(\n      direction === 'up' ? lightRegular : darkRegular,\n      direction === 'up' ? '>>' : '<<',\n      type,\n      direction === 'up' ? lightBold : darkBold,\n      `#${id}`,\n      path,\n      reset,\n    )\n  } else {\n    // css color mode\n    const [light, dark] = palettes.css[type]\n    const css = `\n    background-color: #${direction === 'up' ? light : dark};\n    color: ${direction === 'up' ? 'black' : 'white'};\n    padding: 2px;\n  `\n\n    parts.push('%c', direction === 'up' ? '>>' : '<<', type, `#${id}`, `%c${path}%c`, '%O')\n    args.push(css, `${css}; font-weight: bold;`, `${css}; font-weight: normal;`)\n  }\n\n  if (direction === 'up') {\n    args.push(withContext ? { params, context: opts.context } : { params })\n  } else {\n    args.push({\n      params,\n      result: opts.result,\n      elapsedMs: opts.elapsedMs,\n      ...(withContext && { context: opts.context }),\n    })\n  }\n\n  return { parts, args }\n}\n\nexport type LoggerOptions = {\n  c?: ConsoleEsque\n  colorMode?: ColorMode\n  withContext?: boolean\n}\n\n/**\n * Maybe this should be moved to it's own package?\n */\nfunction defaultLogger(options: LoggerOptions): LoggerLinkFn {\n  const { c = console, colorMode = 'css', withContext } = options\n\n  return (props) => {\n    const params = props.params\n\n    const { parts, args } = constructPartsAndArgs({ ...props, colorMode, params, withContext })\n\n    const fn: 'error' | 'log' =\n      props.direction === 'down' &&\n      props.result &&\n      (props.result instanceof Error || 'error' in props.result)\n        ? 'error'\n        : 'log'\n\n    c[fn].apply(null, [parts.join(' ')].concat(args))\n  }\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/loggerLink\n */\nexport function loggerLink<T extends AnyElysia>(options?: LoggerLinkOptions): EdenLink<T> {\n  const enabled = options?.enabled ?? constNoop(true)\n\n  const colorMode = options?.colorMode ?? (typeof window === 'undefined' ? 'ansi' : 'css')\n\n  const withContext = options?.withContext ?? colorMode === 'css'\n\n  const logger = options?.logger ?? defaultLogger({ c: options?.console, colorMode, withContext })\n\n  return (_runtime) => {\n    return ({ operation, next }) => {\n      return new Observable((observer) => {\n        if (enabled({ ...operation, direction: 'up' })) {\n          logger({ ...operation, direction: 'up' })\n        }\n\n        const requestStartTime = Date.now()\n\n        function logResult(result: OperationResultEnvelope<unknown>) {\n          const elapsedMs = Date.now() - requestStartTime\n\n          if (enabled({ ...operation, direction: 'down', result })) {\n            logger({ ...operation, direction: 'down', elapsedMs, result })\n          }\n        }\n\n        return next(operation)\n          .pipe(\n            tap({\n              next: (result) => {\n                logResult(result)\n              },\n              error: (result) => {\n                logResult(result)\n              },\n            }),\n          )\n          .subscribe(observer)\n      })\n    }\n  }\n}\n","import type { AnyElysia, MaybeArray } from 'elysia'\n\nimport { createChain } from './internal/create-chain'\nimport { Observable } from './internal/observable'\nimport type { EdenLink, Operation } from './internal/operation'\n\nfunction asArray<TType>(value: TType | TType[]) {\n  return Array.isArray(value) ? value : [value]\n}\n\nexport type SplitLinkOptions<T extends AnyElysia> = {\n  /**\n   */\n  condition: (operation: Operation) => boolean\n\n  /**\n   * The link(s) to execute next if {@link SplitLinkOptions.condition} function returns `true`.\n   */\n  true: MaybeArray<EdenLink<T>>\n\n  /**\n   * The link(s) to execute next if {@link SplitLinkOptions.condition} function returns `false`.\n   */\n  false: MaybeArray<EdenLink<T>>\n}\n\nexport function splitLink<T extends AnyElysia = AnyElysia>(\n  options: SplitLinkOptions<T>,\n): EdenLink<T> {\n  return (runtime) => {\n    const linksIfTrue = asArray(options.true).map((link) => link(runtime))\n    const linksIfFalse = asArray(options.false).map((link) => link(runtime))\n\n    const linksByCondition = { true: linksIfTrue, false: linksIfFalse }\n\n    return ({ operation }) => {\n      return new Observable((observer) => {\n        const condition = options.condition(operation)\n\n        const links = linksByCondition[`${condition}`]\n\n        return createChain({ operation, links }).subscribe(observer)\n      })\n    }\n  }\n}\n","/**\n * Eden WS implementation.\n *\n * @see https://github.com/elysiajs/eden/blob/7b982cf6469d809cd561dd0ad59e83178ad56489/src/treaty2/ws.ts#L5\n */\nimport type { InputSchema, MaybeArray } from 'elysia'\n\nimport {\n  type CombinedDataTransformer,\n  type DataTransformerOptions,\n  getDataTransformer,\n} from './links'\nimport { parseMessageEvent } from './utils/parse'\n\n/**\n * Configuration for EdenWS.\n */\nexport type EdenWsOptions = {\n  /**\n   * Custom transformer for messages.\n   */\n  transformer?: DataTransformerOptions\n}\n\n/**\n * Strongly-typed websocket event.\n *\n * Messages will be formatted, all other events will not be transformed.\n */\nexport type WSEvent<K extends keyof WebSocketEventMap, Data = unknown> = K extends 'message'\n  ? OnMessage<Data>\n  : WebSocketEventMap[K]\n\n/**\n * Attempt to parse the message, in addition to providing the original raw value (string).\n */\nexport interface OnMessage<Data = unknown> extends MessageEvent {\n  data: Data\n  rawData: MessageEvent['data']\n}\n\n/**\n * Custom implementation of the EdenWS class.\n *\n * Some properties are auto-bound methods so you can pass them as callbacks without \"this is undefined\" errors.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#cannot_be_used_as_methods\n *\n * @example\n * ```ts\n * import { EdenWs } from '@aydee-app/eden'\n *\n * const edenWs = new EdenWS()\n *\n * ['a', 'b', 'c'].forEach(edenWs.send)\n * ```\n */\nexport class EdenWS<T extends InputSchema<any> = {}> {\n  ws: WebSocket\n\n  transformer?: CombinedDataTransformer\n\n  constructor(\n    public url: string,\n    public options?: EdenWsOptions,\n  ) {\n    this.ws = new WebSocket(url)\n    this.transformer = options?.transformer ? getDataTransformer(options?.transformer) : undefined\n  }\n\n  /**\n   * Close the websocket connection.\n   */\n  close() {\n    this.ws.close()\n    return this\n  }\n\n  /**\n   * Send (strongly-typed) message(s) over the websocket connection.\n   */\n  send = async (data: MaybeArray<T['body']>) => {\n    if (Array.isArray(data)) {\n      await this.sendMany(data)\n    } else {\n      await this.sendSingle(data)\n    }\n    return this\n  }\n\n  /**\n   * Send a single (strongly-typed) message.\n   */\n  sendMany = async (data: T['body'][]) => {\n    await Promise.allSettled(data.map(this.sendSingle))\n    return this\n  }\n\n  /**\n   * Send a single (strongly-typed) message.\n   */\n  sendSingle = async (data: T['body']) => {\n    const message = await this.transformSent(data)\n    this.ws.send(message)\n    return this\n  }\n\n  /**\n   * Register a callback function that is called when a message is received.\n   */\n  subscribe(\n    onMessage: (event: WSEvent<'message', T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    return this.on('message', onMessage, options)\n  }\n\n  /**\n   * Register a strongly typed callback function to be called on the specified websocket event.\n   *\n   * Alias for {@link addEventListener}.\n   */\n  on<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (event: WSEvent<K, T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    return this.addEventListener(type, listener, options)\n  }\n\n  /**\n   * Remove a registered event-listener.\n   *\n   * Alias for {@link removeEventListener}.\n   */\n  off<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | EventListenerOptions,\n  ) {\n    this.removeEventListener(type, listener, options)\n    return this\n  }\n\n  /**\n   * Register a strongly typed callback function to be called on the specified websocket event.\n   */\n  addEventListener<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (event: WSEvent<K, T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    const resolvedEventListener = async (ws: WebSocketEventMap[K]) => {\n      let event: any = ws\n\n      if (type === 'message') {\n        const data = (await this.transformReceived(event)) ?? parseMessageEvent(event)\n        event = { ...ws, data }\n      }\n\n      listener(event)\n    }\n\n    this.ws.addEventListener(type, resolvedEventListener, options)\n    return this\n  }\n\n  /**\n   * Remove a registered event-listener.\n   */\n  removeEventListener<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | EventListenerOptions,\n  ) {\n    this.ws.removeEventListener(type, listener, options)\n    return this\n  }\n\n  /**\n   * Transform outgoing messages sent from the client to the server.\n   *\n   * @internal\n   */\n  transformSent = async (data: T['body']) => {\n    const serialize = this.transformer?.input.serialize\n\n    let transformed: any\n\n    try {\n      transformed = await serialize?.(data)\n    } catch (_err) {\n      // noop\n    }\n\n    if (transformed == null) {\n      transformed ??= typeof data === 'object' ? JSON.stringify(data) : data.toString()\n    }\n\n    return transformed\n  }\n\n  /**\n   * Transform incoming messages received from the server.\n   *\n   * @internal\n   */\n  transformReceived = async (event: MessageEvent) => {\n    const deserialize = this.transformer?.output.deserialize\n\n    if (deserialize == null) return\n\n    try {\n      let messageString = event.data\n\n      if (typeof messageString !== 'string') {\n        messageString = event.data.toString()\n      }\n\n      const transformed = await deserialize(messageString)\n      return transformed\n    } catch (_err) {\n      return\n    }\n  }\n}\n","import { Elysia } from 'elysia'\n\nimport { BATCH_ENDPOINT } from '../constants'\nimport type { EdenQueryStoreKey } from '../constraints'\nimport { parseResponse } from '../resolve'\nimport { createUrl } from '../utils/create-url'\nimport { set } from '../utils/set'\nimport type { GenericElysiaPlugin } from './types'\n\n/**\n * Individual request data that can be extracted from a {@link Request} that contains\n * information about multiple requests.\n */\nexport type BatchedRequestData = {\n  /**\n   * The path for this request.\n   */\n  path: string\n\n  /**\n   * The HTTP method for this request.\n   */\n  method?: string\n\n  /**\n   * The body of the request. It may either be JSON or FormData.\n   */\n  body?: any\n\n  /**\n   * The type of the body.\n   */\n  body_type?: 'formdata' | 'json'\n\n  /**\n   * All headers specifically for the request.\n   */\n  headers?: Headers\n\n  /**\n   * Any query parameters for the request.\n   */\n  query?: URLSearchParams\n}\n\nexport type BatchPluginOptions = {\n  endpoint?: string\n}\n\n/**\n * @param body The body from the elysia handler context. It should be null if the request contained formData.\n */\nasync function unBatchRequests(request: Request, body?: any): Promise<BatchedRequestData[]> {\n  const batchedRequests = body\n    ? unBatchRequestJsonData(body)\n    : await unBatchRequestFormData(request)\n\n  const batchedHeaders = unBatchHeaders(request)\n\n  const batchedQueries = unBatchQueries(request)\n\n  // Zip batched headers with batched requests.\n  for (const index in batchedHeaders.requests) {\n    const current = batchedRequests[index]\n    if (current != null) {\n      current.headers ??= batchedHeaders.requests[index]\n    }\n  }\n\n  // Set headers for all requests.\n  batchedHeaders.shared.forEach((value, key) => {\n    batchedRequests.forEach((batchedRequest) => {\n      if (!batchedRequest.headers?.get(key)) {\n        batchedRequest.headers ??= new Headers()\n        batchedRequest.headers.set(key, value)\n      }\n    })\n  })\n\n  // Zip batched queries with batched requests.\n  for (const index in batchedQueries) {\n    const current = batchedRequests[index]\n    if (current != null) {\n      current.query ??= batchedQueries[index]\n    }\n  }\n\n  // Convert body if necessary.\n  batchedRequests.forEach((request) => {\n    switch (request.body_type) {\n      case 'formdata': {\n        const body = new FormData()\n\n        if (typeof request.body === 'object') {\n          for (const [key, value] of Object.entries(request.body)) {\n            body.set(key, value as any)\n          }\n        }\n\n        request.body = body\n        break\n      }\n\n      case 'json': {\n        request.headers?.set('content-type', 'application/json')\n        break\n      }\n    }\n  })\n\n  return batchedRequests\n}\n\nasync function unBatchRequestFormData(request: Request): Promise<BatchedRequestData[]> {\n  const result: BatchedRequestData[] = []\n\n  const formData = await request.formData?.()\n\n  if (formData == null) {\n    return result\n  }\n\n  // Unbatch basic request information.\n  formData.forEach((value, key) => {\n    const [id, property] = key.split('.')\n\n    if (id == null || property == null) return\n\n    try {\n      const index = Number(id)\n      const definedResult: any = { ...result[index] }\n\n      set(definedResult, property, value)\n\n      if (property.startsWith('body')) {\n        const [_prefix, bodyKey] = property.split('.')\n\n        if (bodyKey != null) {\n          definedResult.rawBody ??= {}\n          definedResult.rawBody[bodyKey] = value\n        }\n      }\n\n      result[index] = definedResult\n    } catch (e) {\n      console.error(`Failed to add request with key: ${id} to batch: `, e)\n    }\n  })\n\n  return result\n}\n\nfunction unBatchRequestJsonData(body: Record<string, any>): BatchedRequestData[] {\n  const result: BatchedRequestData[] = []\n\n  // Unbatch basic request information.\n  for (const [key, value] of Object.entries(body)) {\n    const [id, property, maybeQueryKey] = key.split('.')\n\n    if (id == null || property == null) continue\n\n    try {\n      const index = Number(id)\n      const definedResult: any = { ...result[index] }\n\n      if (property === 'query') {\n        definedResult.query ??= new URLSearchParams()\n        definedResult.query.append(maybeQueryKey, value)\n      } else if (property.startsWith('body')) {\n        const [_prefix, bodyKey] = property.split('.')\n        if (bodyKey != null) {\n          definedResult.rawBody ??= {}\n          definedResult.rawBody[bodyKey] = value\n        }\n      } else {\n        set(definedResult, property, value)\n      }\n\n      result[index] = definedResult\n    } catch (e) {\n      console.error(`Failed to add request with key: ${id} to batch: `, e)\n    }\n  }\n\n  return result\n}\n\n/**\n * Temporary fix to ignore these headers from the batch request.\n */\nconst ignoreHeaders = ['content-type', 'content-length']\n\nfunction unBatchHeaders(request: Request): { requests: Headers[]; shared: Headers } {\n  const requests: Headers[] = []\n  const shared = new Headers()\n\n  request.headers.forEach((value, key) => {\n    const [requestId, headerName] = key.split('.')\n\n    if (Number.isInteger(requestId) && headerName != null) {\n      requests[Number(requestId)] ??= new Headers()\n      requests[Number(requestId)]?.set(headerName, value)\n    } else if (!ignoreHeaders.includes(key)) {\n      shared.set(key, value)\n    }\n  })\n\n  return { requests, shared }\n}\n\nfunction unBatchQueries(request: Request): URLSearchParams[] {\n  const result: URLSearchParams[] = []\n\n  const requestUrl = new URL(request.url)\n\n  for (const [key, value] of requestUrl.searchParams.entries()) {\n    const [requestId, queryName] = key.split('.')\n\n    if (Number.isNaN(requestId) || queryName == null) continue\n    result[Number(requestId)] ??= new URLSearchParams()\n    result[Number(requestId)]?.append(queryName, value)\n  }\n\n  return result\n}\n\n/**\n * This may result in a TS error if you have \"declaration\": true in your tsconfig.\n * TS 4118 The type of this node cannot be serialized because its property '[EdenQueryStoreKey]' cannot be serialized.\n */\nexport function safeBatchPlugin(options?: BatchPluginOptions) {\n  const plugin = <BasePath extends string>(\n    elysia: Elysia<BasePath>,\n  ): Elysia<\n    BasePath,\n    {\n      decorator: {}\n      store: Record<typeof EdenQueryStoreKey, { batch: true }>\n      derive: {}\n      resolve: {}\n    }\n  > => {\n    const endpoint = options?.endpoint ?? BATCH_ENDPOINT\n\n    const instance = new Elysia()\n      /**\n       * Handler for batch requests using POST.\n       */\n      .post(endpoint, async (context) => {\n        const requests = await unBatchRequests(context.request, context.body)\n\n        const originalUrl = new URL(context.request.url)\n\n        const responses = await Promise.allSettled(\n          requests.map(async (batchedRequest) => {\n            // TODO: how to handle this?\n\n            const fullPath = `${originalUrl.origin}${batchedRequest.path}`\n\n            const requestUrl = createUrl(fullPath, batchedRequest.query)\n\n            const request = new Request(requestUrl, batchedRequest)\n\n            const response = await elysia.handle(request)\n\n            return { request, response }\n          }),\n        ).catch((e) => {\n          console.error('Error occurred while handling batched requests: ', e)\n          return []\n        })\n\n        const parsedResponses = await Promise.all(\n          responses.map(async (handledRequest) => {\n            if (handledRequest.status === 'rejected') {\n              console.error('Failed to handle request: ', handledRequest.reason)\n              return\n            }\n\n            const result = await parseResponse(handledRequest.value.response).catch((e) => {\n              console.error('Failed to parse response: ', e)\n            })\n\n            return result\n          }),\n        )\n\n        return parsedResponses\n      })\n      /**\n       * Handler for batch requests using GET.\n       */\n      .get(endpoint, async (context) => {\n        const requests: BatchedRequestData[] = []\n\n        const requestUrl = new URL(context.request.url)\n\n        for (const [key, value] of requestUrl.searchParams.entries()) {\n          const [requestIndex, methodOrQuery, queryKey] = key.split('.')\n\n          const numericRequestIndex = Number(requestIndex)\n\n          if (Number.isNaN(numericRequestIndex) || methodOrQuery == null) continue\n\n          const current: BatchedRequestData = requests[numericRequestIndex] ?? ({} as any)\n\n          switch (methodOrQuery) {\n            case 'method': {\n              current.method = value\n              break\n            }\n            case 'query': {\n              if (queryKey != null) {\n                current.query ??= new URLSearchParams()\n                current.query.append(queryKey, value)\n              }\n            }\n          }\n\n          requests[numericRequestIndex] = current\n        }\n\n        const originalUrl = new URL(context.request.url)\n\n        const responses = await Promise.allSettled(\n          requests.map(async (batchedRequest) => {\n            const fullPath = `${originalUrl.origin}${batchedRequest.path}`\n\n            const requestUrl = createUrl(fullPath, batchedRequest.query)\n\n            const request = new Request(requestUrl, batchedRequest)\n\n            const response = await elysia.handle(request)\n\n            return { request, response }\n          }),\n        ).catch((e) => {\n          console.error('Error occurred while handling batched requests: ', e)\n          return []\n        })\n\n        const parsedResponses = await Promise.all(\n          responses.map(async (handledRequest) => {\n            if (handledRequest.status === 'rejected') {\n              console.error('Failed to handle request: ', handledRequest.reason)\n              return\n            }\n\n            const result = await parseResponse(handledRequest.value.response).catch((e) => {\n              console.error('Failed to parse response: ', e)\n            })\n\n            return result\n          }),\n        )\n\n        return parsedResponses\n      })\n\n    return elysia.use(instance) as any\n  }\n\n  return plugin\n}\n\nexport function batchPlugin<T extends Elysia = Elysia>(\n  options?: BatchPluginOptions,\n): GenericElysiaPlugin<T> {\n  return safeBatchPlugin(options) as any\n}\n","export function createUrl(path: string, query?: URLSearchParams): string {\n  return path + (query?.size ? `?${query.toString()}` : '')\n}\n","/**\n * Given a dot-concatenated string path, deeply set a property, filling in any missing objects along the way.\n */\nexport function set<T>(obj: unknown, key: PropertyKey, value: unknown): T {\n  if (obj == null) {\n    return value as any\n  }\n\n  if (typeof key === 'number' || typeof key === 'symbol') {\n    obj[key as keyof typeof obj] = value as never\n    return obj[key as keyof typeof obj] as T\n  }\n\n  const keyArray = key\n    .replace(/[\"|']|\\]/g, '')\n    .split(/\\.|\\[/)\n    .filter(Boolean)\n\n  const lastIndex = keyArray.length - 1\n\n  const lastKey = keyArray[lastIndex]\n\n  const result = keyArray.reduce((currentResult, currentKey, index) => {\n    if (index === lastIndex) {\n      currentResult[currentKey as keyof typeof currentResult] = value as never\n      return currentResult\n    }\n\n    currentResult[currentKey as keyof typeof currentResult] ??= (\n      isNaN(keyArray[index + 1] as any) ? {} : []\n    ) as never\n\n    return currentResult[currentKey as keyof typeof currentResult]\n  }, obj)\n\n  return result[lastKey as keyof typeof result] as T\n}\n","import { Elysia } from 'elysia'\nimport { ElysiaCustomStatusResponse } from 'elysia/error'\n\nimport type { EdenQueryStoreKey } from '../constraints'\nimport { type DataTransformerOptions, getDataTransformer } from '../links/internal/transformer'\nimport type { GenericElysiaPlugin } from './types'\n\nfunction isError(response: unknown): boolean {\n  if (response == null) {\n    return false\n  }\n\n  if (response instanceof ElysiaCustomStatusResponse) {\n    return true\n  }\n\n  // For some reason, instanceof does not reliably detect if it is the right instance...\n  if (response.constructor.name === ElysiaCustomStatusResponse.name) {\n    return true\n  }\n\n  if (response instanceof Error) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * @fixme:\n *\n * TS 4118 The type of this node cannot be serialized because its property '[EdenQueryStoreKey]' cannot be serialized.\n *\n * Turn off declaration: true and declarationMap: true\n */\nexport function safeTransformPlugin<T extends DataTransformerOptions>(transformer: T) {\n  const resolvedTransformer = getDataTransformer(transformer)\n\n  const plugin = <BasePath extends string>(\n    elysia: Elysia<BasePath>,\n  ): Elysia<\n    BasePath,\n    {\n      decorator: {}\n      store: Record<typeof EdenQueryStoreKey, { transformer: T }>\n      derive: {}\n      resolve: {}\n    }\n  > => {\n    /**\n     * No transformer provided or found...\n     */\n    if (resolvedTransformer == null) {\n      return elysia as any\n    }\n\n    const withTransforms = elysia\n      /**\n       * De-serialize incoming JSON data from the client using SuperJSON.\n       */\n      .onParse(async (context) => {\n        if (context.contentType !== 'application/json') return\n\n        const json = await context.request.json()\n\n        return await resolvedTransformer.input.deserialize(json)\n      })\n\n      /**\n       * Serialize outgoing JSON data from the server using SuperJSON.\n       *\n       * Currently pending open issue with mapResponse and error\n       * @see https://github.com/elysiajs/elysia/issues/854\n       */\n      .mapResponse(async (context) => {\n        // FIXME: upstream, this function should not be called if there was an error.\n        // But it might get called anyways...\n        if (isError(context.response)) return\n\n        // TODO: when should responses not be transformed?\n        // if (typeof context.response !== 'object') return\n\n        /**\n         * If it's already a response, don't transform it?\n         */\n        if (context.response instanceof Response) return\n\n        const serializedResponse = await resolvedTransformer.output.serialize(context.response)\n\n        const text = JSON.stringify(serializedResponse)\n\n        return new Response(text, {\n          headers: {\n            'Content-Type': 'application/json',\n          },\n        })\n      })\n\n    return withTransforms as any\n  }\n\n  return plugin\n}\n\nexport function transformPlugin<T extends Elysia = Elysia>(\n  transformer: DataTransformerOptions,\n): GenericElysiaPlugin<T> {\n  return safeTransformPlugin(transformer) as any\n}\n","import type Elysia from 'elysia'\nimport type { AnyElysia } from 'elysia'\n\nimport type { EdenQueryConstraints, EdenQueryStoreKey } from '../constraints'\nimport { batchPlugin } from './batch'\nimport { transformPlugin } from './transform'\nimport type { GenericElysiaPlugin } from './types'\n\nexport type EdenPluginOptions = EdenQueryConstraints\n\n/**\n * Combines both the batch and transform plugins, ___and orders them properly___.\n *\n * The transform plugin (if used) needs to be set before the batch plugin.\n *\n * --\n *\n * Type Invariants\n *\n * > Constraints that are captured on the type-level.\n *\n * If the server has enabled batching, the client can use batching if desired.\n * If the server has NOT enabled batching, the client can NOT use a batch link.\n *\n * If the server has enabled a transformer, the client MUST apply the same transformer.\n * If the server has NOT enabled any transformers, the client can opt-in to using a transformer;\n *   this is at your own risk, since eden allows transformers to be specified for any request,\n *   but it's not guranteed to be parsed correctly by the server...\n */\nexport function safeEdenPlugin<T extends EdenQueryConstraints>(config: T) {\n  const plugin = <BasePath extends string>(\n    elysia: Elysia<BasePath>,\n  ): Elysia<\n    BasePath,\n    {\n      decorator: {}\n      store: Record<\n        typeof EdenQueryStoreKey,\n        T['batch'] extends undefined\n          ? T['transformer'] extends undefined\n            ? {}\n            : { transformer: T['transformer'] }\n          : T['transformer'] extends undefined\n            ? { batch: T['batch'] }\n            : T\n      >\n      derive: {}\n      resolve: {}\n    }\n  > => {\n    let current: AnyElysia = elysia\n\n    if (config.transformer) {\n      current = current.use(transformPlugin(config.transformer))\n    }\n\n    if (config.batch) {\n      const batchConfig = typeof config.batch === 'boolean' ? undefined : config.batch\n      current = current.use(batchPlugin(batchConfig))\n    }\n\n    return current\n  }\n\n  return plugin\n}\n\n/**\n * Combines both the batch and transform plugins, ___and orders them properly___.\n *\n * The transform plugin (if used) needs to be set before the batch plugin.\n *\n * --\n *\n * Type Invariants\n *\n * > Constraints that are captured on the type-level.\n *\n * If the server has enabled batching, the client can use batching if desired.\n * If the server has NOT enabled batching, the client can NOT use a batch link.\n *\n * If the server has enabled a transformer, the client MUST apply the same transformer.\n * If the server has NOT enabled any transformers, the client can opt-in to using a transformer;\n *   this is at your own risk, since eden allows transformers to be specified for any request,\n *   but it's not guranteed to be parsed correctly by the server...\n */\nexport function edenPlugin<T extends Elysia = Elysia>(\n  config: EdenQueryConstraints,\n): GenericElysiaPlugin<T> {\n  return safeEdenPlugin(config) as any\n}\n\nexport * from './batch'\nexport * from './transform'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AEuCO,SAAS,YAAY,eAAoB,MAAqB;AACnE,SAAO,KAAK,aAAa;AAC3B;AA8CO,IAAM,eAAN,MAA+C;EACpD,YAAmB,aAAoE;AAApE,SAAA,cAAA;EAAqE;EAExF,UAAU,UAA8D;AACtE,QAAI,cAAoC;AACxC,QAAI,SAAS;AACb,QAAI,eAAe;AACnB,QAAI,sBAAsB;AAE1B,QAAI,cAAc,MAAM;AACtB,UAAI,aAAc;AAElB,UAAI,gBAAgB,MAAM;AACxB,8BAAsB;AACtB;MACF;AAEA,qBAAe;AAEf,UAAI,OAAO,gBAAgB,YAAY;AACrC,oBAAY;MACd,WAAW,aAAa;AACtB,oBAAY,YAAY;MAC1B;IACF;AAEA,kBAAc,KAAK,YAAY;MAC7B,MAAM,CAAC,UAAU;AACf,YAAI,OAAQ;AACZ,kBAAU,OAAO,KAAK;MACxB;MACA,OAAO,CAAC,QAAQ;AACd,YAAI,OAAQ;AACZ,iBAAS;AACT,kBAAU,QAAQ,GAAG;AACrB,oBAAY;MACd;MACA,UAAU,MAAM;AACd,YAAI,OAAQ;AACZ,iBAAS;AACT,kBAAU,WAAW;AACrB,oBAAY;MACd;IACF,CAAC;AAED,QAAI,qBAAqB;AACvB,kBAAY;IACd;AAEA,WAAO;MACL;IACF;EACF;AACF;AAEO,IAAM,aAAN,cAAqD,aAA6B;EACvF,YAAY,aAAoE;AAC9E,UAAM,WAAW;EACnB;EAkCA,QAAQ,YAA4C;AAClD,WAAO,WAAW,OAAO,aAAa,IAAI;EAC5C;AACF;;;AItLO,IAAM,2BAA2B,CAAC,OAAO,QAAQ,WAAW;AAE5D,IAAM,eAAe;EAC1B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;AACF;AAEO,IAAM,qBAAqB,CAAC,aAAa,aAAa,SAAS;AAE/D,IAAM,YAAY,OAAO,aAAa;AAKtC,IAAM,cAAc;AAEpB,IAAM,gBACX;AAEK,IAAM,oBACX;AAEK,IAAM,uBACX;AAEK,IAAM,iBAAiB;;;AC1BvB,IAAM,iBAAN,cAA8E,MAAM;EACzF,YACS,QACA,OACP;AACA,UAAM,QAAQ,EAAE;AAHT,SAAA,SAAA;AACA,SAAA,QAAA;EAGT;AACF;AA+BO,IAAM,eAAe,OAAO,WAAW;;;ACDvC,SAAS,mBACd,yBAC6B;AAC7B,MAAI,yBAAyB;AAC3B,WAAO;EACT;AAEA,MAAI,OAAO,WAAW,eAAe,OAAO,iBAAiB;AAC3D,WAAO,OAAO;EAChB;AAEA,MAAI,OAAO,eAAe,eAAe,WAAW,iBAAiB;AACnE,WAAO,WAAW;EACpB;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,OAAO,WAAW,MAAM;AAElD,IAAM,sBAAsB,CAAC,QAAQ,OAAO,SAAS,QAAQ;AAE7D,IAAM,0BAA0B,CAAC,WAAW,WAAW;AAEvD,IAAM,cAAc;EACzB,GAAG;EACH,GAAG;EACH,GAAG;AACL;;;ACJA,IAAM,qBAAsC;EAC1C,WAAW,CAAC,UAAU;EACtB,aAAa,CAAC,UAAU;AAC1B;AAEA,IAAM,yBAAkD;EACtD,OAAO;EACP,QAAQ;AACV;AAEO,SAAS,mBAAmB,aAA+D;AAChG,MAAI,eAAe,MAAM;AACvB,WAAO;EACT;AAEA,MAAI,eAAe,aAAa;AAC9B,WAAO,EAAE,OAAO,aAAa,QAAQ,YAAY;EACnD;AAEA,SAAO;AACT;ACnFO,SAAS,OAAO,GAAQ;AAC7B,MAAI,UAAW,QAAO,aAAa;AAEnC,SAAO,aAAa,YAAY,aAAa;AAC/C;AAEO,SAAS,QAAQ,QAAuC;AAC7D,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,OAAO,GAAG,CAAC,EAAG,QAAO;AAEhC,QAAI,MAAM,QAAQ,OAAO,GAAG,CAAC,KAAM,OAAO,GAAG,EAAgB,KAAK,MAAM,EAAG,QAAO;EACpF;AAEA,SAAO;AACT;ACdO,SAAS,kBAAkB,OAAyB;AACzD,SAAO,yBAAyB,SAAS,KAAY;AACvD;ACNA,SAAS,gBAAgB,SAAiB;AACxC,SAAO,QAAQ,KAAK,EAAE,WAAW,KAAK,CAAC,OAAO,MAAM,OAAO,OAAO,CAAC;AACrE;AAEA,SAAS,oBAAoB,OAAwB;AACnD,QAAM,QAAQ,MAAM,WAAW,CAAC;AAChC,QAAM,MAAM,MAAM,WAAW,MAAM,SAAS,CAAC;AAE7C,SAAQ,UAAU,OAAO,QAAQ,OAAS,UAAU,MAAM,QAAQ;AACpE;AAEO,SAAS,qBAAqB,OAA6B;AAChE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;EACT;AAGA,QAAM,OAAO,MAAM,QAAQ,MAAM,EAAE;AAEnC,MAAI,cAAc,KAAK,IAAI,KAAK,kBAAkB,KAAK,IAAI,KAAK,qBAAqB,KAAK,IAAI,GAAG;AAC/F,UAAM,OAAO,IAAI,KAAK,IAAI;AAE1B,QAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AACjC,aAAO;IACT;EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAAc;AACnD,SAAO,KAAK,MAAM,MAAM,CAAC,GAAG,UAAU;AACpC,UAAM,OAAO,qBAAqB,KAAK;AAEvC,QAAI,MAAM;AACR,aAAO;IACT;AAEA,WAAO;EACT,CAAC;AACH;AAEO,SAAS,sBAAsB,OAAe;AACnD,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAEA,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO,CAAC;EACV;AAEA,MAAI,UAAU,QAAQ;AACpB,WAAO;EACT;AAEA,MAAI,UAAU,SAAS;AACrB,WAAO;EACT;AAEA,QAAM,OAAO,qBAAqB,KAAK;AAEvC,MAAI,MAAM;AACR,WAAO;EACT;AAEA,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI;AACF,aAAO,uBAAuB,KAAK;IACrC,QAAQ;IAER;EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAqB;AACrD,QAAM,gBAAgB,MAAM,KAAK,SAAS;AAE1C,SAAO,kBAAkB,SAAS,OAAO,sBAAsB,aAAa;AAC9E;ACrEA,SAAS,cAAc,GAAS;AAC9B,MAAI,WAAW;AACb,WAAO;EACT;AAEA,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAM,SAAS,IAAI,WAAW;AAE9B,WAAO,SAAS,MAAM;AACpB,YAAM,WAAW,OAAO,UAAU,OAAO,CAAC,OAAO,MAAM,IAAI,CAAC;AAC5D,YAAM,OAAO,EAAE;AACf,YAAM,eAAe,EAAE;AACvB,YAAM,OAAO,EAAE;AAEf,YAAM,OAAO,IAAI,KAAK,UAAU,MAAM,EAAE,cAAc,KAAK,CAAC;AAE5D,cAAQ,IAAI;IACd;AAEA,WAAO,kBAAkB,CAAC;EAC5B,CAAC;AACH;AAEA,eAAe,eACb,eACA,MACA,UAAuB,CAAC,GACxB,UAAkC,CAAC,GACF;AACjC,MAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,eAAW,SAAS;AAClB,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,kBAAU,MAAM,eAAe,OAAO,MAAM,SAAS,OAAO;MAC9D,OAAO;AACL,cAAM,MAAM,MAAM,CAAC;AACnB,YAAI,OAAO,QAAQ,UAAU;AAC3B,kBAAQ,IAAI,YAAY,CAAC,IAAI,MAAM,CAAC;QACtC,OAAO;AACL,qBAAW,CAAC,GAAGA,MAAK,KAAK,KAAK;AAC5B,gBAAI,GAAG;AACL,sBAAQ,EAAE,YAAY,CAAC,IAAIA;YAC7B;UACF;QACF;MACF;AAEF,WAAO;EACT;AAEA,MAAI,CAAC,eAAe;AAClB,WAAO;EACT;AAEA,UAAQ,OAAO,eAAe;IAC5B,KAAK,YAAY;AACf,UAAI,yBAAyB,SAAS;AACpC,eAAO,eAAe,eAAe,MAAM,SAAS,OAAO;MAC7D;AAEA,YAAM,gBAAgB,MAAM,cAAc,MAAM,OAAO;AAEvD,UAAI,eAAe;AACjB,eAAO,eAAe,eAAe,MAAM,SAAS,OAAO;MAC7D;AAEA,aAAO;IACT;IAEA,KAAK,UAAU;AACb,UAAI,yBAAyB,SAAS;AACpC,sBAAc,QAAQ,CAAC,OAAO,QAAQ;AACpC,kBAAQ,IAAI,YAAY,CAAC,IAAI;QAC/B,CAAC;AAED,eAAO;MACT;AAEA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACxD,gBAAQ,IAAI,YAAY,CAAC,IAAI;MAC/B;AAEA,aAAO;IACT;IAEA,SAAS;AACP,aAAO;IACT;EACF;AACF;AAEA,gBAAuB,eAAe,UAAoB;AACxD,QAAM,OAAO,SAAS;AAEtB,MAAI,CAAC,KAAM;AAEX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAEhC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,UAAI,KAAM;AAEV,YAAM,OAAO,QAAQ,OAAO,KAAK;AAEjC,YAAM,sBAAsB,IAAI;IAClC;EACF,UAAA;AACE,WAAO,YAAY;EACrB;AACF;AAEA,SAAS,iBAAiB,OAAa;AACrC,MAAI,IAAI;AAER,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,KAAK,OAAO;AACrB,cAAM,IAAI,MAAM,OAAO,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC;MAC5E;IACF,WAAW,OAAO,UAAU,UAAU;AACpC,YAAM,mBAAmB,KAAK,UAAU,KAAK;AAC7C,YAAM,IAAI,MAAM,OAAO,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,gBAAgB,CAAC;IAC3F,WAAW,SAAS,MAAM;AACxB,YAAM,IAAI,MAAM,OAAO,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,GAAG,KAAK,EAAE,CAAC;IACrF;EACF;AAEA,SAAO;AACT;AAEA,eAAsB,cACpB,UACA,QACA;AACA,MAAI,QAAQ,cAAc,MAAM;AAC9B,UAAM,aAAa,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC,OAAO,UAAU;AAE5F,eAAW,SAAS,YAAY;AAC9B,UAAI;AACF,cAAMC,QAAO,MAAM,MAAM,SAAS,MAAM,CAAC;AACzC,YAAIA,SAAQ,MAAM;AAChB,iBAAO,EAAE,MAAAA,OAAM,OAAO,MAAM,QAAQ,SAAS,OAAO;QACtD;MACF,SAAS,KAAK;AACZ,cAAM,QAAQ,eAAe,iBAAiB,MAAM,IAAI,eAAe,KAAK,GAAG;AAC/E,eAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,SAAS,OAAO;MACtD;IACF;EACF;AAEA,MAAI;AAEJ,UAAQ,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG;IAC3D,KAAK,qBAAqB;AACxB,aAAO,eAAe,QAAQ;AAC9B;IACF;IAEA,KAAK,oBAAoB;AACvB,aAAO,MAAM,SAAS,KAAK;AAE3B,YAAM,cAAc,mBAAmB,QAAQ,WAAW;AAE1D,YAAM,cAAc,aAAa,OAAO;AAExC,UAAI,eAAe,MAAM;AACvB,eAAO,YAAY,IAAI;MACzB;AAEA;IACF;IAEA,KAAK,4BAA4B;AAC/B,aAAO,MAAM,SAAS,YAAY;AAClC;IACF;IAEA,KAAK,uBAAuB;AAC1B,YAAM,OAAO,MAAM,SAAS,SAAS;AAErC,aAAO,CAAC;AAER,WAAK,QAAQ,CAAC,OAAO,QAAQ;AAC3B,aAAK,GAAG,IAAI;MACd,CAAC;AAED;IACF;IAEA,SAAS;AACP,aAAO,MAAM,SAAS,KAAK,EAAE,KAAK,qBAAqB;IACzD;EACF;AAEA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,UAAM,QAAQ,IAAI,eAAe,SAAS,QAAQ,IAAI;AACtD,WAAO;MACL,MAAM;MACN;MACA,QAAQ,SAAS;MACjB,YAAY,SAAS;IACvB;EACF,OAAO;AACL,WAAO;MACL;MACA,OAAO;MACP,QAAQ,SAAS;MACjB,YAAY,SAAS;IACvB;EACF;AACF;AAgCA,eAAsB,mBAGpB,QAA0E;AAC1E,MAAI,OAAO,OAAO,QAAQ;AAE1B,MAAI,OAAO,SAAS,UAAU,MAAM;AAClC,WAAO,QAAQ,OAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9D,UAAI,SAAS,MAAM;AACjB,eAAO,KAAK,QAAQ,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC;MAC9C;IACF,CAAC;EACH;AAEA,QAAM,cAAc,kBAAkB,OAAO,MAAM;AAEnD,QAAM,UAAU,MAAM,eAAe,OAAO,SAAS,MAAM,OAAO,SAAS,OAAO;AAElF,MAAI,IAAI,iBAAiB,OAAO,SAAS,KAAK;AAE9C,MAAI,OAAO,WAAW,aAAa;AACjC,UAAMC,UAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAEnE,UAAM,WAAWA,QAAO,WAAW,UAAU,IACzC,WACAA,QAAO,WAAW,SAAS,IACzB,UACA,mBAAmB,KAAK,CAAC,YAAYA,QAAO,SAAS,OAAO,CAAC,IAC3D,UACA;AAER,UAAM,SAASA,QAAO,QAAQ,gBAAgB,QAAQ;AAEtD,UAAMC,OAAM,SAAS,OAAO;AAE5B,WAAO,IAAI,OAAOA,IAAG;EACvB;AAEA,MAAI,YAAY;IACd,QAAQ,OAAO,QAAQ,YAAY;IACnC,MAAM,OAAO;IACb,GAAG,OAAO;IACV;EACF;AAEA,YAAU,UAAU;IAClB,GAAG;IACH,GAAI,MAAM,eAAe,OAAO,SAAS,SAAS,MAAM,SAAS;EACnE;AAEA,MAAI,aAAa;AACf,WAAO,UAAU;EACnB;AAEA,MAAI,OAAO,WAAW;AACpB,UAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC,OAAO,SAAS;AAExF,eAAW,SAAS,WAAW;AAC7B,YAAM,OAAO,MAAM,MAAM,MAAM,SAAS;AAExC,UAAI,OAAO,SAAS;AAClB,oBAAY;UACV,GAAG;UACH,GAAG;UACH,SAAS;YACP,GAAG,UAAU;YACb,GAAI,MAAM,eAAe,MAAM,SAAS,MAAM,SAAS;UACzD;QACF;IACJ;EACF;AAGA,MAAI,aAAa;AACf,WAAO,UAAU;EACnB;AAGA,MAAI,YAAY,QAAQ,OAAO,gBAAgB,UAAU;EAEzD,WAAW,QAAQ,OAAO,IAAW,GAAG;AACtC,UAAM,WAAW,IAAI,SAAS;AAG9B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,IAAI,GAAG;AACzD,UAAI,WAAW;AACb,iBAAS,OAAO,KAAK,KAAY;AAEjC;MACF;AAEA,UAAI,iBAAiB,MAAM;AACzB,iBAAS,OAAO,KAAK,MAAM,cAAc,KAAY,CAAC;AAEtD;MACF;AAEA,UAAI,iBAAiB,UAAU;AAC7B,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ;AAChC,mBAAS,OAAO,KAAY,MAAM,cAAe,MAAc,CAAC,CAAC,CAAC;AAEpE;MACF;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAM,QAAS,MAAc,CAAC;AAE9B,mBAAS,OAAO,KAAY,iBAAiB,OAAO,MAAM,cAAc,KAAK,IAAI,KAAK;QACxF;AAEA;MACF;AAEA,eAAS,OAAO,KAAK,KAAe;IACtC;AAIA,cAAU,OAAO;EACnB,WAAW,OAAO,OAAO,SAAS,UAAU;AAC1C,cAAU,QAAQ,cAAc,IAAI;AAEpC,UAAM,cAAc,mBAAmB,OAAO,WAAW;AAEzD,UAAM,OAAO,cAAc,YAAY,MAAM,UAAU,OAAO,IAAI,IAAI,OAAO;AAE7E,cAAU,OAAO,KAAK,UAAU,IAAI;EACtC,WAAW,OAAO,SAAS,MAAM;AAC/B,cAAU,QAAQ,cAAc,IAAI;EACtC;AAEA,MAAI,aAAa;AACf,WAAO,UAAU;EACnB;AAEA,MAAI,OAAO,WAAW;AACpB,UAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC,OAAO,SAAS;AAExF,eAAW,SAAS,WAAW;AAC7B,YAAM,OAAO,MAAM,MAAM,MAAM,SAAS;AAExC,UAAI,OAAO,SAAS;AAClB,oBAAY;UACV,GAAG;UACH,GAAG;UACH,SAAS;YACP,GAAG,UAAU;YACb,GAAI,MAAM,eAAe,MAAM,SAAS,MAAM,SAAS;UACzD;QACF;IACJ;EACF;AAEA,QAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAEnE,QAAM,MAAM,SAAS,OAAO;AAE5B,QAAM,SAAS,OAAO,OAAO,WAAW,WAAW,SAAY,OAAO;AAEtE,QAAM,UAAU,OAAO,WAAW,WAAW;AAE7C,QAAM,WAAW,OAAO,QAAQ,OAAO,IAAI,QAAQ,KAAK,SAAS,CAAC,KAAK,QAAQ,KAAK,SAAS;AAE7F,QAAM,eAAe,MAAM,cAAc,UAAU,MAAM;AAEzD,MAAI,aAAa,SAAS,MAAM;AAC9B,WAAO;MACL,GAAG;MACH,GAAI,OAAO,OAAO,EAAE,UAAU,SAAS,SAAS,SAAS,YAAY,SAAS,WAAW;IAC3F;EACF;AAEA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,iBAAa,QAAQ,IAAI,eAAe,SAAS,QAAQ,aAAa,IAAI;AAC1E,iBAAa,OAAO;EACtB;AAEA,SAAO;IACL,GAAG;IACH,GAAI,OAAO,OAAO,EAAE,UAAU,SAAS,SAAS,SAAS,YAAY,SAAS,WAAW;EAC3F;AACF;AExaO,IAAM,qBAAgC,CAAC,YAAY;AACxD,QAAM;IACJ,IAAI;IACJ,MAAM;IACN,iBAAAC;IACA;IACA;IACA,GAAG;EACL,IAAI;AAEJ,QAAM,kBAAkBA,mBAAkB,IAAIA,iBAAgB,IAAI;AAElE,MAAI,OAAO;AAEX,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,MAAM;AACT,uBAAiB,MAAM;IACzB;EACF;AAOA,QAAM,iBAAoC,EAAE,GAAG,eAAe,GAAG,OAAO;AAExE,MAAI,QAAQ,OAAO,OAAO,QAAQ;AAChC,YAAQ,OAAO,MAAM,OAAO,iBAAiB,SAAS,MAAM;AAC5D,mBAAe,QAAQ,EAAE,GAAG,eAAe,OAAO,QAAQ,iBAAiB,OAAO;EACpF;AAEA,MAAI,kBAAkB,MAAM;AAC1B,mBAAe,SAAS;EAC1B;AAEA,QAAM,UAAU,IAAI,QAAsB,CAAC,SAAS,WAAW;AAC7D,uBAAmB,cAAc,EAC9B,KAAK,CAAC,aAAa;AAClB,aAAO;AACP,cAAQ,QAAwB;IAClC,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,aAAO;AACP,aAAO,GAAG;IACZ,CAAC;EACL,CAAC;AAED,SAAO,EAAE,SAAS,OAAO;AAC3B;AC/BO,SAAS,gBAAgB,gBAAyD;AACvF,QAAM,UAA2B,CAAC,cAAc,CAAC,MAAa;AAC5D,UAAM,OAAiB,CAAC,aAAa;AACnC,YAAM,mBAAmB,CAAC,WAAsB,aAAiC;AAC/E,cAAM,EAAE,OAAO,QAAQ,iBAAAA,kBAAiB,gBAAgB,GAAG,cAAc,IAAI;AAE7E,cAAM,EAAE,IAAI,SAAS,MAAM,OAAO,IAAI;AAEtC,cAAM,UAAU;UACd;UACA,iBAAiB,mBAAmBA,gBAAe;UACnD;UACA;UACA;UACA;UACA,QAAQ,EAAE,GAAG,eAAe,QAAQ,GAAG,OAAO;QAChD;AAEA,cAAM,EAAE,SAAS,OAAO,IAAI,eAAe,UAAU,OAAO;AAE5D,gBACG,KAAK,CAAC,WAAW;AAChB,mBAAS,KAAK,MAAM;AACpB,mBAAS,SAAS;QACpB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,mBAAS,MAAM,KAAK;QACtB,CAAC;AAEH,eAAO;MACT;AAEA,YAAM,gBAA+B,CAAC,EAAE,UAAU,MAAM;AACtD,cAAM,aAAa,IAAI,WAAW,iBAAiB,KAAK,QAAW,SAAS,CAAC;AAC7E,eAAO;MACT;AAEA,aAAO;IACT;AAEA,WAAO;EACT;AAEA,SAAO;AACT;AAKO,IAAM,eAAe,gBAAgB,EAAE,WAAW,mBAAmB,CAAC;AK7BtE,IAAM,SAAN,MAA8C;EAKnD,YACS,KACA,SACP;AAFO,SAAA,MAAA;AACA,SAAA,UAAA;AAEP,SAAK,KAAK,IAAI,UAAU,GAAG;AAC3B,SAAK,cAAc,SAAS,cAAc,mBAAmB,SAAS,WAAW,IAAI;EACvF;EAVA;EAEA;;;;EAaA,QAAQ;AACN,SAAK,GAAG,MAAM;AACd,WAAO;EACT;;;;EAKA,OAAO,OAAO,SAAgC;AAC5C,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,KAAK,SAAS,IAAI;IAC1B,OAAO;AACL,YAAM,KAAK,WAAW,IAAI;IAC5B;AACA,WAAO;EACT;;;;EAKA,WAAW,OAAO,SAAsB;AACtC,UAAM,QAAQ,WAAW,KAAK,IAAI,KAAK,UAAU,CAAC;AAClD,WAAO;EACT;;;;EAKA,aAAa,OAAO,SAAoB;AACtC,UAAM,UAAU,MAAM,KAAK,cAAc,IAAI;AAC7C,SAAK,GAAG,KAAK,OAAO;AACpB,WAAO;EACT;;;;EAKA,UACE,WACA,SACA;AACA,WAAO,KAAK,GAAG,WAAW,WAAW,OAAO;EAC9C;;;;;;EAOA,GACE,MACA,UACA,SACA;AACA,WAAO,KAAK,iBAAiB,MAAM,UAAU,OAAO;EACtD;;;;;;EAOA,IACE,MACA,UACA,SACA;AACA,SAAK,oBAAoB,MAAM,UAAU,OAAO;AAChD,WAAO;EACT;;;;EAKA,iBACE,MACA,UACA,SACA;AACA,UAAM,wBAAwB,OAAO,OAA6B;AAChE,UAAI,QAAa;AAEjB,UAAI,SAAS,WAAW;AACtB,cAAM,OAAQ,MAAM,KAAK,kBAAkB,KAAK,KAAM,kBAAkB,KAAK;AAC7E,gBAAQ,EAAE,GAAG,IAAI,KAAK;MACxB;AAEA,eAAS,KAAK;IAChB;AAEA,SAAK,GAAG,iBAAiB,MAAM,uBAAuB,OAAO;AAC7D,WAAO;EACT;;;;EAKA,oBACE,MACA,UACA,SACA;AACA,SAAK,GAAG,oBAAoB,MAAM,UAAU,OAAO;AACnD,WAAO;EACT;;;;;;EAOA,gBAAgB,OAAO,SAAoB;AACzC,UAAM,YAAY,KAAK,aAAa,MAAM;AAE1C,QAAI;AAEJ,QAAI;AACF,oBAAc,MAAM,YAAY,IAAI;IACtC,SAAS,MAAM;IAEf;AAEA,QAAI,eAAe,MAAM;AACvB,sBAAgB,OAAO,SAAS,WAAW,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS;IAClF;AAEA,WAAO;EACT;;;;;;EAOA,oBAAoB,OAAO,UAAwB;AACjD,UAAM,cAAc,KAAK,aAAa,OAAO;AAE7C,QAAI,eAAe,KAAM;AAEzB,QAAI;AACF,UAAI,gBAAgB,MAAM;AAE1B,UAAI,OAAO,kBAAkB,UAAU;AACrC,wBAAgB,MAAM,KAAK,SAAS;MACtC;AAEA,YAAM,cAAc,MAAM,YAAY,aAAa;AACnD,aAAO;IACT,SAAS,MAAM;AACb;IACF;EACF;AACF;;;ACjOA,oBAAuB;AGAvB,IAAAC,iBAAuB;AACvB,mBAA2C;AFDpC,SAAS,UAAU,MAAc,OAAiC;AACvE,SAAO,QAAQ,OAAO,OAAO,IAAI,MAAM,SAAS,CAAC,KAAK;AACxD;ACCO,SAAS,IAAO,KAAc,KAAkB,OAAmB;AACxE,MAAI,OAAO,MAAM;AACf,WAAO;EACT;AAEA,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAU;AACtD,QAAI,GAAuB,IAAI;AAC/B,WAAO,IAAI,GAAuB;EACpC;AAEA,QAAM,WAAW,IACd,QAAQ,aAAa,EAAE,EACvB,MAAM,OAAO,EACb,OAAO,OAAO;AAEjB,QAAM,YAAY,SAAS,SAAS;AAEpC,QAAM,UAAU,SAAS,SAAS;AAElC,QAAM,SAAS,SAAS,OAAO,CAAC,eAAe,YAAY,UAAU;AACnE,QAAI,UAAU,WAAW;AACvB,oBAAc,UAAwC,IAAI;AAC1D,aAAO;IACT;AAEA,kBAAc,UAAwC,MACpD,MAAM,SAAS,QAAQ,CAAC,CAAQ,IAAI,CAAC,IAAI,CAAC;AAG5C,WAAO,cAAc,UAAwC;EAC/D,GAAG,GAAG;AAEN,SAAO,OAAO,OAA8B;AAC9C;AFgBA,eAAe,gBAAgB,SAAkB,MAA2C;AAC1F,QAAM,kBAAkB,OACpB,uBAAuB,IAAI,IAC3B,MAAM,uBAAuB,OAAO;AAExC,QAAM,iBAAiB,eAAe,OAAO;AAE7C,QAAM,iBAAiB,eAAe,OAAO;AAG7C,aAAW,SAAS,eAAe,UAAU;AAC3C,UAAM,UAAU,gBAAgB,KAAK;AACrC,QAAI,WAAW,MAAM;AACnB,cAAQ,YAAY,eAAe,SAAS,KAAK;IACnD;EACF;AAGA,iBAAe,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAC5C,oBAAgB,QAAQ,CAAC,mBAAmB;AAC1C,UAAI,CAAC,eAAe,SAAS,IAAI,GAAG,GAAG;AACrC,uBAAe,YAAY,IAAI,QAAQ;AACvC,uBAAe,QAAQ,IAAI,KAAK,KAAK;MACvC;IACF,CAAC;EACH,CAAC;AAGD,aAAW,SAAS,gBAAgB;AAClC,UAAM,UAAU,gBAAgB,KAAK;AACrC,QAAI,WAAW,MAAM;AACnB,cAAQ,UAAU,eAAe,KAAK;IACxC;EACF;AAGA,kBAAgB,QAAQ,CAACC,aAAY;AACnC,YAAQA,SAAQ,WAAW;MACzB,KAAK,YAAY;AACf,cAAMC,QAAO,IAAI,SAAS;AAE1B,YAAI,OAAOD,SAAQ,SAAS,UAAU;AACpC,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQA,SAAQ,IAAI,GAAG;AACvDC,kBAAK,IAAI,KAAK,KAAY;UAC5B;QACF;AAEAD,iBAAQ,OAAOC;AACf;MACF;MAEA,KAAK,QAAQ;AACXD,iBAAQ,SAAS,IAAI,gBAAgB,kBAAkB;AACvD;MACF;IACF;EACF,CAAC;AAED,SAAO;AACT;AAEA,eAAe,uBAAuB,SAAiD;AACrF,QAAM,SAA+B,CAAC;AAEtC,QAAM,WAAW,MAAM,QAAQ,WAAW;AAE1C,MAAI,YAAY,MAAM;AACpB,WAAO;EACT;AAGA,WAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,UAAM,CAAC,IAAI,QAAQ,IAAI,IAAI,MAAM,GAAG;AAEpC,QAAI,MAAM,QAAQ,YAAY,KAAM;AAEpC,QAAI;AACF,YAAM,QAAQ,OAAO,EAAE;AACvB,YAAM,gBAAqB,EAAE,GAAG,OAAO,KAAK,EAAE;AAE9C,UAAI,eAAe,UAAU,KAAK;AAElC,UAAI,SAAS,WAAW,MAAM,GAAG;AAC/B,cAAM,CAAC,SAAS,OAAO,IAAI,SAAS,MAAM,GAAG;AAE7C,YAAI,WAAW,MAAM;AACnB,wBAAc,YAAY,CAAC;AAC3B,wBAAc,QAAQ,OAAO,IAAI;QACnC;MACF;AAEA,aAAO,KAAK,IAAI;IAClB,SAAS,GAAG;AACV,cAAQ,MAAM,mCAAmC,EAAE,eAAe,CAAC;IACrE;EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAiD;AAC/E,QAAM,SAA+B,CAAC;AAGtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UAAM,CAAC,IAAI,UAAU,aAAa,IAAI,IAAI,MAAM,GAAG;AAEnD,QAAI,MAAM,QAAQ,YAAY,KAAM;AAEpC,QAAI;AACF,YAAM,QAAQ,OAAO,EAAE;AACvB,YAAM,gBAAqB,EAAE,GAAG,OAAO,KAAK,EAAE;AAE9C,UAAI,aAAa,SAAS;AACxB,sBAAc,UAAU,IAAI,gBAAgB;AAC5C,sBAAc,MAAM,OAAO,eAAe,KAAK;MACjD,WAAW,SAAS,WAAW,MAAM,GAAG;AACtC,cAAM,CAAC,SAAS,OAAO,IAAI,SAAS,MAAM,GAAG;AAC7C,YAAI,WAAW,MAAM;AACnB,wBAAc,YAAY,CAAC;AAC3B,wBAAc,QAAQ,OAAO,IAAI;QACnC;MACF,OAAO;AACL,YAAI,eAAe,UAAU,KAAK;MACpC;AAEA,aAAO,KAAK,IAAI;IAClB,SAAS,GAAG;AACV,cAAQ,MAAM,mCAAmC,EAAE,eAAe,CAAC;IACrE;EACF;AAEA,SAAO;AACT;AAKA,IAAM,gBAAgB,CAAC,gBAAgB,gBAAgB;AAEvD,SAAS,eAAe,SAA4D;AAClF,QAAM,WAAsB,CAAC;AAC7B,QAAM,SAAS,IAAI,QAAQ;AAE3B,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACtC,UAAM,CAAC,WAAW,UAAU,IAAI,IAAI,MAAM,GAAG;AAE7C,QAAI,OAAO,UAAU,SAAS,KAAK,cAAc,MAAM;AACrD,eAAS,OAAO,SAAS,CAAC,MAAM,IAAI,QAAQ;AAC5C,eAAS,OAAO,SAAS,CAAC,GAAG,IAAI,YAAY,KAAK;IACpD,WAAW,CAAC,cAAc,SAAS,GAAG,GAAG;AACvC,aAAO,IAAI,KAAK,KAAK;IACvB;EACF,CAAC;AAED,SAAO,EAAE,UAAU,OAAO;AAC5B;AAEA,SAAS,eAAe,SAAqC;AAC3D,QAAM,SAA4B,CAAC;AAEnC,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AAEtC,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,QAAQ,GAAG;AAC5D,UAAM,CAAC,WAAW,SAAS,IAAI,IAAI,MAAM,GAAG;AAE5C,QAAI,OAAO,MAAM,SAAS,KAAK,aAAa,KAAM;AAClD,WAAO,OAAO,SAAS,CAAC,MAAM,IAAI,gBAAgB;AAClD,WAAO,OAAO,SAAS,CAAC,GAAG,OAAO,WAAW,KAAK;EACpD;AAEA,SAAO;AACT;AAMO,SAAS,gBAAgB,SAA8B;AAC5D,QAAM,SAAS,CACb,WASG;AACH,UAAM,WAAW,SAAS,YAAY;AAEtC,UAAM,WAAW,IAAI,qBAAO,EAIzB,KAAK,UAAU,OAAO,YAAY;AACjC,YAAM,WAAW,MAAM,gBAAgB,QAAQ,SAAS,QAAQ,IAAI;AAEpE,YAAM,cAAc,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAE/C,YAAM,YAAY,MAAM,QAAQ;QAC9B,SAAS,IAAI,OAAO,mBAAmB;AAGrC,gBAAM,WAAW,GAAG,YAAY,MAAM,GAAG,eAAe,IAAI;AAE5D,gBAAM,aAAa,UAAU,UAAU,eAAe,KAAK;AAE3D,gBAAM,UAAU,IAAI,QAAQ,YAAY,cAAc;AAEtD,gBAAM,WAAW,MAAM,OAAO,OAAO,OAAO;AAE5C,iBAAO,EAAE,SAAS,SAAS;QAC7B,CAAC;MACH,EAAE,MAAM,CAAC,MAAM;AACb,gBAAQ,MAAM,oDAAoD,CAAC;AACnE,eAAO,CAAC;MACV,CAAC;AAED,YAAM,kBAAkB,MAAM,QAAQ;QACpC,UAAU,IAAI,OAAO,mBAAmB;AACtC,cAAI,eAAe,WAAW,YAAY;AACxC,oBAAQ,MAAM,8BAA8B,eAAe,MAAM;AACjE;UACF;AAEA,gBAAM,SAAS,MAAM,cAAc,eAAe,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM;AAC7E,oBAAQ,MAAM,8BAA8B,CAAC;UAC/C,CAAC;AAED,iBAAO;QACT,CAAC;MACH;AAEA,aAAO;IACT,CAAC,EAIA,IAAI,UAAU,OAAO,YAAY;AAChC,YAAM,WAAiC,CAAC;AAExC,YAAM,aAAa,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAE9C,iBAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,QAAQ,GAAG;AAC5D,cAAM,CAAC,cAAc,eAAe,QAAQ,IAAI,IAAI,MAAM,GAAG;AAE7D,cAAM,sBAAsB,OAAO,YAAY;AAE/C,YAAI,OAAO,MAAM,mBAAmB,KAAK,iBAAiB,KAAM;AAEhE,cAAM,UAA8B,SAAS,mBAAmB,KAAM,CAAC;AAEvE,gBAAQ,eAAe;UACrB,KAAK,UAAU;AACb,oBAAQ,SAAS;AACjB;UACF;UACA,KAAK,SAAS;AACZ,gBAAI,YAAY,MAAM;AACpB,sBAAQ,UAAU,IAAI,gBAAgB;AACtC,sBAAQ,MAAM,OAAO,UAAU,KAAK;YACtC;UACF;QACF;AAEA,iBAAS,mBAAmB,IAAI;MAClC;AAEA,YAAM,cAAc,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAE/C,YAAM,YAAY,MAAM,QAAQ;QAC9B,SAAS,IAAI,OAAO,mBAAmB;AACrC,gBAAM,WAAW,GAAG,YAAY,MAAM,GAAG,eAAe,IAAI;AAE5D,gBAAME,cAAa,UAAU,UAAU,eAAe,KAAK;AAE3D,gBAAM,UAAU,IAAI,QAAQA,aAAY,cAAc;AAEtD,gBAAM,WAAW,MAAM,OAAO,OAAO,OAAO;AAE5C,iBAAO,EAAE,SAAS,SAAS;QAC7B,CAAC;MACH,EAAE,MAAM,CAAC,MAAM;AACb,gBAAQ,MAAM,oDAAoD,CAAC;AACnE,eAAO,CAAC;MACV,CAAC;AAED,YAAM,kBAAkB,MAAM,QAAQ;QACpC,UAAU,IAAI,OAAO,mBAAmB;AACtC,cAAI,eAAe,WAAW,YAAY;AACxC,oBAAQ,MAAM,8BAA8B,eAAe,MAAM;AACjE;UACF;AAEA,gBAAM,SAAS,MAAM,cAAc,eAAe,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM;AAC7E,oBAAQ,MAAM,8BAA8B,CAAC;UAC/C,CAAC;AAED,iBAAO;QACT,CAAC;MACH;AAEA,aAAO;IACT,CAAC;AAEH,WAAO,OAAO,IAAI,QAAQ;EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,YACd,SACwB;AACxB,SAAO,gBAAgB,OAAO;AAChC;AG1WA,SAAS,QAAQ,UAA4B;AAC3C,MAAI,YAAY,MAAM;AACpB,WAAO;EACT;AAEA,MAAI,oBAAoB,yCAA4B;AAClD,WAAO;EACT;AAGA,MAAI,SAAS,YAAY,SAAS,wCAA2B,MAAM;AACjE,WAAO;EACT;AAEA,MAAI,oBAAoB,OAAO;AAC7B,WAAO;EACT;AAEA,SAAO;AACT;AASO,SAAS,oBAAsD,aAAgB;AACpF,QAAM,sBAAsB,mBAAmB,WAAW;AAE1D,QAAM,SAAS,CACb,WASG;AAIH,QAAI,uBAAuB,MAAM;AAC/B,aAAO;IACT;AAEA,UAAM,iBAAiB,OAIpB,QAAQ,OAAO,YAAY;AAC1B,UAAI,QAAQ,gBAAgB,mBAAoB;AAEhD,YAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK;AAExC,aAAO,MAAM,oBAAoB,MAAM,YAAY,IAAI;IACzD,CAAC,EAQA,YAAY,OAAO,YAAY;AAG9B,UAAI,QAAQ,QAAQ,QAAQ,EAAG;AAQ/B,UAAI,QAAQ,oBAAoB,SAAU;AAE1C,YAAM,qBAAqB,MAAM,oBAAoB,OAAO,UAAU,QAAQ,QAAQ;AAEtF,YAAM,OAAO,KAAK,UAAU,kBAAkB;AAE9C,aAAO,IAAI,SAAS,MAAM;QACxB,SAAS;UACP,gBAAgB;QAClB;MACF,CAAC;IACH,CAAC;AAEH,WAAO;EACT;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,aACwB;AACxB,SAAO,oBAAoB,WAAW;AACxC;AC/EO,SAAS,eAA+C,QAAW;AACxE,QAAM,SAAS,CACb,WAkBG;AACH,QAAI,UAAqB;AAEzB,QAAI,OAAO,aAAa;AACtB,gBAAU,QAAQ,IAAI,gBAAgB,OAAO,WAAW,CAAC;IAC3D;AAEA,QAAI,OAAO,OAAO;AAChB,YAAM,cAAc,OAAO,OAAO,UAAU,YAAY,SAAY,OAAO;AAC3E,gBAAU,QAAQ,IAAI,YAAY,WAAW,CAAC;IAChD;AAEA,WAAO;EACT;AAEA,SAAO;AACT;AAqBO,SAAS,WACd,QACwB;AACxB,SAAO,eAAe,MAAM;AAC9B;","names":["value","data","domain","url","AbortController","import_elysia","request","body","requestUrl"]}