{"version":3,"file":"serialization.cjs","sources":["../../src/serialization.ts"],"sourcesContent":["import type { IR, LoadSubsetOptions } from '@tanstack/db'\n\n/**\n * Serializes LoadSubsetOptions into a stable, hashable format for query keys.\n * Includes where, orderBy, limit, and offset for pagination support.\n * Note: cursor expressions are not serialized as they are backend-specific.\n * @internal\n */\nexport function serializeLoadSubsetOptions(\n  options: LoadSubsetOptions | undefined,\n): string | undefined {\n  if (!options) {\n    return undefined\n  }\n\n  const result: Record<string, unknown> = {}\n\n  if (options.where) {\n    result.where = serializeExpression(options.where)\n  }\n\n  if (options.orderBy?.length) {\n    result.orderBy = options.orderBy.map((clause) => {\n      const baseOrderBy = {\n        expression: serializeExpression(clause.expression),\n        direction: clause.compareOptions.direction,\n        nulls: clause.compareOptions.nulls,\n        stringSort: clause.compareOptions.stringSort,\n      }\n\n      // Handle locale-specific options when stringSort is 'locale'\n      if (clause.compareOptions.stringSort === `locale`) {\n        return {\n          ...baseOrderBy,\n          locale: clause.compareOptions.locale,\n          localeOptions: clause.compareOptions.localeOptions,\n        }\n      }\n\n      return baseOrderBy\n    })\n  }\n\n  if (options.limit !== undefined) {\n    result.limit = options.limit\n  }\n\n  // Include offset for pagination support\n  if (options.offset !== undefined) {\n    result.offset = options.offset\n  }\n\n  return Object.keys(result).length === 0 ? undefined : JSON.stringify(result)\n}\n\n/**\n * Recursively serializes an IR expression for stable hashing\n * @internal\n */\nfunction serializeExpression(expr: IR.BasicExpression | undefined): unknown {\n  if (!expr) {\n    return null\n  }\n\n  switch (expr.type) {\n    case `val`:\n      return {\n        type: `val`,\n        value: serializeValue(expr.value),\n      }\n    case `ref`:\n      return {\n        type: `ref`,\n        path: [...expr.path],\n      }\n    case `func`:\n      return {\n        type: `func`,\n        name: expr.name,\n        args: expr.args.map((arg) => serializeExpression(arg)),\n      }\n    default:\n      return null\n  }\n}\n\n/**\n * Serializes special JavaScript values (undefined, NaN, Infinity, Date)\n * @internal\n */\nfunction serializeValue(value: unknown): unknown {\n  if (value === undefined) {\n    return { __type: `undefined` }\n  }\n\n  if (typeof value === `number`) {\n    if (Number.isNaN(value)) {\n      return { __type: `nan` }\n    }\n    if (value === Number.POSITIVE_INFINITY) {\n      return { __type: `infinity`, sign: 1 }\n    }\n    if (value === Number.NEGATIVE_INFINITY) {\n      return { __type: `infinity`, sign: -1 }\n    }\n  }\n\n  if (\n    value === null ||\n    typeof value === `string` ||\n    typeof value === `number` ||\n    typeof value === `boolean`\n  ) {\n    return value\n  }\n\n  if (value instanceof Date) {\n    return { __type: `date`, value: value.toJSON() }\n  }\n\n  if (Array.isArray(value)) {\n    return value.map((item) => serializeValue(item))\n  }\n\n  if (typeof value === `object`) {\n    return Object.fromEntries(\n      Object.entries(value as Record<string, unknown>).map(([key, val]) => [\n        key,\n        serializeValue(val),\n      ]),\n    )\n  }\n\n  return value\n}\n"],"names":[],"mappings":";;AAQO,SAAS,2BACd,SACoB;AACpB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAkC,CAAA;AAExC,MAAI,QAAQ,OAAO;AACjB,WAAO,QAAQ,oBAAoB,QAAQ,KAAK;AAAA,EAClD;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,UAAU,QAAQ,QAAQ,IAAI,CAAC,WAAW;AAC/C,YAAM,cAAc;AAAA,QAClB,YAAY,oBAAoB,OAAO,UAAU;AAAA,QACjD,WAAW,OAAO,eAAe;AAAA,QACjC,OAAO,OAAO,eAAe;AAAA,QAC7B,YAAY,OAAO,eAAe;AAAA,MAAA;AAIpC,UAAI,OAAO,eAAe,eAAe,UAAU;AACjD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,OAAO,eAAe;AAAA,UAC9B,eAAe,OAAO,eAAe;AAAA,QAAA;AAAA,MAEzC;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,UAAU,QAAW;AAC/B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAGA,MAAI,QAAQ,WAAW,QAAW;AAChC,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAEA,SAAO,OAAO,KAAK,MAAM,EAAE,WAAW,IAAI,SAAY,KAAK,UAAU,MAAM;AAC7E;AAMA,SAAS,oBAAoB,MAA+C;AAC1E,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,UAAQ,KAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,eAAe,KAAK,KAAK;AAAA,MAAA;AAAA,IAEpC,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,CAAC,GAAG,KAAK,IAAI;AAAA,MAAA;AAAA,IAEvB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,MAAM,KAAK,KAAK,IAAI,CAAC,QAAQ,oBAAoB,GAAG,CAAC;AAAA,MAAA;AAAA,IAEzD;AACE,aAAO;AAAA,EAAA;AAEb;AAMA,SAAS,eAAe,OAAyB;AAC/C,MAAI,UAAU,QAAW;AACvB,WAAO,EAAE,QAAQ,YAAA;AAAA,EACnB;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,MAAM,KAAK,GAAG;AACvB,aAAO,EAAE,QAAQ,MAAA;AAAA,IACnB;AACA,QAAI,UAAU,OAAO,mBAAmB;AACtC,aAAO,EAAE,QAAQ,YAAY,MAAM,EAAA;AAAA,IACrC;AACA,QAAI,UAAU,OAAO,mBAAmB;AACtC,aAAO,EAAE,QAAQ,YAAY,MAAM,GAAA;AAAA,IACrC;AAAA,EACF;AAEA,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO,EAAE,QAAQ,QAAQ,OAAO,MAAM,SAAO;AAAA,EAC/C;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC;AAAA,EACjD;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAgC,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AAAA,QACnE;AAAA,QACA,eAAe,GAAG;AAAA,MAAA,CACnB;AAAA,IAAA;AAAA,EAEL;AAEA,SAAO;AACT;;"}