{"version":3,"sources":["../../src/query/server.ts","../../src/query/params.ts","../../src/query/parsers.ts"],"sourcesContent":["/**\n * Farm.js Server-Side Query State Management\n *\n * Server-side utilities for parsing and handling URL search parameters\n */\n\nimport type { Parser } from \"./parsers\";\nexport { parseRouteParams, loadRouteParams, type RouteParamsInput } from \"./params\";\n\nexport {\n  asString,\n  asInteger,\n  asFloat,\n  asBoolean,\n  asArrayOf,\n  asJson,\n  asIsoDate,\n  asIsoDateTime,\n  createParser,\n  type ArrayParserOptions,\n  type Parser,\n  type inferParserType,\n} from \"./parsers\";\n\nexport type SearchParams = Record<string, string | string[] | undefined>;\n\n/**\n * Server-side utility to load and parse search parameters\n *\n * @example\n * ```tsx\n * // In a server component\n * import { loadSearchParams, parseAsString, parseAsInteger } from 'farm/query/server';\n *\n * export default async function MyPage({ searchParams }: PageProps) {\n *   const params = await loadSearchParams(searchParams, {\n *     search: parseAsString.withDefault!(''),\n *     page: parseAsInteger.withDefault!(1),\n *   });\n *\n *   return <div>Search: {params.search}, Page: {params.page}</div>;\n * }\n * ```\n */\nexport async function loadSearchParams<T extends Record<string, Parser<any>>>(\n  searchParams: Promise<URLSearchParams | Record<string, string | string[] | undefined>>,\n  parsers: T,\n): Promise<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> }> {\n  const params = await searchParams;\n\n  let urlParams: URLSearchParams;\n  if (params instanceof URLSearchParams) {\n    urlParams = params;\n  } else {\n    urlParams = new URLSearchParams();\n    for (const [key, value] of Object.entries(params)) {\n      if (Array.isArray(value)) {\n        for (const v of value) {\n          urlParams.append(key, v);\n        }\n      } else if (value !== undefined && value !== null) {\n        urlParams.set(key, String(value));\n      }\n    }\n  }\n\n  const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n  for (const [key, parser] of Object.entries(parsers)) {\n    // Read every value, not just the first. A repeated key is joined with commas,\n    // the format `asArrayOf` parses and its `serialize` writes, so a repeated\n    // parameter round-trips. A single value is passed through untouched, so a\n    // value that already contains commas keeps its meaning.\n    const values = urlParams.getAll(key);\n    const value = values.length > 1 ? values.join(\",\") : (values[0] ?? null);\n\n    if (value !== null && value !== \"\") {\n      try {\n        result[key as keyof T] = parser.parse(value);\n      } catch (error) {\n        console.error(`Failed to parse parameter \"${key}\":`, error);\n        throw error;\n      }\n    } else {\n      result[key as keyof T] = parser.parse(\"\");\n    }\n  }\n\n  return result;\n}\n\n/**\n * Creates pagination metadata for server components.\n *\n * @param searchParams The search parameters promise.\n * @param options Configuration options for pagination.\n * @returns Pagination metadata.\n */\nexport async function createPaginationMeta(\n  searchParams: Promise<URLSearchParams | Record<string, string | string[] | undefined>>,\n  options: {\n    totalItems: number;\n    itemsPerPage?: number;\n    pageParam?: string;\n  },\n) {\n  const params = await searchParams;\n\n  let urlParams: URLSearchParams;\n  if (params instanceof URLSearchParams) {\n    urlParams = params;\n  } else {\n    urlParams = new URLSearchParams();\n    for (const [key, value] of Object.entries(params)) {\n      if (Array.isArray(value)) {\n        for (const v of value) {\n          urlParams.append(key, v);\n        }\n      } else if (value !== undefined && value !== null) {\n        urlParams.set(key, String(value));\n      }\n    }\n  }\n\n  const pageParam = options.pageParam || \"page\";\n  const itemsPerPage = options.itemsPerPage ?? 10;\n  assertPaginationInteger(options.totalItems, \"totalItems\", true);\n  assertPaginationInteger(itemsPerPage, \"itemsPerPage\", false);\n\n  const requestedPage = parsePositivePaginationInteger(urlParams.get(pageParam));\n  const currentPage =\n    requestedPage !== null && Number.isSafeInteger((requestedPage - 1) * itemsPerPage)\n      ? requestedPage\n      : 1;\n\n  const totalPages = Math.ceil(options.totalItems / itemsPerPage);\n  const offset = (currentPage - 1) * itemsPerPage;\n  const limit = itemsPerPage;\n\n  return {\n    currentPage,\n    itemsPerPage,\n    totalItems: options.totalItems,\n    totalPages,\n    offset,\n    limit,\n    hasNextPage: currentPage < totalPages,\n    hasPreviousPage: currentPage > 1,\n  };\n}\n\nfunction parsePositivePaginationInteger(value: string | null): number | null {\n  if (!value || !/^[+]?[0-9]+$/.test(value)) return null;\n  const parsed = Number(value);\n  return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : null;\n}\n\nfunction assertPaginationInteger(value: number, name: string, allowZero: boolean): void {\n  const minimum = allowZero ? 0 : 1;\n  if (!Number.isSafeInteger(value) || value < minimum) {\n    throw new RangeError(\n      `Pagination ${name} must be a safe integer greater than or equal to ${minimum}.`,\n    );\n  }\n}\n","import type { Parser } from \"./parsers\";\n\nexport type RouteParamsInput =\n  | Record<string, string | undefined>\n  | URLSearchParams\n  | Promise<Record<string, string | undefined> | URLSearchParams>;\n\nfunction normalizeParams(input: Record<string, string | undefined> | URLSearchParams) {\n  if (input instanceof URLSearchParams) {\n    const params: Record<string, string | undefined> = {};\n    input.forEach((value, key) => {\n      params[key] = value;\n    });\n    return params;\n  }\n  return input;\n}\n\nexport async function loadRouteParams<T extends Record<string, Parser<any>>>(\n  input: RouteParamsInput,\n  parsers: T,\n  options: { strict?: boolean } = {},\n): Promise<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> }> {\n  const resolved = await Promise.resolve(input);\n  const params = normalizeParams(resolved);\n  const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n  for (const [key, parser] of Object.entries(parsers)) {\n    const raw = params[key] ?? \"\";\n    const parsed = parser.parse(raw);\n    if (parsed === null && options.strict) {\n      throw new Error(`Failed to parse route param \"${key}\" with value \"${raw}\"`);\n    }\n    result[key as keyof T] = parsed as ReturnType<T[typeof key][\"parse\"]>;\n  }\n\n  return result;\n}\n\nexport function parseRouteParams<T extends Record<string, Parser<any>>>(\n  input: Record<string, string | undefined> | URLSearchParams,\n  parsers: T,\n  options: { strict?: boolean } = {},\n): { [K in keyof T]: ReturnType<T[K][\"parse\"]> } {\n  const params = normalizeParams(input);\n  const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n  for (const [key, parser] of Object.entries(parsers)) {\n    const raw = params[key] ?? \"\";\n    const parsed = parser.parse(raw);\n    if (parsed === null && options.strict) {\n      throw new Error(`Failed to parse route param \"${key}\" with value \"${raw}\"`);\n    }\n    result[key as keyof T] = parsed as ReturnType<T[typeof key][\"parse\"]>;\n  }\n\n  return result;\n}\n","/**\n * Farm.js Query State Parsers\n *\n * Shared parsers that can be used in both client and server contexts\n */\n\nexport interface Parser<T> {\n  parse: (value: string) => T | null;\n  serialize: (value: T) => string;\n  withDefault?: (defaultValue: T) => Parser<T>;\n}\n\nconst INTEGER_PATTERN = /^[+-]?\\d+$/;\nconst FLOAT_PATTERN = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\nconst ISO_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst ISO_DATE_TIME_PATTERN =\n  /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction parseInteger(value: string): number | null {\n  if (!INTEGER_PATTERN.test(value)) return null;\n  const parsed = Number(value);\n  return Number.isSafeInteger(parsed) ? parsed : null;\n}\n\nfunction parseFloatValue(value: string): number | null {\n  if (!FLOAT_PATTERN.test(value)) return null;\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n  if (month < 1 || month > 12 || day < 1) return false;\n  const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n  const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n  return day <= daysInMonth[month - 1];\n}\n\nfunction parseIsoDate(value: string): Date | null {\n  const match = value.match(ISO_DATE_PATTERN);\n  if (!match) return null;\n\n  const year = Number(match[1]);\n  const month = Number(match[2]);\n  const day = Number(match[3]);\n  if (!isValidCalendarDate(year, month, day)) return null;\n\n  const date = new Date(0);\n  date.setUTCHours(0, 0, 0, 0);\n  date.setUTCFullYear(year, month - 1, day);\n  return date;\n}\n\nfunction parseIsoDateTime(value: string): Date | null {\n  const match = value.match(ISO_DATE_TIME_PATTERN);\n  if (!match) return null;\n\n  const year = Number(match[1]);\n  const month = Number(match[2]);\n  const day = Number(match[3]);\n  const hour = Number(match[4]);\n  const minute = Number(match[5]);\n  const second = Number(match[6]);\n  const timezone = match[7];\n  if (!isValidCalendarDate(year, month, day) || hour > 23 || minute > 59 || second > 59) {\n    return null;\n  }\n\n  if (timezone !== \"Z\") {\n    const [offsetHour, offsetMinute] = timezone.slice(1).split(\":\").map(Number);\n    if (offsetHour > 23 || offsetMinute > 59) return null;\n  }\n\n  const date = new Date(value);\n  return Number.isFinite(date.getTime()) ? date : null;\n}\n\n// String parser\nexport const asString: Parser<string> = {\n  parse: (value: string) => (value && value.trim()) || null,\n  serialize: (value: string) => value,\n  withDefault: (defaultValue: string) => ({\n    parse: (value: string) => (value && value.trim()) || defaultValue,\n    serialize: (value: string) => value || defaultValue,\n  }),\n};\n\n// Integer parser\nexport const asInteger: Parser<number> = {\n  parse: parseInteger,\n  serialize: (value: number) => value.toString(),\n  withDefault: (defaultValue: number) => ({\n    parse: (value: string) => parseInteger(value) ?? defaultValue,\n    serialize: (value: number) => value.toString(),\n  }),\n};\n\n// Float parser\nexport const asFloat: Parser<number> = {\n  parse: parseFloatValue,\n  serialize: (value: number) => value.toString(),\n  withDefault: (defaultValue: number) => ({\n    parse: (value: string) => parseFloatValue(value) ?? defaultValue,\n    serialize: (value: number) => value.toString(),\n  }),\n};\n\n// Boolean parser\nexport const asBoolean: Parser<boolean> = {\n  parse: (value: string) => {\n    if (value === \"true\") return true;\n    if (value === \"false\") return false;\n    return null;\n  },\n  serialize: (value: boolean) => value.toString(),\n  withDefault: (defaultValue: boolean) => ({\n    parse: (value: string) => {\n      if (value === \"true\") return true;\n      if (value === \"false\") return false;\n      return defaultValue;\n    },\n    serialize: (value: boolean) => value.toString(),\n  }),\n};\n\n// Array parser\nconst STRUCTURED_ARRAY_PREFIX = \"~farm-array:v1:\";\nexport interface ArrayParserOptions {\n  /** Preserve comma URLs by default; opt in when item delimiters must round-trip. */\n  format?: \"comma\" | \"structured\";\n}\n\nfunction parseArrayItems(value: string, structured: boolean): string[] {\n  if (structured && value.startsWith(STRUCTURED_ARRAY_PREFIX)) {\n    try {\n      const parsed = JSON.parse(value.slice(STRUCTURED_ARRAY_PREFIX.length));\n      if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n        return parsed;\n      }\n    } catch {\n      // Keep accepting legacy values that happen to begin with the prefix.\n    }\n  }\n\n  return value\n    .split(\",\")\n    .filter(Boolean)\n    .map((item) => item.trim());\n}\n\nfunction serializeArrayItems(values: string[], structured: boolean): string {\n  if (!structured) return values.join(\",\");\n\n  const needsStructuredEncoding = values.some(\n    (value, index) =>\n      value === \"\" ||\n      value.trim() !== value ||\n      value.includes(\",\") ||\n      (index === 0 && value.startsWith(STRUCTURED_ARRAY_PREFIX)),\n  );\n  return needsStructuredEncoding\n    ? `${STRUCTURED_ARRAY_PREFIX}${JSON.stringify(values)}`\n    : values.join(\",\");\n}\n\nexport function asArrayOf<T>(itemParser: Parser<T>, options: ArrayParserOptions = {}): Parser<T[]> {\n  const structured = options.format === \"structured\";\n  const parse = (value: string): T[] | null => {\n    if (!value) return null;\n    return parseArrayItems(value, structured)\n      .map((item) => itemParser.parse(item))\n      .filter((item) => item !== null) as T[];\n  };\n  const serialize = (value: T[]) =>\n    serializeArrayItems(\n      value.map((item) => itemParser.serialize(item)),\n      structured,\n    );\n\n  return {\n    parse,\n    serialize,\n    withDefault: (defaultValue: T[]) => ({\n      parse: (value: string) => parse(value) ?? defaultValue,\n      serialize,\n    }),\n  };\n}\n\n// JSON parser\nexport function asJson<T>(): Parser<T> {\n  return {\n    parse: (value: string) => {\n      try {\n        return JSON.parse(value);\n      } catch {\n        return null;\n      }\n    },\n    serialize: (value: T) => JSON.stringify(value),\n    withDefault: (defaultValue: T) => ({\n      parse: (value: string) => {\n        try {\n          return JSON.parse(value);\n        } catch {\n          return defaultValue;\n        }\n      },\n      serialize: (value: T) => JSON.stringify(value),\n    }),\n  };\n}\n\n// ISO Date parser\nexport const asIsoDate: Parser<Date> = {\n  parse: parseIsoDate,\n  serialize: (value: Date) => value.toISOString().slice(0, 10),\n  withDefault: (defaultValue: Date) => ({\n    parse: (value: string) => parseIsoDate(value) ?? defaultValue,\n    serialize: (value: Date) => value.toISOString().slice(0, 10),\n  }),\n};\n\n// ISO DateTime parser\nexport const asIsoDateTime: Parser<Date> = {\n  parse: parseIsoDateTime,\n  serialize: (value: Date) => value.toISOString(),\n  withDefault: (defaultValue: Date) => ({\n    parse: (value: string) => parseIsoDateTime(value) ?? defaultValue,\n    serialize: (value: Date) => value.toISOString(),\n  }),\n};\n\n// Custom parser creator\nexport function createParser<T>(config: {\n  parse: (value: string) => T | null;\n  serialize: (value: T) => string;\n}): Parser<T> {\n  return {\n    parse: config.parse,\n    serialize: config.serialize,\n    withDefault: (defaultValue: T) => ({\n      parse: (value: string) => config.parse(value) ?? defaultValue,\n      serialize: config.serialize,\n    }),\n  };\n}\n\n// Type inference helper\nexport type inferParserType<T> = T extends Parser<infer U> ? U : never;\n"],"mappings":"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","names":[]}