{"version":3,"sources":["../src/core/useQueryParam.ts","../src/plugin/config.ts","../src/core/withDefault.ts","../src/plugin/index.ts"],"sourcesContent":["import { Ref, computed, inject } from \"vue\";\nimport { LocationQuery, useRoute, useRouter } from \"vue-router\";\nimport { ParamSerializationConfig } from \"../converters\";\nimport { ProvideInterface, QueryParamUpdate } from \"../plugin\";\nimport { PROVIDE_KEY } from \"../plugin/config\";\n\nfunction mergeUpdates(updates: QueryParamUpdate[]) {\n  return updates.reduce((result, update) => {\n    return {\n      ...result,\n      [update.name]: update.value,\n    };\n  }, {} as LocationQuery);\n}\n\nexport function useQueryParam<TParam>(\n  name: string,\n  { serialize, deserialize }: ParamSerializationConfig<TParam>\n): Ref<TParam> {\n  const router = useRouter();\n  const route = useRoute();\n  const plugin = inject<ProvideInterface>(PROVIDE_KEY);\n\n  async function updateUrl(updates: QueryParamUpdate[]) {\n    const mergedUpdates = mergeUpdates(updates);\n    const mergedQuery = { ...route.query, ...mergedUpdates } as LocationQuery;\n    const nullProperties = Object.entries(mergedQuery)\n      .filter(([_, value]) => value === null)\n      .map(([key, _]) => key);\n\n    nullProperties.forEach((key) => delete mergedQuery[key]);\n\n    await router.replace({\n      query: mergedQuery,\n    });\n  }\n\n  function setQueryParam(value: TParam | undefined) {\n    const serializedValue = serialize(value);\n    plugin?.queueUpdate({ name, value: serializedValue }, updateUrl);\n  }\n\n  return computed({\n    get: () => deserialize(route.query[name]),\n    set: (value: TParam | undefined) => setQueryParam(value),\n  });\n}\n","export const PROVIDE_KEY = \"vue-use-query-param\";\n","import { ParamSerializationConfig } from \"../converters\";\n\nexport function withDefault<TParam>(\n  { serialize, deserialize }: ParamSerializationConfig<TParam>,\n  defaultValue: NonNullable<TParam>\n): ParamSerializationConfig<NonNullable<TParam>> {\n  return {\n    serialize,\n    deserialize: (value) => deserialize(value) ?? defaultValue,\n  };\n}\n","import { Plugin, ref } from \"vue\";\nimport { LocationQueryValue } from \"vue-router\";\nimport { PROVIDE_KEY } from \"./config\";\n\ntype UseQueryParamPluginOptions = {\n  debounceDelay?: number;\n};\n\nexport type QueryParamUpdate = {\n  name: string;\n  value: LocationQueryValue | LocationQueryValue[];\n};\n\nexport type ProvideInterface = {\n  queueUpdate: (\n    update: QueryParamUpdate,\n    updateUrl: (updates: QueryParamUpdate[]) => Promise<void>\n  ) => void;\n};\n\nexport const useQueryParamPlugin: Plugin<UseQueryParamPluginOptions> = {\n  install: (app, options) => {\n    const queue = ref<QueryParamUpdate[]>([]);\n    const timeoutRef = ref<number | null>(null);\n\n    function queueUpdate(\n      update: QueryParamUpdate,\n      urlUpdate: (updates: QueryParamUpdate[]) => Promise<void>\n    ) {\n      if (timeoutRef.value) {\n        clearTimeout(timeoutRef.value);\n      }\n\n      queue.value.push(update);\n\n      timeoutRef.value = setTimeout(async () => {\n        await urlUpdate(queue.value);\n        queue.value = [];\n        timeoutRef.value = null;\n      }, options.debounceDelay ?? 0);\n    }\n\n    app.provide<ProvideInterface>(PROVIDE_KEY, { queueUpdate });\n  },\n};\n"],"mappings":";;;;;;;;;;;AAAA,SAAc,UAAU,cAAc;AACtC,SAAwB,UAAU,iBAAiB;;;ACD5C,IAAM,cAAc;;;ADM3B,SAAS,aAAa,SAA6B;AACjD,SAAO,QAAQ,OAAO,CAAC,QAAQ,WAAW;AACxC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,CAAC,OAAO,IAAI,GAAG,OAAO;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,CAAkB;AACxB;AAEO,SAAS,cACd,MACA,EAAE,WAAW,YAAY,GACZ;AACb,QAAM,SAAS,UAAU;AACzB,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,OAAyB,WAAW;AAEnD,iBAAe,UAAU,SAA6B;AACpD,UAAM,gBAAgB,aAAa,OAAO;AAC1C,UAAM,cAAc,EAAE,GAAG,MAAM,OAAO,GAAG,cAAc;AACvD,UAAM,iBAAiB,OAAO,QAAQ,WAAW,EAC9C,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,UAAU,IAAI,EACrC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG;AAExB,mBAAe,QAAQ,CAAC,QAAQ,OAAO,YAAY,GAAG,CAAC;AAEvD,UAAM,OAAO,QAAQ;AAAA,MACnB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,OAA2B;AAChD,UAAM,kBAAkB,UAAU,KAAK;AACvC,qCAAQ,YAAY,EAAE,MAAM,OAAO,gBAAgB,GAAG;AAAA,EACxD;AAEA,SAAO,SAAS;AAAA,IACd,KAAK,MAAM,YAAY,MAAM,MAAM,IAAI,CAAC;AAAA,IACxC,KAAK,CAAC,UAA8B,cAAc,KAAK;AAAA,EACzD,CAAC;AACH;;;AE5CO,SAAS,YACd,EAAE,WAAW,YAAY,GACzB,cAC+C;AAC/C,SAAO;AAAA,IACL;AAAA,IACA,aAAa,CAAC,UAAO;AARzB;AAQ4B,+BAAY,KAAK,MAAjB,YAAsB;AAAA;AAAA,EAChD;AACF;;;ACVA,SAAiB,WAAW;AAoBrB,IAAM,sBAA0D;AAAA,EACrE,SAAS,CAAC,KAAK,YAAY;AACzB,UAAM,QAAQ,IAAwB,CAAC,CAAC;AACxC,UAAM,aAAa,IAAmB,IAAI;AAE1C,aAAS,YACP,QACA,WACA;AA5BN;AA6BM,UAAI,WAAW,OAAO;AACpB,qBAAa,WAAW,KAAK;AAAA,MAC/B;AAEA,YAAM,MAAM,KAAK,MAAM;AAEvB,iBAAW,QAAQ,WAAW,YAAY;AACxC,cAAM,UAAU,MAAM,KAAK;AAC3B,cAAM,QAAQ,CAAC;AACf,mBAAW,QAAQ;AAAA,MACrB,IAAG,aAAQ,kBAAR,YAAyB,CAAC;AAAA,IAC/B;AAEA,QAAI,QAA0B,aAAa,EAAE,YAAY,CAAC;AAAA,EAC5D;AACF;","names":[]}