{"version":3,"sources":["../src/api/transport.ts","../src/api/route-pattern.ts"],"sourcesContent":["export type MultipartField = string | number | boolean | bigint | Blob | Date | null | undefined;\n\nexport type MultipartValues = Record<string, MultipartField | readonly MultipartField[]>;\n\n/**\n * A real FormData value that retains the submitted value shape for generated\n * API-client inference.\n */\nexport type TypedFormData<TValues> = FormData & {\n  readonly __farmMultipartInput: TValues;\n};\n\nexport type MultipartSchema<TSchema> = TSchema & {\n  readonly __farmMultipartSchema: true;\n};\n\nexport type FarmStreamResponse<TItem> = Response & {\n  readonly __farmStreamItem: TItem;\n};\n\nexport interface FarmAPIStream<TItem> extends AsyncIterable<TItem> {\n  readonly response: Response;\n  cancel(reason?: unknown): Promise<void>;\n}\n\ntype SchemaLike = {\n  parse(data: unknown): unknown;\n};\n\n/**\n * Mark a body schema as multipart. The handler still receives the schema's\n * parsed object; generated clients require `toFormData(...)` for the request.\n */\nexport function multipart<TSchema extends SchemaLike>(schema: TSchema): MultipartSchema<TSchema> {\n  if (!Object.isExtensible(schema) && !isMultipartSchema(schema)) {\n    throw new TypeError(\"multipart() requires an extensible schema object\");\n  }\n\n  if (!isMultipartSchema(schema)) {\n    Object.defineProperty(schema, \"__farmMultipartSchema\", {\n      value: true,\n      configurable: false,\n      enumerable: false,\n      writable: false,\n    });\n  }\n\n  return schema as MultipartSchema<TSchema>;\n}\n\nexport function isMultipartSchema(value: unknown): value is MultipartSchema<SchemaLike> {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    (value as { __farmMultipartSchema?: unknown }).__farmMultipartSchema === true &&\n    typeof (value as SchemaLike).parse === \"function\"\n  );\n}\n\n/**\n * Encode a typed object as multipart FormData without converting File or Blob\n * values to JSON or base64.\n */\nexport function toFormData<TValues extends MultipartValues>(\n  values: TValues,\n): TypedFormData<TValues> {\n  const formData = new FormData();\n\n  for (const [key, value] of Object.entries(values)) {\n    if (isUnsafeFormKey(key)) continue;\n    if (Array.isArray(value)) {\n      for (const entry of value) appendFormValue(formData, key, entry);\n      continue;\n    }\n    appendFormValue(formData, key, value as MultipartField);\n  }\n\n  return formData as TypedFormData<TValues>;\n}\n\n/**\n * Stream JSON values as newline-delimited JSON. Each source value becomes one\n * independently decodable item instead of buffering the whole response.\n */\nexport function jsonStream<TItem>(\n  source: AsyncIterable<TItem> | Iterable<TItem>,\n  init: ResponseInit = {},\n): FarmStreamResponse<TItem> {\n  const iterator = toAsyncIterator(source);\n  const encoder = new TextEncoder();\n  let finished = false;\n  let cleanup: Promise<unknown> | undefined;\n  const closeSource = (reason?: unknown) =>\n    (cleanup ??= Promise.resolve().then(() => iterator.return?.(reason)));\n\n  const body = new ReadableStream<Uint8Array>(\n    {\n      async pull(controller) {\n        if (finished) return;\n\n        try {\n          const next = await iterator.next();\n          if (finished) return;\n          if (next.done) {\n            finished = true;\n            controller.close();\n            return;\n          }\n          controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}\\n`));\n        } catch (error) {\n          if (finished) return;\n          finished = true;\n          try {\n            await closeSource(error);\n          } catch {\n            // Preserve the serialization/source error that failed the response stream.\n          }\n          controller.error(error);\n        }\n      },\n      async cancel(reason) {\n        finished = true;\n        await closeSource(reason);\n      },\n    },\n    {\n      // Do not read the next application event until the response consumer\n      // requests another chunk.\n      highWaterMark: 0,\n    },\n  );\n  const headers = new Headers(init.headers);\n  if (!headers.has(\"content-type\")) {\n    headers.set(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n  }\n  headers.set(\"cache-control\", headers.get(\"cache-control\") ?? \"no-store\");\n\n  return new Response(body, {\n    ...init,\n    headers,\n  }) as FarmStreamResponse<TItem>;\n}\n\nexport function isJSONStreamResponse(response: { headers?: Pick<Headers, \"get\"> | null }): boolean {\n  const contentType = response.headers?.get?.(\"content-type\")?.toLowerCase() ?? \"\";\n  return contentType.includes(\"application/x-ndjson\") || contentType.includes(\"application/ndjson\");\n}\n\n/**\n * Decode a Farm JSON stream lazily. The response body is read only as the\n * consumer advances the async iterator, preserving fetch backpressure.\n */\nexport function readJSONStream<TItem>(response: Response): FarmAPIStream<TItem> {\n  if (!response.body) {\n    throw new TypeError(\"Cannot read a JSON stream response without a body\");\n  }\n\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = \"\";\n  let completed = false;\n  let cancelled = false;\n  let claimed = false;\n  let released = false;\n\n  const releaseReader = () => {\n    if (released) return;\n    released = true;\n    reader.releaseLock();\n  };\n  const parseLine = async (line: string) => {\n    try {\n      return JSON.parse(line) as TItem;\n    } catch (error) {\n      completed = true;\n      buffer = \"\";\n      // A tee branch can wait for an unread sibling during cancellation. The\n      // parse failure is already known and must not wait for producer cleanup.\n      void reader.cancel(error).catch(() => {});\n      releaseReader();\n      throw error;\n    }\n  };\n\n  const readNext = async (): Promise<IteratorResult<TItem>> => {\n    while (true) {\n      if (cancelled) return { done: true, value: undefined };\n      const lineEnd = buffer.indexOf(\"\\n\");\n      if (lineEnd >= 0) {\n        const line = buffer.slice(0, lineEnd).trim();\n        buffer = buffer.slice(lineEnd + 1);\n        if (!line) continue;\n        return { done: false, value: await parseLine(line) };\n      }\n\n      if (completed) {\n        const line = buffer.trim();\n        buffer = \"\";\n        if (!line) {\n          releaseReader();\n          return { done: true, value: undefined };\n        }\n        return { done: false, value: await parseLine(line) };\n      }\n\n      let chunk: ReadableStreamReadResult<Uint8Array>;\n      try {\n        chunk = await reader.read();\n      } catch (error) {\n        if (cancelled) return { done: true, value: undefined };\n        completed = true;\n        buffer = \"\";\n        releaseReader();\n        throw error;\n      }\n      if (cancelled) return { done: true, value: undefined };\n      completed = chunk.done;\n      buffer += decoder.decode(chunk.value, { stream: !chunk.done });\n    }\n  };\n\n  let readQueue = Promise.resolve();\n  const iterator: AsyncIterator<TItem> = {\n    next() {\n      const result = readQueue.then(readNext);\n      // A failed read must not poison subsequent operations on this iterator.\n      readQueue = result.then(\n        () => {},\n        () => {},\n      );\n      return result;\n    },\n    async return() {\n      cancelled = true;\n      completed = true;\n      buffer = \"\";\n      if (!released) {\n        try {\n          await reader.cancel();\n        } finally {\n          releaseReader();\n        }\n      }\n      return { done: true, value: undefined };\n    },\n  };\n\n  return {\n    response,\n    async cancel(reason) {\n      // Cancellation must interrupt the active reader, not wait in its queue.\n      cancelled = true;\n      completed = true;\n      buffer = \"\";\n      if (!released) {\n        try {\n          await reader.cancel(reason);\n        } finally {\n          releaseReader();\n        }\n      }\n    },\n    [Symbol.asyncIterator]() {\n      if (claimed) {\n        throw new TypeError(\"Farm API streams can only be consumed once\");\n      }\n      claimed = true;\n      return iterator;\n    },\n  };\n}\n\nexport function isFarmAPIStream(value: unknown): value is FarmAPIStream<unknown> {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"response\" in value &&\n    typeof (value as FarmAPIStream<unknown>).cancel === \"function\" &&\n    typeof (value as FarmAPIStream<unknown>)[Symbol.asyncIterator] === \"function\"\n  );\n}\n\nfunction appendFormValue(formData: FormData, key: string, value: MultipartField): void {\n  if (value === undefined) return;\n  if (value === null) {\n    formData.append(key, \"\");\n    return;\n  }\n  if (value instanceof Blob) {\n    formData.append(key, value);\n    return;\n  }\n  if (value instanceof Date) {\n    formData.append(key, value.toISOString());\n    return;\n  }\n  formData.append(key, String(value));\n}\n\nfunction isUnsafeFormKey(key: string): boolean {\n  return key === \"__proto__\" || key === \"constructor\" || key === \"prototype\";\n}\n\nfunction toAsyncIterator<TItem>(\n  source: AsyncIterable<TItem> | Iterable<TItem>,\n): AsyncIterator<TItem> {\n  if (Symbol.asyncIterator in Object(source)) {\n    return (source as AsyncIterable<TItem>)[Symbol.asyncIterator]();\n  }\n\n  const iterator = (source as Iterable<TItem>)[Symbol.iterator]();\n  return {\n    next: async () => iterator.next(),\n    return: iterator.return ? async (value?: unknown) => iterator.return!(value) : undefined,\n  };\n}\n","import { compareRouteSpecificity, type RouteSegmentSpecificity } from \"../routing/specificity\";\n\nexport type APIRouteParamValue = string | string[];\nexport type APIRouteParams = Record<string, APIRouteParamValue>;\n\nexport interface APIRouteMatch<T extends { path: string }> {\n  route: T;\n  params: APIRouteParams;\n}\n\nexport function matchAPIRoute<T extends { path: string }>(\n  routes: Map<string, T>,\n  pathname: string,\n): APIRouteMatch<T> | null {\n  const exactRoute = routes.get(pathname);\n  if (exactRoute) {\n    return { route: exactRoute, params: {} };\n  }\n\n  const normalizedPathname = normalizePathname(pathname);\n  if (normalizedPathname !== pathname) {\n    const normalizedRoute = routes.get(normalizedPathname);\n    if (normalizedRoute) {\n      return { route: normalizedRoute, params: {} };\n    }\n  }\n\n  let bestMatch: APIRouteMatch<T> | null = null;\n  let bestSpecificity: RouteSegmentSpecificity[] | null = null;\n\n  for (const route of routes.values()) {\n    const params = matchRoutePath(route.path, pathname);\n    if (!params) continue;\n\n    const specificity = getAPIRouteSpecificity(route.path);\n    if (bestSpecificity === null || compareRouteSpecificity(specificity, bestSpecificity) < 0) {\n      bestMatch = { route, params };\n      bestSpecificity = specificity;\n    }\n  }\n\n  return bestMatch;\n}\n\nfunction matchRoutePath(routePath: string, pathname: string): APIRouteParams | null {\n  const routeSegments = getPathSegments(routePath);\n  const pathnameSegments = getPathSegments(pathname);\n  const params: APIRouteParams = {};\n  let pathIndex = 0;\n\n  for (const routeSegment of routeSegments) {\n    const dynamicSegment = parseDynamicSegment(routeSegment);\n\n    if (dynamicSegment?.catchAll) {\n      const remainingSegments = pathnameSegments.slice(pathIndex).map(decodePathSegment);\n      if (remainingSegments.length === 0 && !dynamicSegment.optional) {\n        return null;\n      }\n      if (remainingSegments.length > 0) {\n        params[dynamicSegment.name] = remainingSegments;\n      }\n      pathIndex = pathnameSegments.length;\n      continue;\n    }\n\n    const pathnameSegment = pathnameSegments[pathIndex];\n    if (pathnameSegment === undefined) {\n      return null;\n    }\n\n    if (dynamicSegment) {\n      params[dynamicSegment.name] = decodePathSegment(pathnameSegment);\n      pathIndex++;\n      continue;\n    }\n\n    if (decodePathSegment(routeSegment) !== decodePathSegment(pathnameSegment)) {\n      return null;\n    }\n\n    pathIndex++;\n  }\n\n  return pathIndex === pathnameSegments.length ? params : null;\n}\n\nfunction getPathSegments(pathname: string): string[] {\n  return normalizePathname(pathname)\n    .split(\"/\")\n    .filter((segment) => segment.length > 0);\n}\n\nfunction getAPIRouteSpecificity(routePath: string): RouteSegmentSpecificity[] {\n  return getPathSegments(routePath).map((segment) => {\n    const dynamic = parseDynamicSegment(segment);\n    if (!dynamic) return \"static\";\n    if (!dynamic.catchAll) return \"dynamic\";\n    return dynamic.optional ? \"optional-catch-all\" : \"catch-all\";\n  });\n}\n\nfunction normalizePathname(pathname: string): string {\n  if (pathname.length > 1 && pathname.endsWith(\"/\")) {\n    return pathname.replace(/\\/+$/, \"\");\n  }\n\n  return pathname;\n}\n\nexport function parseDynamicSegment(\n  segment: string,\n): { name: string; catchAll: boolean; optional: boolean } | null {\n  const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n  if (optionalCatchAll?.[1]) {\n    return { name: optionalCatchAll[1], catchAll: true, optional: true };\n  }\n\n  const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n  if (catchAll?.[1]) {\n    return { name: catchAll[1], catchAll: true, optional: false };\n  }\n\n  const dynamic = segment.match(/^\\[(.+)\\]$/);\n  if (dynamic?.[1]) {\n    return { name: dynamic[1], catchAll: false, optional: false };\n  }\n\n  return null;\n}\n\nfunction decodePathSegment(segment: string): string {\n  try {\n    return decodeURIComponent(segment);\n  } catch {\n    return segment;\n  }\n}\n"],"mappings":"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","names":[]}