{"version":3,"sources":["../src/converters/array.ts","../src/converters/boolean.ts","../src/converters/date.ts","../src/converters/number.ts","../src/converters/object.ts","../src/converters/string.ts"],"sourcesContent":["import { LocationQueryValue } from \"vue-router\";\nimport { ParamSerializationConfig } from \".\";\n\n// Slightly iffy typing with the `as` casts, but yolo.\n\nexport function arrayParam<TParam>(\n  elementConfig: ParamSerializationConfig<TParam>\n): ParamSerializationConfig<NonNullable<TParam>[] | undefined> {\n  return {\n    serialize: (values) => {\n      if (!values) {\n        return null;\n      }\n      return values.map(elementConfig.serialize) as LocationQueryValue[];\n    },\n    deserialize: (values) => {\n      if (values === null || values === undefined) {\n        return undefined;\n      }\n\n      if (!Array.isArray(values)) {\n        return [elementConfig.deserialize(values)] as NonNullable<TParam>[];\n      }\n\n      return values.map(elementConfig.deserialize) as NonNullable<TParam>[];\n    },\n  };\n}\n","import { ParamSerializationConfigBuilder } from \".\";\n\nexport const booleanParam: ParamSerializationConfigBuilder<\n  boolean | undefined\n> = () => ({\n  serialize: (value) => (typeof value === \"boolean\" ? value.toString() : null),\n  deserialize: (value) => {\n    if (value === \"true\") return true;\n    if (value === \"false\") return false;\n    return undefined;\n  },\n});\n","import { LocationQueryValue } from \"vue-router\";\nimport { ParamSerializationConfigBuilder } from \".\";\n\nexport enum DateParamType {\n  Date,\n  DateTime,\n}\n\ntype DateParamOptions = {\n  dateType: DateParamType;\n};\n\nfunction serialize(value: Date | undefined, options?: DateParamOptions) {\n  try {\n    const serializedValue = value?.toISOString();\n    return options?.dateType === DateParamType.Date\n      ? serializedValue?.substring(0, 10) ?? null\n      : serializedValue ?? null;\n  } catch {\n    return null;\n  }\n}\n\nfunction deserialize(\n  value: LocationQueryValue | LocationQueryValue[],\n  options?: DateParamOptions\n) {\n  const stringValue = value as string;\n\n  if (stringValue === null || stringValue === undefined) {\n    return undefined;\n  }\n\n  try {\n    const date = new Date(stringValue);\n    return isNaN(date.getTime()) ? undefined : date;\n  } catch {\n    return undefined;\n  }\n}\n\nexport const dateParam: ParamSerializationConfigBuilder<\n  Date | undefined,\n  DateParamOptions\n> = (options) => {\n  return {\n    serialize: (value) => serialize(value, options),\n    deserialize: (value) => deserialize(value, options),\n  };\n};\n","import { ParamSerializationConfigBuilder } from \".\";\n\nexport const numberParam: ParamSerializationConfigBuilder<\n  number | undefined\n> = () => ({\n  serialize: (value) => (Number.isFinite(value) ? `${value}` : null),\n  deserialize: (value) => {\n    try {\n      const parsedValue = Number.parseFloat(value as string);\n      return Number.isFinite(parsedValue) ? parsedValue : undefined;\n    } catch {\n      return undefined;\n    }\n  },\n});\n","import { ParamSerializationConfig } from \".\";\n\ntype ObjectParamOptions = {\n  encoding?: \"base64\" | \"json\";\n};\n\nexport function objectParam<TObject>(\n  options?: ObjectParamOptions\n): ParamSerializationConfig<TObject | undefined> {\n  return {\n    serialize: (value) => {\n      if (value === undefined || value === null || typeof value !== \"object\") {\n        return null;\n      }\n\n      const json = JSON.stringify(value);\n      switch (options?.encoding) {\n        case \"base64\":\n          const bytes = new TextEncoder().encode(json);\n          const base64 = btoa(String.fromCharCode(...bytes));\n          return base64;\n        case undefined:\n        case \"json\":\n          return json;\n      }\n    },\n    deserialize: (value) => {\n      if (value === null || Array.isArray(value)) {\n        return undefined;\n      }\n      let json = undefined;\n      try {\n        switch (options?.encoding) {\n          case \"base64\":\n            const bytes = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\n            const json = new TextDecoder().decode(bytes);\n            return JSON.parse(json);\n          case undefined:\n          case \"json\":\n            return JSON.parse(value);\n        }\n      } catch {\n        return undefined;\n      }\n    },\n  };\n}\n","import { ParamSerializationConfigBuilder } from \".\";\n\nexport const stringParam: ParamSerializationConfigBuilder<\n  string | undefined\n> = () => ({\n  serialize: (value) => value ?? null,\n  deserialize: (value) => value !== null && value !== undefined\n    ? `${value}`\n    : undefined\n});\n"],"mappings":"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","names":["DateParamType","json"]}