react-magic-search-params 1.1.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -106,9 +106,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
106
106
  // Here we get all ocurrences of key
107
107
  var urlParams = searchParams.getAll(key);
108
108
  currentValues = urlParams.length > 0 ? urlParams : [];
109
- console.log({
110
- REPEAT: currentValues
111
- });
112
109
  break;
113
110
  }
114
111
  case 'brackets':
@@ -116,9 +113,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
116
113
  // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)
117
114
  var _urlParams = searchParams.getAll(key + "[]");
118
115
  currentValues = _urlParams.length > 0 ? _urlParams : [];
119
- console.log({
120
- BRACKETS: _urlParams
121
- });
122
116
  break;
123
117
  }
124
118
  default:
@@ -141,25 +135,10 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
141
135
  combined = currentValues.includes(incoming) ? currentValues.filter(function (v) {
142
136
  return v !== incoming;
143
137
  }) : [].concat(currentValues, [incoming]);
144
- console.log({
145
- currentValues: currentValues
146
- });
147
- console.log({
148
- incoming: incoming
149
- });
150
- console.log({
151
- CONBINED_STRING: combined
152
- });
153
138
  } else if (Array.isArray(incoming)) {
154
139
  // if an array is passed, repeated values are merged into a single value
155
140
  // Note: Set is used to remove duplicates
156
141
  combined = Array.from(new Set([].concat(incoming)));
157
- console.log({
158
- incoming: incoming
159
- });
160
- console.log({
161
- combined: combined
162
- });
163
142
  } else {
164
143
  combined = currentValues;
165
144
  }
@@ -193,9 +172,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
193
172
  {
194
173
  for (var _iterator = _createForOfIteratorHelperLoose(arrayValue), _step; !(_step = _iterator()).done;) {
195
174
  var item = _step.value;
196
- console.log({
197
- item: item
198
- });
199
175
  // add new value to the key, instead of replacing it
200
176
  newParam.append(key, item);
201
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"react-magic-search-params.cjs.development.js","sources":["../src/useMagicSearchParams.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom'\r\nimport { useMemo, useEffect, useRef, useCallback } from 'react'\r\n\r\n\r\n// Custom hook with advanced techniques to handle search parameters for any pagination\r\n\r\ntype CommonParams = {\r\n page?: number\r\n page_size?: number\r\n}\r\n/*\r\nMaps all properties of M (mandatory) as required\r\nand all properties of O (optional) as optional. \r\n*/\r\ntype MergeParams<M, O> = {\r\n [K in keyof M]: M[K]\r\n} & {\r\n [K in keyof O]?: O[K]\r\n}\r\n/**\r\n * Interface for the configuration object that the hook receives \r\n */\r\nexport interface UseMagicSearchParamsOptions<\r\n M extends Record<string, unknown>,\r\n O extends Record<string, unknown>\r\n> {\r\n mandatory: M \r\n optional?: O\r\n defaultParams?: Partial<MergeParams<M, O>>\r\n forceParams?: Partial<MergeParams<M, O>> // transform all to partial to avoid errors\r\n arraySerialization?: 'csv' | 'repeat' | 'brackets' // technical to serialize arrays in the URL\r\n omitParamsByValues?: Array<'all' | 'default' | 'unknown' | 'none' | 'void '> \r\n}\r\n\r\n/** \r\nGeneric hook to handle search parameters in the URL\r\n@param mandatory - Mandatory parameters (e.g., page=1, page_size=10, etc.)\r\n@param optional - Optional parameters (e.g., order, search, etc.)\r\n@param defaultParams - Default parameters sent in the URL on initialization\r\n@param forceParams - Parameters forced into the URL regardless of user input\r\n@param omitParamsByValues - Parameters omitted if they have specific values \r\n*/\r\nexport const useMagicSearchParams = <\r\n M extends Record<string, unknown> & CommonParams,\r\n O extends Record<string, unknown>,\r\n>({\r\n mandatory = {} as M,\r\n optional = {} as O,\r\n defaultParams = {} as Partial<MergeParams<M, O>>,\r\n arraySerialization = 'csv',\r\n forceParams = {} as {} as Partial<MergeParams<M, O>>,\r\n omitParamsByValues = [] as Array<'all' | 'default' | 'unknown' | 'none' | 'void '>\r\n}: UseMagicSearchParamsOptions<M, O>)=> {\r\n\r\n const [searchParams, setSearchParams] = useSearchParams() \r\n // Ref to store subscriptions: { paramName: [callback1, callback2, ...] }\r\n const subscriptionsRef = useRef<Record<string, Array<() => unknown>>>({}); \r\n const previousParamsRef = useRef<Record<string, unknown>>({})\r\n\r\n const TOTAL_PARAMS_PAGE: MergeParams<M, O> = useMemo(() => {\r\n return { ...mandatory, ...optional };\r\n }, [mandatory, optional]);\r\n\r\n const PARAM_ORDER = useMemo(() => {\r\n return Array.from(Object.keys(TOTAL_PARAMS_PAGE))\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n // we get the keys that are arrays according to TOTAL_PARAMS_PAGE since these require special treatment in the URL due to serialization mode\r\n const ARRAY_KEYS = useMemo(() => {\r\n return Object.keys(TOTAL_PARAMS_PAGE).filter(\r\n (key) => Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n );\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n const appendArrayValues = (\r\n finallyParams: Record<string, unknown>,\r\n newParams: Record<string, string | string[] | unknown>\r\n ): Record<string, unknown> => {\r\n \r\n // Note: We cannot modify the object of the final parameters directly, as immutability must be maintained\r\n const updatedParams = { ...finallyParams };\r\n \r\n\r\n if (ARRAY_KEYS.length === 0) return updatedParams;\r\n \r\n ARRAY_KEYS.forEach((key) => {\r\n // We use the current values directly from searchParams (source of truth)\r\n // This avoids depending on finallyParams in which the arrays have been omitted\r\n let currentValues = []; \r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const raw = searchParams.get(key) || '';\r\n // For csv we expect \"value1,value2,...\" (no prefix)\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean) as Array<string>\r\n break;\r\n }\r\n case 'repeat': {\r\n // Here we get all ocurrences of key\r\n const urlParams = searchParams.getAll(key) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n \r\n console.log({REPEAT: currentValues})\r\n break;\r\n }\r\n case 'brackets': {\r\n // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)\r\n const urlParams = searchParams.getAll(`${key}[]`) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n console.log({BRACKETS: urlParams})\r\n \r\n \r\n break;\r\n }\r\n default: {\r\n // Mode by default works as csv\r\n const raw = searchParams.get(key) ?? '';\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean);\r\n }\r\n break; \r\n }\r\n // Update array values with new ones\r\n \r\n if (newParams[key] !== undefined) {\r\n const incoming = newParams[key];\r\n let combined: string[] = []\r\n if (typeof incoming === 'string') {\r\n // If it is a string, it is toggled (add/remove)\r\n combined = currentValues.includes(incoming)\r\n ? currentValues.filter((v) => v !== incoming)\r\n : [...currentValues, incoming];\r\n console.log({currentValues})\r\n console.log({incoming})\r\n console.log({CONBINED_STRING: combined})\r\n } else if (Array.isArray(incoming)) {\r\n // if an array is passed, repeated values are merged into a single value\r\n // Note: Set is used to remove duplicates\r\n combined = Array.from(new Set([ ...incoming]));\r\n console.log({incoming})\r\n console.log({combined})\r\n } else {\r\n \r\n combined = currentValues;\r\n }\r\n\r\n updatedParams[key] = combined\r\n\r\n }\r\n });\r\n return updatedParams\r\n };\r\n\r\n const transformParamsToURLSearch = (params: Record<string, unknown>): URLSearchParams => {\r\n console.log({PARAMS_RECIBIDOS_TRANSFORM: params})\r\n\r\n const newParam: URLSearchParams = new URLSearchParams()\r\n\r\n const paramsKeys = Object.keys(params)\r\n\r\n for (const key of paramsKeys) {\r\n if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n const arrayValue = params[key] as unknown[]\r\n console.log({arrayValue})\r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const csvValue = arrayValue.join(',')\r\n // set ensure that the previous value is replaced\r\n newParam.set(key, csvValue)\r\n break\r\n } case 'repeat': {\r\n \r\n for (const item of arrayValue) {\r\n console.log({item})\r\n // add new value to the key, instead of replacing it\r\n newParam.append(key, item as string)\r\n \r\n }\r\n break\r\n } case 'brackets': {\r\n for (const item of arrayValue) {\r\n newParam.append(`${key}[]`, item as string)\r\n }\r\n break\r\n } default: {\r\n const csvValue = arrayValue.join(',')\r\n newParam.set(key, csvValue)\r\n }\r\n }\r\n } else {\r\n newParam.set(key, params[key] as string)\r\n }\r\n }\r\n return newParam\r\n }\r\n // @ts-ignore\r\n const hasForcedParamsValues = ({ paramsForced, compareParams }) => {\r\n\r\n // Iterates over the forced parameters and verifies that they exist in the URL and match their values\r\n // Ej: { page: 1, page_size: 10 } === { page: 1, page_size: 10 } => true\r\n const allParamsMatch = Object.entries(paramsForced).every(\r\n ([key, value]) => compareParams[key] === value\r\n );\r\n\r\n return allParamsMatch;\r\n };\r\n \r\n useEffect(() => {\r\n\r\n const keysDefaultParams: string[] = Object.keys(defaultParams)\r\n const keysForceParams: string[] = Object.keys(forceParams)\r\n if(keysDefaultParams.length === 0 && keysForceParams.length === 0) return\r\n \r\n\r\n function handleStartingParams() {\r\n\r\n const defaultParamsString = transformParamsToURLSearch(defaultParams).toString()\r\n const paramsUrl = getParams()\r\n const paramsUrlString = transformParamsToURLSearch(paramsUrl).toString()\r\n const forceParamsString = transformParamsToURLSearch(forceParams).toString()\r\n\r\n console.log({defaultParamsString})\r\n\r\n const isForcedParams: boolean = hasForcedParamsValues({ paramsForced: forceParams, compareParams: paramsUrl })\r\n\r\n if (!isForcedParams) {\r\n\r\n // In this case, the forced parameters take precedence over the default parameters and the parameters of the current URL (which could have been modified by the user, e.g., page_size=1000)\r\n\r\n updateParams({ newParams: {\r\n ...defaultParams,\r\n ...forceParams\r\n }})\r\n return\r\n }\r\n // In this way it will be validated that the forced parameters keys and values are in the current URL\r\n const isIncludesForcedParams = hasForcedParamsValues({ paramsForced: forceParamsString, compareParams: defaultParams })\r\n\r\n if (keysDefaultParams.length > 0 && isIncludesForcedParams) {\r\n if (defaultParamsString === paramsUrlString) return // this means that the URL already has the default parameters\r\n updateParams({ newParams: defaultParams })\r\n }\r\n\r\n }\r\n handleStartingParams()\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Convert a string value to its original type (number, boolean, array) according to TOTAL_PARAMS_PAGE\r\n * @param value - Chain obtained from the URL\r\n * @param key - Key of the parameter\r\n */\r\n const convertOriginalType = (value: string, key: string) => {\r\n // Given that the parameters of a URL are recieved as strings, they are converted to their original type\r\n if (typeof TOTAL_PARAMS_PAGE[key] === 'number') {\r\n return parseInt(value)\r\n } else if (typeof TOTAL_PARAMS_PAGE[key] === 'boolean') {\r\n return value === 'true'\r\n } else if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n // The result will be a valid array represented in the URL ej: tags=tag1,tag2,tag3 to ['tag1', 'tag2', 'tag3'], useful to combine the values of the arrays with the new ones\r\n \r\n if (arraySerialization === 'csv') {\r\n return searchParams.getAll(key).join('').split(',')\r\n } else if (arraySerialization === 'repeat') {\r\n \r\n console.log({SEARCH_PARAMS: searchParams.getAll(key)})\r\n return searchParams.getAll(key)\r\n } else if (arraySerialization === 'brackets') {\r\n return searchParams.getAll(`${key}[]`)\r\n }\r\n \r\n \r\n }\r\n // Note: dates are not converted as it is better to handle them directly in the component that receives them, using a library like < date-fns >\r\n return value\r\n }\r\n \r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n */\r\n const getStringUrl = (key: string, paramsUrl: Record<string, unknown>) => {\r\n const isKeyArray = Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n if (isKeyArray) {\r\n\r\n if (arraySerialization === 'brackets') {\r\n\r\n const arrayUrl = searchParams.getAll(`${key}[]`)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayUrl }).toString()\r\n // in this way the array of the URL is decoded to its original form ej: tags[]=tag1&tags[]=tag2&tags[]=tag3\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n } else if (arraySerialization === 'csv') {\r\n const arrayValue = searchParams.getAll(key)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n }\r\n const arrayValue = searchParams.getAll(key)\r\n const stringResult = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n return stringResult\r\n } else {\r\n \r\n return paramsUrl[key] as string\r\n }\r\n }\r\n const getParamsObj = (searchParams: URLSearchParams): Record<string, string | string[]> => {\r\n const paramsObj: Record<string, string | string[]> = {};\r\n // @ts-ignore\r\n for (const [key, value] of searchParams.entries()) {\r\n if (key.endsWith('[]')) {\r\n const bareKey = key.replace('[]', '');\r\n if (paramsObj[bareKey]) {\r\n (paramsObj[bareKey] as string[]).push(value);\r\n } else {\r\n paramsObj[bareKey] = [value];\r\n }\r\n } else {\r\n // If the key already exists, it is a repeated parameter\r\n if (paramsObj[key]) {\r\n if (Array.isArray(paramsObj[key])) {\r\n (paramsObj[key] as string[]).push(value);\r\n } else {\r\n paramsObj[key] = [paramsObj[key] as string, value];\r\n }\r\n } else {\r\n paramsObj[key] = value;\r\n }\r\n }\r\n }\r\n return paramsObj;\r\n }\r\n // Optimization: While the parameters are not updated, the current parameters of the URL are not recalculated\r\n const CURRENT_PARAMS_URL: Record<string, unknown> = useMemo(() => {\r\n\r\n return arraySerialization === 'brackets' ? getParamsObj(searchParams) : Object.fromEntries(searchParams.entries())\r\n }, [searchParams, arraySerialization])\r\n\r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n * @returns - Returns the current parameters of the URL\r\n */\r\n const getParams = ({ convert = true } = {}): MergeParams<M, O> => {\r\n // All the paramteres are extracted from the URL and converted into an object\r\n\r\n const params = Object.keys(CURRENT_PARAMS_URL).reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(TOTAL_PARAMS_PAGE, key)) {\r\n const realKey = arraySerialization === 'brackets' ? key.replace('[]', '') : key\r\n // @ts-ignore\r\n acc[realKey] = convert === true\r\n ? convertOriginalType(CURRENT_PARAMS_URL[key] as string, key)\r\n : getStringUrl(key, CURRENT_PARAMS_URL)\r\n }\r\n return acc\r\n }, {})\r\n \r\n return params as MergeParams<M, O>\r\n }\r\n type keys = keyof MergeParams<M, O>\r\n // Note: in this way the return of the getParam function is typed dynamically, thus having autocomplete in the IDE (eg: value.split(','))\r\n type TagReturn<T extends boolean> = T extends true ? string[] : string;\r\n /**\r\n * Gets the value of a parameter from the URL and converts it to its original type if desired\r\n * @param key - Key of the parameter\r\n * @param options - Options to convert the value to its original type, default is true\r\n * @returns - Returns the value of the parameter\r\n */\r\n\r\n const getParam = <T extends boolean>(key: keys, options?: { convert: T }): TagReturn<T> => {\r\n\r\n const keyStr = String(key)\r\n // @ts-ignore\r\n const value = options?.convert === true ? convertOriginalType(searchParams.get(keyStr), keyStr) : getStringUrl(keyStr, CURRENT_PARAMS_URL)\r\n return value as TagReturn<T> \r\n }\r\n \r\n type OptionalParamsFiltered = Partial<O>\r\n\r\n const calculateOmittedParameters = (newParams: Record<string, unknown | unknown[]>, keepParams: Record<string, boolean>) => {\r\n // Calculate the ommited parameters, that is, the parameters that have not been sent in the request\r\n const params = getParams()\r\n // hasOw\r\n // Note: it will be necessary to omit the parameters that are arrays because the idea is not to replace them but to add or remove some values\r\n const newParamsWithoutArray = Object.entries(newParams).filter(([key,]) => !Array.isArray(TOTAL_PARAMS_PAGE[key]))\r\n const result = Object.assign({\r\n ...params,\r\n ...Object.fromEntries(newParamsWithoutArray),\r\n ...forceParams // the forced parameters will always be sent and will maintain their value\r\n })\r\n const paramsFiltered: OptionalParamsFiltered = Object.keys(result).reduce((acc, key) => {\r\n // for default no parameters are omitted unless specified in the keepParams object\r\n if (Object.prototype.hasOwnProperty.call(keepParams, key) && keepParams[key] === false) {\r\n return acc\r\n // Note: They array of parameters omitted by values (e.g., ['all', 'default']) are omitted since they are usually a default value that is not desired to be sent\r\n } else if (!!result[key] !== false && !omitParamsByValues.includes(result[key])) {\r\n // @ts-ignore\r\n acc[key] = result[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n return {\r\n ...mandatory,\r\n ...paramsFiltered\r\n } \r\n }\r\n // @ts-ignore\r\n const sortParameters = (paramsFiltered) => {\r\n // sort the parameters according to the structure so that it persists with each change in the URL, eg: localhost:3000/?page=1&page_size=10\r\n // Note: this visibly improves the user experience\r\n const orderedParams = PARAM_ORDER.reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(paramsFiltered, key)) {\r\n // @ts-ignore\r\n acc[key] = paramsFiltered[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n return orderedParams\r\n }\r\n\r\n const mandatoryParameters = () => {\r\n // Note: in case there are arrays in the URL, they are converted to their original form ej: tags=['tag1', 'tag2'] otherwise the parameters are extracted without converting to optimize performance\r\n const isNecessaryConvert: boolean = ARRAY_KEYS.length > 0 ? true : false\r\n const totalParametros: Record<string, unknown> = getParams({ convert: isNecessaryConvert })\r\n\r\n const paramsUrlFound: Record<string, boolean> = Object.keys(totalParametros).reduce(\r\n (acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(mandatory, key)) {\r\n // @ts-ignore\r\n acc[key] = totalParametros[key]\r\n }\r\n return acc\r\n },\r\n {}\r\n )\r\n\r\n return paramsUrlFound\r\n }\r\n /**\r\n clears the parameters of the URL, keeping the mandatory parameters\r\n * @param keepMandatoryParams - If true, the mandatory parameters are kept in the URL\r\n */\r\n\r\n const clearParams = ({ keepMandatoryParams = true } = {}): void => {\r\n // for default, the mandatory parameters are not cleared since the current pagination would be lost\r\n const paramsTransformed = transformParamsToURLSearch(\r\n {\r\n ...mandatory,\r\n \r\n ...(keepMandatoryParams && {\r\n ...mandatoryParameters()\r\n }),\r\n ...forceParams \r\n }\r\n )\r\n setSearchParams(paramsTransformed) \r\n }\r\n\r\n // transforms the keys to boolean to know which parameters to keep\r\n type KeepParamsTransformedValuesBoolean = Partial<Record<keyof typeof TOTAL_PARAMS_PAGE, boolean>>\r\n type NewParams = Partial<typeof TOTAL_PARAMS_PAGE> \r\n type KeepParams = KeepParamsTransformedValuesBoolean\r\n /**\r\n Merges the new parameters with the current ones, omits the parameters that are not sent and sorts them according to the structure\r\n * @param newParams - New parameters to be sent in the URL\r\n * @param keepParams - Parameters to keep in the URL, default is true\r\n */\r\n const updateParams = ({ newParams = {} as NewParams, keepParams = {} as KeepParams } = {}) => {\r\n\r\n if (\r\n Object.keys(newParams).length === 0 &&\r\n Object.keys(keepParams).length === 0\r\n ) {\r\n clearParams()\r\n return\r\n }\r\n // @ts-ignore\r\n const finallyParamters = calculateOmittedParameters(newParams, keepParams)\r\n\r\n const convertedArrayValues = appendArrayValues(finallyParamters, newParams)\r\n\r\n const paramsSorted = sortParameters(convertedArrayValues)\r\n\r\n setSearchParams(transformParamsToURLSearch(paramsSorted))\r\n\r\n }\r\n\r\n /**\r\n * @param paramName - Name of the parameter to subscribe to\r\n * @param callbacks - Callbacks to be executed when the parameter changes\r\n * @returns - Returns the function to unsubscribe\r\n */\r\n const onChange = useCallback( (paramName: keys, callbacks: Array<() => void>) => {\r\n const paramNameStr = String(paramName)\r\n // replace the previous callbacks with the new ones so as not to accumulate callbacks\r\n subscriptionsRef.current[paramNameStr] = callbacks;\r\n }, [])\r\n \r\n // each time searchParams changes, we notify the subscribers\r\n useEffect(() => {\r\n\r\n for (const [key, value] of Object.entries(subscriptionsRef.current)) {\r\n\r\n const newValue = CURRENT_PARAMS_URL[key] ?? null \r\n const oldValue = previousParamsRef.current[key] ?? null\r\n if (newValue !== oldValue) {\r\n \r\n for (const callback of value) {\r\n callback()\r\n\r\n }\r\n }\r\n // once the callback is executed, the previous value is updated to ensure that the next time the value changes, the callback is executed\r\n previousParamsRef.current[key] = newValue\r\n }\r\n\r\n \r\n }, [CURRENT_PARAMS_URL])\r\n return {\r\n searchParams,\r\n updateParams,\r\n clearParams,\r\n getParams,\r\n getParam,\r\n onChange\r\n }\r\n}\r\n\r\n"],"names":["useMagicSearchParams","_ref","mandatory","_ref$mandatory","_ref$optional","optional","_ref$defaultParams","defaultParams","_ref$arraySerializati","arraySerialization","_ref$forceParams","forceParams","_ref$omitParamsByValu","omitParamsByValues","_useSearchParams","useSearchParams","searchParams","setSearchParams","subscriptionsRef","useRef","previousParamsRef","TOTAL_PARAMS_PAGE","useMemo","_extends","PARAM_ORDER","Array","from","Object","keys","ARRAY_KEYS","filter","key","isArray","appendArrayValues","finallyParams","newParams","updatedParams","length","forEach","currentValues","raw","get","split","map","v","trim","Boolean","urlParams","getAll","console","log","REPEAT","BRACKETS","_searchParams$get","undefined","incoming","combined","includes","concat","CONBINED_STRING","Set","transformParamsToURLSearch","params","PARAMS_RECIBIDOS_TRANSFORM","newParam","URLSearchParams","paramsKeys","_i","_paramsKeys","arrayValue","csvValue","join","set","_iterator","_createForOfIteratorHelperLoose","_step","done","item","value","append","_iterator2","_step2","hasForcedParamsValues","_ref2","paramsForced","compareParams","allParamsMatch","entries","every","_ref3","useEffect","keysDefaultParams","keysForceParams","handleStartingParams","defaultParamsString","toString","paramsUrl","getParams","paramsUrlString","forceParamsString","isForcedParams","updateParams","isIncludesForcedParams","convertOriginalType","parseInt","SEARCH_PARAMS","getStringUrl","isKeyArray","_transformParamsToURL3","_transformParamsToURL","arrayUrl","encodedQueryArray","unencodeQuery","decodeURIComponent","_transformParamsToURL2","stringResult","getParamsObj","paramsObj","_iterator3","_step3","_step3$value","endsWith","bareKey","replace","push","CURRENT_PARAMS_URL","fromEntries","_temp","_ref4$convert","_ref4","convert","reduce","acc","prototype","hasOwnProperty","call","realKey","getParam","options","keyStr","String","calculateOmittedParameters","keepParams","newParamsWithoutArray","_ref5","result","assign","paramsFiltered","sortParameters","orderedParams","mandatoryParameters","isNecessaryConvert","totalParametros","paramsUrlFound","clearParams","_temp2","_ref6$keepMandatoryPa","_ref6","keepMandatoryParams","paramsTransformed","_temp3","_ref7$newParams","_ref7","_ref7$keepParams","finallyParamters","convertedArrayValues","paramsSorted","onChange","useCallback","paramName","callbacks","paramNameStr","current","_i2","_Object$entries","_CURRENT_PARAMS_URL$k","_previousParamsRef$cu","_Object$entries$_i","newValue","oldValue","_iterator4","_step4","callback"],"mappings":"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"}
1
+ {"version":3,"file":"react-magic-search-params.cjs.development.js","sources":["../src/useMagicSearchParams.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom'\r\nimport { useMemo, useEffect, useRef, useCallback } from 'react'\r\n\r\n\r\n// Custom hook with advanced techniques to handle search parameters for any pagination\r\n\r\ntype CommonParams = {\r\n page?: number\r\n page_size?: number\r\n}\r\n/*\r\nMaps all properties of M (mandatory) as required\r\nand all properties of O (optional) as optional. \r\n*/\r\ntype MergeParams<M, O> = {\r\n [K in keyof M]: M[K]\r\n} & {\r\n [K in keyof O]?: O[K]\r\n}\r\n/**\r\n * Interface for the configuration object that the hook receives \r\n */\r\nexport interface UseMagicSearchParamsOptions<\r\n M extends Record<string, unknown>,\r\n O extends Record<string, unknown>\r\n> {\r\n mandatory: M \r\n optional?: O\r\n defaultParams?: Partial<MergeParams<M, O>>\r\n forceParams?: Partial<MergeParams<M, O>> // transform all to partial to avoid errors\r\n arraySerialization?: 'csv' | 'repeat' | 'brackets' // technical to serialize arrays in the URL\r\n omitParamsByValues?: Array<'all' | 'default' | 'unknown' | 'none' | 'void '> \r\n}\r\n\r\n/** \r\nGeneric hook to handle search parameters in the URL\r\n@param mandatory - Mandatory parameters (e.g., page=1, page_size=10, etc.)\r\n@param optional - Optional parameters (e.g., order, search, etc.)\r\n@param defaultParams - Default parameters sent in the URL on initialization\r\n@param forceParams - Parameters forced into the URL regardless of user input\r\n@param omitParamsByValues - Parameters omitted if they have specific values \r\n*/\r\nexport const useMagicSearchParams = <\r\n M extends Record<string, unknown> & CommonParams,\r\n O extends Record<string, unknown>,\r\n>({\r\n mandatory = {} as M,\r\n optional = {} as O,\r\n defaultParams = {} as Partial<MergeParams<M, O>>,\r\n arraySerialization = 'csv',\r\n forceParams = {} as {} as Partial<MergeParams<M, O>>,\r\n omitParamsByValues = [] as Array<'all' | 'default' | 'unknown' | 'none' | 'void '>\r\n}: UseMagicSearchParamsOptions<M, O>)=> {\r\n\r\n const [searchParams, setSearchParams] = useSearchParams() \r\n // Ref to store subscriptions: { paramName: [callback1, callback2, ...] }\r\n const subscriptionsRef = useRef<Record<string, Array<() => unknown>>>({}); \r\n const previousParamsRef = useRef<Record<string, unknown>>({})\r\n\r\n const TOTAL_PARAMS_PAGE: MergeParams<M, O> = useMemo(() => {\r\n return { ...mandatory, ...optional };\r\n }, [mandatory, optional]);\r\n\r\n const PARAM_ORDER = useMemo(() => {\r\n return Array.from(Object.keys(TOTAL_PARAMS_PAGE))\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n // we get the keys that are arrays according to TOTAL_PARAMS_PAGE since these require special treatment in the URL due to serialization mode\r\n const ARRAY_KEYS = useMemo(() => {\r\n return Object.keys(TOTAL_PARAMS_PAGE).filter(\r\n (key) => Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n );\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n const appendArrayValues = (\r\n finallyParams: Record<string, unknown>,\r\n newParams: Record<string, string | string[] | unknown>\r\n ): Record<string, unknown> => {\r\n \r\n // Note: We cannot modify the object of the final parameters directly, as immutability must be maintained\r\n const updatedParams = { ...finallyParams };\r\n \r\n if (ARRAY_KEYS.length === 0) return updatedParams;\r\n \r\n ARRAY_KEYS.forEach((key) => {\r\n // We use the current values directly from searchParams (source of truth)\r\n // This avoids depending on finallyParams in which the arrays have been omitted\r\n let currentValues = []; \r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const raw = searchParams.get(key) || '';\r\n // For csv we expect \"value1,value2,...\" (no prefix)\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean) as Array<string>\r\n break;\r\n }\r\n case 'repeat': {\r\n // Here we get all ocurrences of key\r\n const urlParams = searchParams.getAll(key) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n\r\n break;\r\n }\r\n case 'brackets': {\r\n // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)\r\n const urlParams = searchParams.getAll(`${key}[]`) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n\r\n break;\r\n }\r\n default: {\r\n // Mode by default works as csv\r\n const raw = searchParams.get(key) ?? '';\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean);\r\n }\r\n break; \r\n }\r\n // Update array values with new ones\r\n \r\n if (newParams[key] !== undefined) {\r\n const incoming = newParams[key];\r\n let combined: string[] = []\r\n if (typeof incoming === 'string') {\r\n // If it is a string, it is toggled (add/remove)\r\n combined = currentValues.includes(incoming)\r\n ? currentValues.filter((v) => v !== incoming)\r\n : [...currentValues, incoming];\r\n } else if (Array.isArray(incoming)) {\r\n // if an array is passed, repeated values are merged into a single value\r\n // Note: Set is used to remove duplicates\r\n combined = Array.from(new Set([ ...incoming]));\r\n\r\n } else {\r\n \r\n combined = currentValues;\r\n }\r\n\r\n updatedParams[key] = combined\r\n\r\n }\r\n });\r\n return updatedParams\r\n };\r\n\r\n const transformParamsToURLSearch = (params: Record<string, unknown>): URLSearchParams => {\r\n console.log({PARAMS_RECIBIDOS_TRANSFORM: params})\r\n\r\n const newParam: URLSearchParams = new URLSearchParams()\r\n\r\n const paramsKeys = Object.keys(params)\r\n\r\n for (const key of paramsKeys) {\r\n if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n const arrayValue = params[key] as unknown[]\r\n console.log({arrayValue})\r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const csvValue = arrayValue.join(',')\r\n // set ensure that the previous value is replaced\r\n newParam.set(key, csvValue)\r\n break\r\n } case 'repeat': {\r\n \r\n for (const item of arrayValue) {\r\n\r\n // add new value to the key, instead of replacing it\r\n newParam.append(key, item as string)\r\n \r\n }\r\n break\r\n } case 'brackets': {\r\n for (const item of arrayValue) {\r\n newParam.append(`${key}[]`, item as string)\r\n }\r\n break\r\n } default: {\r\n const csvValue = arrayValue.join(',')\r\n newParam.set(key, csvValue)\r\n }\r\n }\r\n } else {\r\n newParam.set(key, params[key] as string)\r\n }\r\n }\r\n return newParam\r\n }\r\n // @ts-ignore\r\n const hasForcedParamsValues = ({ paramsForced, compareParams }) => {\r\n\r\n // Iterates over the forced parameters and verifies that they exist in the URL and match their values\r\n // Ej: { page: 1, page_size: 10 } === { page: 1, page_size: 10 } => true\r\n const allParamsMatch = Object.entries(paramsForced).every(\r\n ([key, value]) => compareParams[key] === value\r\n );\r\n\r\n return allParamsMatch;\r\n };\r\n \r\n useEffect(() => {\r\n\r\n const keysDefaultParams: string[] = Object.keys(defaultParams)\r\n const keysForceParams: string[] = Object.keys(forceParams)\r\n if(keysDefaultParams.length === 0 && keysForceParams.length === 0) return\r\n \r\n\r\n function handleStartingParams() {\r\n\r\n const defaultParamsString = transformParamsToURLSearch(defaultParams).toString()\r\n const paramsUrl = getParams()\r\n const paramsUrlString = transformParamsToURLSearch(paramsUrl).toString()\r\n const forceParamsString = transformParamsToURLSearch(forceParams).toString()\r\n\r\n console.log({defaultParamsString})\r\n\r\n const isForcedParams: boolean = hasForcedParamsValues({ paramsForced: forceParams, compareParams: paramsUrl })\r\n\r\n if (!isForcedParams) {\r\n\r\n // In this case, the forced parameters take precedence over the default parameters and the parameters of the current URL (which could have been modified by the user, e.g., page_size=1000)\r\n\r\n updateParams({ newParams: {\r\n ...defaultParams,\r\n ...forceParams\r\n }})\r\n return\r\n }\r\n // In this way it will be validated that the forced parameters keys and values are in the current URL\r\n const isIncludesForcedParams = hasForcedParamsValues({ paramsForced: forceParamsString, compareParams: defaultParams })\r\n\r\n if (keysDefaultParams.length > 0 && isIncludesForcedParams) {\r\n if (defaultParamsString === paramsUrlString) return // this means that the URL already has the default parameters\r\n updateParams({ newParams: defaultParams })\r\n }\r\n\r\n }\r\n handleStartingParams()\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Convert a string value to its original type (number, boolean, array) according to TOTAL_PARAMS_PAGE\r\n * @param value - Chain obtained from the URL\r\n * @param key - Key of the parameter\r\n */\r\n const convertOriginalType = (value: string, key: string) => {\r\n // Given that the parameters of a URL are recieved as strings, they are converted to their original type\r\n if (typeof TOTAL_PARAMS_PAGE[key] === 'number') {\r\n return parseInt(value)\r\n } else if (typeof TOTAL_PARAMS_PAGE[key] === 'boolean') {\r\n return value === 'true'\r\n } else if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n // The result will be a valid array represented in the URL ej: tags=tag1,tag2,tag3 to ['tag1', 'tag2', 'tag3'], useful to combine the values of the arrays with the new ones\r\n \r\n if (arraySerialization === 'csv') {\r\n return searchParams.getAll(key).join('').split(',')\r\n } else if (arraySerialization === 'repeat') {\r\n \r\n console.log({SEARCH_PARAMS: searchParams.getAll(key)})\r\n return searchParams.getAll(key)\r\n } else if (arraySerialization === 'brackets') {\r\n return searchParams.getAll(`${key}[]`)\r\n }\r\n \r\n \r\n }\r\n // Note: dates are not converted as it is better to handle them directly in the component that receives them, using a library like < date-fns >\r\n return value\r\n }\r\n \r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n */\r\n const getStringUrl = (key: string, paramsUrl: Record<string, unknown>) => {\r\n const isKeyArray = Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n if (isKeyArray) {\r\n\r\n if (arraySerialization === 'brackets') {\r\n\r\n const arrayUrl = searchParams.getAll(`${key}[]`)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayUrl }).toString()\r\n // in this way the array of the URL is decoded to its original form ej: tags[]=tag1&tags[]=tag2&tags[]=tag3\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n } else if (arraySerialization === 'csv') {\r\n const arrayValue = searchParams.getAll(key)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n }\r\n const arrayValue = searchParams.getAll(key)\r\n const stringResult = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n return stringResult\r\n } else {\r\n \r\n return paramsUrl[key] as string\r\n }\r\n }\r\n const getParamsObj = (searchParams: URLSearchParams): Record<string, string | string[]> => {\r\n const paramsObj: Record<string, string | string[]> = {};\r\n // @ts-ignore\r\n for (const [key, value] of searchParams.entries()) {\r\n if (key.endsWith('[]')) {\r\n const bareKey = key.replace('[]', '');\r\n if (paramsObj[bareKey]) {\r\n (paramsObj[bareKey] as string[]).push(value);\r\n } else {\r\n paramsObj[bareKey] = [value];\r\n }\r\n } else {\r\n // If the key already exists, it is a repeated parameter\r\n if (paramsObj[key]) {\r\n if (Array.isArray(paramsObj[key])) {\r\n (paramsObj[key] as string[]).push(value);\r\n } else {\r\n paramsObj[key] = [paramsObj[key] as string, value];\r\n }\r\n } else {\r\n paramsObj[key] = value;\r\n }\r\n }\r\n }\r\n return paramsObj;\r\n }\r\n // Optimization: While the parameters are not updated, the current parameters of the URL are not recalculated\r\n const CURRENT_PARAMS_URL: Record<string, unknown> = useMemo(() => {\r\n\r\n return arraySerialization === 'brackets' ? getParamsObj(searchParams) : Object.fromEntries(searchParams.entries())\r\n }, [searchParams, arraySerialization])\r\n\r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n * @returns - Returns the current parameters of the URL\r\n */\r\n const getParams = ({ convert = true } = {}): MergeParams<M, O> => {\r\n // All the paramteres are extracted from the URL and converted into an object\r\n\r\n const params = Object.keys(CURRENT_PARAMS_URL).reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(TOTAL_PARAMS_PAGE, key)) {\r\n const realKey = arraySerialization === 'brackets' ? key.replace('[]', '') : key\r\n // @ts-ignore\r\n acc[realKey] = convert === true\r\n ? convertOriginalType(CURRENT_PARAMS_URL[key] as string, key)\r\n : getStringUrl(key, CURRENT_PARAMS_URL)\r\n }\r\n return acc\r\n }, {})\r\n \r\n return params as MergeParams<M, O>\r\n }\r\n type keys = keyof MergeParams<M, O>\r\n // Note: in this way the return of the getParam function is typed dynamically, thus having autocomplete in the IDE (eg: value.split(','))\r\n type TagReturn<T extends boolean> = T extends true ? string[] : string;\r\n /**\r\n * Gets the value of a parameter from the URL and converts it to its original type if desired\r\n * @param key - Key of the parameter\r\n * @param options - Options to convert the value to its original type, default is true\r\n * @returns - Returns the value of the parameter\r\n */\r\n\r\n const getParam = <T extends boolean>(key: keys, options?: { convert: T }): TagReturn<T> => {\r\n\r\n const keyStr = String(key)\r\n // @ts-ignore\r\n const value = options?.convert === true ? convertOriginalType(searchParams.get(keyStr), keyStr) : getStringUrl(keyStr, CURRENT_PARAMS_URL)\r\n return value as TagReturn<T> \r\n }\r\n \r\n type OptionalParamsFiltered = Partial<O>\r\n\r\n const calculateOmittedParameters = (newParams: Record<string, unknown | unknown[]>, keepParams: Record<string, boolean>) => {\r\n // Calculate the ommited parameters, that is, the parameters that have not been sent in the request\r\n const params = getParams()\r\n // hasOw\r\n // Note: it will be necessary to omit the parameters that are arrays because the idea is not to replace them but to add or remove some values\r\n const newParamsWithoutArray = Object.entries(newParams).filter(([key,]) => !Array.isArray(TOTAL_PARAMS_PAGE[key]))\r\n const result = Object.assign({\r\n ...params,\r\n ...Object.fromEntries(newParamsWithoutArray),\r\n ...forceParams // the forced parameters will always be sent and will maintain their value\r\n })\r\n const paramsFiltered: OptionalParamsFiltered = Object.keys(result).reduce((acc, key) => {\r\n // for default no parameters are omitted unless specified in the keepParams object\r\n if (Object.prototype.hasOwnProperty.call(keepParams, key) && keepParams[key] === false) {\r\n return acc\r\n // Note: They array of parameters omitted by values (e.g., ['all', 'default']) are omitted since they are usually a default value that is not desired to be sent\r\n } else if (!!result[key] !== false && !omitParamsByValues.includes(result[key])) {\r\n // @ts-ignore\r\n acc[key] = result[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n return {\r\n ...mandatory,\r\n ...paramsFiltered\r\n } \r\n }\r\n // @ts-ignore\r\n const sortParameters = (paramsFiltered) => {\r\n // sort the parameters according to the structure so that it persists with each change in the URL, eg: localhost:3000/?page=1&page_size=10\r\n // Note: this visibly improves the user experience\r\n const orderedParams = PARAM_ORDER.reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(paramsFiltered, key)) {\r\n // @ts-ignore\r\n acc[key] = paramsFiltered[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n return orderedParams\r\n }\r\n\r\n const mandatoryParameters = () => {\r\n // Note: in case there are arrays in the URL, they are converted to their original form ej: tags=['tag1', 'tag2'] otherwise the parameters are extracted without converting to optimize performance\r\n const isNecessaryConvert: boolean = ARRAY_KEYS.length > 0 ? true : false\r\n const totalParametros: Record<string, unknown> = getParams({ convert: isNecessaryConvert })\r\n\r\n const paramsUrlFound: Record<string, boolean> = Object.keys(totalParametros).reduce(\r\n (acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(mandatory, key)) {\r\n // @ts-ignore\r\n acc[key] = totalParametros[key]\r\n }\r\n return acc\r\n },\r\n {}\r\n )\r\n\r\n return paramsUrlFound\r\n }\r\n /**\r\n clears the parameters of the URL, keeping the mandatory parameters\r\n * @param keepMandatoryParams - If true, the mandatory parameters are kept in the URL\r\n */\r\n\r\n const clearParams = ({ keepMandatoryParams = true } = {}): void => {\r\n // for default, the mandatory parameters are not cleared since the current pagination would be lost\r\n const paramsTransformed = transformParamsToURLSearch(\r\n {\r\n ...mandatory,\r\n \r\n ...(keepMandatoryParams && {\r\n ...mandatoryParameters()\r\n }),\r\n ...forceParams \r\n }\r\n )\r\n setSearchParams(paramsTransformed) \r\n }\r\n\r\n // transforms the keys to boolean to know which parameters to keep\r\n type KeepParamsTransformedValuesBoolean = Partial<Record<keyof typeof TOTAL_PARAMS_PAGE, boolean>>\r\n type NewParams = Partial<typeof TOTAL_PARAMS_PAGE> \r\n type KeepParams = KeepParamsTransformedValuesBoolean\r\n /**\r\n Merges the new parameters with the current ones, omits the parameters that are not sent and sorts them according to the structure\r\n * @param newParams - New parameters to be sent in the URL\r\n * @param keepParams - Parameters to keep in the URL, default is true\r\n */\r\n const updateParams = ({ newParams = {} as NewParams, keepParams = {} as KeepParams } = {}) => {\r\n\r\n if (\r\n Object.keys(newParams).length === 0 &&\r\n Object.keys(keepParams).length === 0\r\n ) {\r\n clearParams()\r\n return\r\n }\r\n // @ts-ignore\r\n const finallyParamters = calculateOmittedParameters(newParams, keepParams)\r\n\r\n const convertedArrayValues = appendArrayValues(finallyParamters, newParams)\r\n\r\n const paramsSorted = sortParameters(convertedArrayValues)\r\n\r\n setSearchParams(transformParamsToURLSearch(paramsSorted))\r\n\r\n }\r\n\r\n /**\r\n * @param paramName - Name of the parameter to subscribe to\r\n * @param callbacks - Callbacks to be executed when the parameter changes\r\n * @returns - Returns the function to unsubscribe\r\n */\r\n const onChange = useCallback( (paramName: keys, callbacks: Array<() => void>) => {\r\n const paramNameStr = String(paramName)\r\n // replace the previous callbacks with the new ones so as not to accumulate callbacks\r\n subscriptionsRef.current[paramNameStr] = callbacks;\r\n }, [])\r\n \r\n // each time searchParams changes, we notify the subscribers\r\n useEffect(() => {\r\n\r\n for (const [key, value] of Object.entries(subscriptionsRef.current)) {\r\n\r\n const newValue = CURRENT_PARAMS_URL[key] ?? null \r\n const oldValue = previousParamsRef.current[key] ?? null\r\n if (newValue !== oldValue) {\r\n \r\n for (const callback of value) {\r\n callback()\r\n\r\n }\r\n }\r\n // once the callback is executed, the previous value is updated to ensure that the next time the value changes, the callback is executed\r\n previousParamsRef.current[key] = newValue\r\n }\r\n\r\n }, [CURRENT_PARAMS_URL])\r\n return {\r\n searchParams,\r\n updateParams,\r\n clearParams,\r\n getParams,\r\n getParam,\r\n onChange\r\n }\r\n}\r\n\r\n"],"names":["useMagicSearchParams","_ref","mandatory","_ref$mandatory","_ref$optional","optional","_ref$defaultParams","defaultParams","_ref$arraySerializati","arraySerialization","_ref$forceParams","forceParams","_ref$omitParamsByValu","omitParamsByValues","_useSearchParams","useSearchParams","searchParams","setSearchParams","subscriptionsRef","useRef","previousParamsRef","TOTAL_PARAMS_PAGE","useMemo","_extends","PARAM_ORDER","Array","from","Object","keys","ARRAY_KEYS","filter","key","isArray","appendArrayValues","finallyParams","newParams","updatedParams","length","forEach","currentValues","raw","get","split","map","v","trim","Boolean","urlParams","getAll","_searchParams$get","undefined","incoming","combined","includes","concat","Set","transformParamsToURLSearch","params","console","log","PARAMS_RECIBIDOS_TRANSFORM","newParam","URLSearchParams","paramsKeys","_i","_paramsKeys","arrayValue","csvValue","join","set","_iterator","_createForOfIteratorHelperLoose","_step","done","item","value","append","_iterator2","_step2","hasForcedParamsValues","_ref2","paramsForced","compareParams","allParamsMatch","entries","every","_ref3","useEffect","keysDefaultParams","keysForceParams","handleStartingParams","defaultParamsString","toString","paramsUrl","getParams","paramsUrlString","forceParamsString","isForcedParams","updateParams","isIncludesForcedParams","convertOriginalType","parseInt","SEARCH_PARAMS","getStringUrl","isKeyArray","_transformParamsToURL3","_transformParamsToURL","arrayUrl","encodedQueryArray","unencodeQuery","decodeURIComponent","_transformParamsToURL2","stringResult","getParamsObj","paramsObj","_iterator3","_step3","_step3$value","endsWith","bareKey","replace","push","CURRENT_PARAMS_URL","fromEntries","_temp","_ref4$convert","_ref4","convert","reduce","acc","prototype","hasOwnProperty","call","realKey","getParam","options","keyStr","String","calculateOmittedParameters","keepParams","newParamsWithoutArray","_ref5","result","assign","paramsFiltered","sortParameters","orderedParams","mandatoryParameters","isNecessaryConvert","totalParametros","paramsUrlFound","clearParams","_temp2","_ref6$keepMandatoryPa","_ref6","keepMandatoryParams","paramsTransformed","_temp3","_ref7$newParams","_ref7","_ref7$keepParams","finallyParamters","convertedArrayValues","paramsSorted","onChange","useCallback","paramName","callbacks","paramNameStr","current","_i2","_Object$entries","_CURRENT_PARAMS_URL$k","_previousParamsRef$cu","_Object$entries$_i","newValue","oldValue","_iterator4","_step4","callback"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("react-router-dom"),e=require("react");function t(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=Array(e);t<e;t++)n[t]=r[t];return n}function n(r,e){var n="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(n)return(n=n.call(r)).next.bind(n);if(Array.isArray(r)||(n=function(r,e){if(r){if("string"==typeof r)return t(r,e);var n={}.toString.call(r).slice(8,-1);return"Object"===n&&r.constructor&&(n=r.constructor.name),"Map"===n||"Set"===n?Array.from(r):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?t(r,e):void 0}}(r))||e&&r&&"number"==typeof r.length){n&&(r=n);var a=0;return function(){return a>=r.length?{done:!0}:{done:!1,value:r[a++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function a(){return(a=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)({}).hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}).apply(null,arguments)}exports.useMagicSearchParams=function(t){var o=t.mandatory,i=void 0===o?{}:o,c=t.optional,u=void 0===c?{}:c,l=t.defaultParams,s=void 0===l?{}:l,f=t.arraySerialization,v=void 0===f?"csv":f,g=t.forceParams,m=void 0===g?{}:g,y=t.omitParamsByValues,d=void 0===y?[]:y,p=r.useSearchParams(),b=p[0],A=p[1],h=e.useRef({}),O=e.useRef({}),P=e.useMemo((function(){return a({},i,u)}),[i,u]),j=e.useMemo((function(){return Array.from(Object.keys(P))}),[P]),S=e.useMemo((function(){return Object.keys(P).filter((function(r){return Array.isArray(P[r])}))}),[P]),k=function(r){console.log({PARAMS_RECIBIDOS_TRANSFORM:r});for(var e=new URLSearchParams,t=0,a=Object.keys(r);t<a.length;t++){var o=a[t];if(Array.isArray(P[o])){var i=r[o];switch(console.log({arrayValue:i}),v){case"csv":var c=i.join(",");e.set(o,c);break;case"repeat":for(var u,l=n(i);!(u=l()).done;){var s=u.value;console.log({item:s}),e.append(o,s)}break;case"brackets":for(var f,g=n(i);!(f=g()).done;)e.append(o+"[]",f.value);break;default:var m=i.join(",");e.set(o,m)}}else e.set(o,r[o])}return e},w=function(r){var e=r.compareParams;return Object.entries(r.paramsForced).every((function(r){return e[r[0]]===r[1]}))};e.useEffect((function(){var r=Object.keys(s),e=Object.keys(m);0===r.length&&0===e.length||function(){var e=k(s).toString(),t=I(),n=k(t).toString(),o=k(m).toString();if(console.log({defaultParamsString:e}),w({paramsForced:m,compareParams:t})){var i=w({paramsForced:o,compareParams:s});if(r.length>0&&i){if(e===n)return;B({newParams:s})}}else B({newParams:a({},s,m)})}()}),[]);var R=function(r,e){if("number"==typeof P[e])return parseInt(r);if("boolean"==typeof P[e])return"true"===r;if(Array.isArray(P[e])){if("csv"===v)return b.getAll(e).join("").split(",");if("repeat"===v)return console.log({SEARCH_PARAMS:b.getAll(e)}),b.getAll(e);if("brackets"===v)return b.getAll(e+"[]")}return r},E=function(r,e){if(Array.isArray(P[r])){var t;if("brackets"===v){var n,a=b.getAll(r+"[]"),o=k((n={},n[r]=a,n)).toString();return decodeURIComponent(o)}if("csv"===v){var i,c=b.getAll(r),u=k((i={},i[r]=c,i)).toString();return decodeURIComponent(u)}var l=b.getAll(r);return k((t={},t[r]=l,t)).toString()}return e[r]},M=e.useMemo((function(){return"brackets"===v?function(r){for(var e,t={},a=n(r.entries());!(e=a()).done;){var o=e.value,i=o[0],c=o[1];if(i.endsWith("[]")){var u=i.replace("[]","");t[u]?t[u].push(c):t[u]=[c]}else t[i]?Array.isArray(t[i])?t[i].push(c):t[i]=[t[i],c]:t[i]=c}return t}(b):Object.fromEntries(b.entries())}),[b,v]),I=function(r){var e=(void 0===r?{}:r).convert,t=void 0===e||e;return Object.keys(M).reduce((function(r,e){return Object.prototype.hasOwnProperty.call(P,e)&&(r["brackets"===v?e.replace("[]",""):e]=!0===t?R(M[e],e):E(e,M)),r}),{})},C=function(r){var e,t=(void 0===r?{}:r).keepMandatoryParams,n=k(a({},i,(void 0===t||t)&&a({},(e=I({convert:S.length>0}),Object.keys(e).reduce((function(r,t){return Object.prototype.hasOwnProperty.call(i,t)&&(r[t]=e[t]),r}),{}))),m));A(n)},B=function(r){var e=void 0===r?{}:r,t=e.newParams,n=void 0===t?{}:t,o=e.keepParams,c=void 0===o?{}:o;if(0!==Object.keys(n).length||0!==Object.keys(c).length){var u,l=function(r,e){var t=a({},r);return 0===S.length||S.forEach((function(r){var n=[];switch(v){case"csv":n=(b.get(r)||"").split(",").map((function(r){return r.trim()})).filter(Boolean);break;case"repeat":var a=b.getAll(r);n=a.length>0?a:[],console.log({REPEAT:n});break;case"brackets":var o=b.getAll(r+"[]");n=o.length>0?o:[],console.log({BRACKETS:o});break;default:var i;n=(null!=(i=b.get(r))?i:"").split(",").map((function(r){return r.trim()})).filter(Boolean)}if(void 0!==e[r]){var c=e[r],u=[];"string"==typeof c?(u=n.includes(c)?n.filter((function(r){return r!==c})):[].concat(n,[c]),console.log({currentValues:n}),console.log({incoming:c}),console.log({CONBINED_STRING:u})):Array.isArray(c)?(u=Array.from(new Set([].concat(c))),console.log({incoming:c}),console.log({combined:u})):u=n,t[r]=u}})),t}(function(r,e){var t=I(),n=Object.entries(r).filter((function(r){return!Array.isArray(P[r[0]])})),o=Object.assign(a({},t,Object.fromEntries(n),m)),c=Object.keys(o).reduce((function(r,t){return Object.prototype.hasOwnProperty.call(e,t)&&!1===e[t]||0==!!o[t]||d.includes(o[t])||(r[t]=o[t]),r}),{});return a({},i,c)}(n,c),n),s=(u=l,j.reduce((function(r,e){return Object.prototype.hasOwnProperty.call(u,e)&&(r[e]=u[e]),r}),{}));A(k(s))}else C()},_=e.useCallback((function(r,e){var t=String(r);h.current[t]=e}),[]);return e.useEffect((function(){for(var r=0,e=Object.entries(h.current);r<e.length;r++){var t,a,o=e[r],i=o[0],c=null!=(t=M[i])?t:null;if(c!==(null!=(a=O.current[i])?a:null))for(var u,l=n(o[1]);!(u=l()).done;)(0,u.value)();O.current[i]=c}}),[M]),{searchParams:b,updateParams:B,clearParams:C,getParams:I,getParam:function(r,e){var t=String(r);return!0===(null==e?void 0:e.convert)?R(b.get(t),t):E(t,M)},onChange:_}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("react-router-dom"),e=require("react");function t(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=Array(e);t<e;t++)n[t]=r[t];return n}function n(r,e){var n="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(n)return(n=n.call(r)).next.bind(n);if(Array.isArray(r)||(n=function(r,e){if(r){if("string"==typeof r)return t(r,e);var n={}.toString.call(r).slice(8,-1);return"Object"===n&&r.constructor&&(n=r.constructor.name),"Map"===n||"Set"===n?Array.from(r):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?t(r,e):void 0}}(r))||e&&r&&"number"==typeof r.length){n&&(r=n);var a=0;return function(){return a>=r.length?{done:!0}:{done:!1,value:r[a++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function a(){return(a=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)({}).hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}).apply(null,arguments)}exports.useMagicSearchParams=function(t){var o=t.mandatory,i=void 0===o?{}:o,c=t.optional,u=void 0===c?{}:c,s=t.defaultParams,l=void 0===s?{}:s,f=t.arraySerialization,v=void 0===f?"csv":f,y=t.forceParams,p=void 0===y?{}:y,d=t.omitParamsByValues,m=void 0===d?[]:d,g=r.useSearchParams(),b=g[0],A=g[1],h=e.useRef({}),O=e.useRef({}),j=e.useMemo((function(){return a({},i,u)}),[i,u]),P=e.useMemo((function(){return Array.from(Object.keys(j))}),[j]),k=e.useMemo((function(){return Object.keys(j).filter((function(r){return Array.isArray(j[r])}))}),[j]),S=function(r){console.log({PARAMS_RECIBIDOS_TRANSFORM:r});for(var e=new URLSearchParams,t=0,a=Object.keys(r);t<a.length;t++){var o=a[t];if(Array.isArray(j[o])){var i=r[o];switch(console.log({arrayValue:i}),v){case"csv":var c=i.join(",");e.set(o,c);break;case"repeat":for(var u,s=n(i);!(u=s()).done;)e.append(o,u.value);break;case"brackets":for(var l,f=n(i);!(l=f()).done;)e.append(o+"[]",l.value);break;default:var y=i.join(",");e.set(o,y)}}else e.set(o,r[o])}return e},w=function(r){var e=r.compareParams;return Object.entries(r.paramsForced).every((function(r){return e[r[0]]===r[1]}))};e.useEffect((function(){var r=Object.keys(l),e=Object.keys(p);0===r.length&&0===e.length||function(){var e=S(l).toString(),t=I(),n=S(t).toString(),o=S(p).toString();if(console.log({defaultParamsString:e}),w({paramsForced:p,compareParams:t})){var i=w({paramsForced:o,compareParams:l});if(r.length>0&&i){if(e===n)return;_({newParams:l})}}else _({newParams:a({},l,p)})}()}),[]);var M=function(r,e){if("number"==typeof j[e])return parseInt(r);if("boolean"==typeof j[e])return"true"===r;if(Array.isArray(j[e])){if("csv"===v)return b.getAll(e).join("").split(",");if("repeat"===v)return console.log({SEARCH_PARAMS:b.getAll(e)}),b.getAll(e);if("brackets"===v)return b.getAll(e+"[]")}return r},R=function(r,e){if(Array.isArray(j[r])){var t;if("brackets"===v){var n,a=b.getAll(r+"[]"),o=S((n={},n[r]=a,n)).toString();return decodeURIComponent(o)}if("csv"===v){var i,c=b.getAll(r),u=S((i={},i[r]=c,i)).toString();return decodeURIComponent(u)}var s=b.getAll(r);return S((t={},t[r]=s,t)).toString()}return e[r]},E=e.useMemo((function(){return"brackets"===v?function(r){for(var e,t={},a=n(r.entries());!(e=a()).done;){var o=e.value,i=o[0],c=o[1];if(i.endsWith("[]")){var u=i.replace("[]","");t[u]?t[u].push(c):t[u]=[c]}else t[i]?Array.isArray(t[i])?t[i].push(c):t[i]=[t[i],c]:t[i]=c}return t}(b):Object.fromEntries(b.entries())}),[b,v]),I=function(r){var e=(void 0===r?{}:r).convert,t=void 0===e||e;return Object.keys(E).reduce((function(r,e){return Object.prototype.hasOwnProperty.call(j,e)&&(r["brackets"===v?e.replace("[]",""):e]=!0===t?M(E[e],e):R(e,E)),r}),{})},C=function(r){var e,t=(void 0===r?{}:r).keepMandatoryParams,n=S(a({},i,(void 0===t||t)&&a({},(e=I({convert:k.length>0}),Object.keys(e).reduce((function(r,t){return Object.prototype.hasOwnProperty.call(i,t)&&(r[t]=e[t]),r}),{}))),p));A(n)},_=function(r){var e=void 0===r?{}:r,t=e.newParams,n=void 0===t?{}:t,o=e.keepParams,c=void 0===o?{}:o;if(0!==Object.keys(n).length||0!==Object.keys(c).length){var u,s=function(r,e){var t=a({},r);return 0===k.length||k.forEach((function(r){var n=[];switch(v){case"csv":n=(b.get(r)||"").split(",").map((function(r){return r.trim()})).filter(Boolean);break;case"repeat":var a=b.getAll(r);n=a.length>0?a:[];break;case"brackets":var o=b.getAll(r+"[]");n=o.length>0?o:[];break;default:var i;n=(null!=(i=b.get(r))?i:"").split(",").map((function(r){return r.trim()})).filter(Boolean)}if(void 0!==e[r]){var c,u=e[r];c="string"==typeof u?n.includes(u)?n.filter((function(r){return r!==u})):[].concat(n,[u]):Array.isArray(u)?Array.from(new Set([].concat(u))):n,t[r]=c}})),t}(function(r,e){var t=I(),n=Object.entries(r).filter((function(r){return!Array.isArray(j[r[0]])})),o=Object.assign(a({},t,Object.fromEntries(n),p)),c=Object.keys(o).reduce((function(r,t){return Object.prototype.hasOwnProperty.call(e,t)&&!1===e[t]||0==!!o[t]||m.includes(o[t])||(r[t]=o[t]),r}),{});return a({},i,c)}(n,c),n),l=(u=s,P.reduce((function(r,e){return Object.prototype.hasOwnProperty.call(u,e)&&(r[e]=u[e]),r}),{}));A(S(l))}else C()},B=e.useCallback((function(r,e){var t=String(r);h.current[t]=e}),[]);return e.useEffect((function(){for(var r=0,e=Object.entries(h.current);r<e.length;r++){var t,a,o=e[r],i=o[0],c=null!=(t=E[i])?t:null;if(c!==(null!=(a=O.current[i])?a:null))for(var u,s=n(o[1]);!(u=s()).done;)(0,u.value)();O.current[i]=c}}),[E]),{searchParams:b,updateParams:_,clearParams:C,getParams:I,getParam:function(r,e){var t=String(r);return!0===(null==e?void 0:e.convert)?M(b.get(t),t):R(t,E)},onChange:B}};
2
2
  //# sourceMappingURL=react-magic-search-params.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-magic-search-params.cjs.production.min.js","sources":["../src/useMagicSearchParams.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom'\r\nimport { useMemo, useEffect, useRef, useCallback } from 'react'\r\n\r\n\r\n// Custom hook with advanced techniques to handle search parameters for any pagination\r\n\r\ntype CommonParams = {\r\n page?: number\r\n page_size?: number\r\n}\r\n/*\r\nMaps all properties of M (mandatory) as required\r\nand all properties of O (optional) as optional. \r\n*/\r\ntype MergeParams<M, O> = {\r\n [K in keyof M]: M[K]\r\n} & {\r\n [K in keyof O]?: O[K]\r\n}\r\n/**\r\n * Interface for the configuration object that the hook receives \r\n */\r\nexport interface UseMagicSearchParamsOptions<\r\n M extends Record<string, unknown>,\r\n O extends Record<string, unknown>\r\n> {\r\n mandatory: M \r\n optional?: O\r\n defaultParams?: Partial<MergeParams<M, O>>\r\n forceParams?: Partial<MergeParams<M, O>> // transform all to partial to avoid errors\r\n arraySerialization?: 'csv' | 'repeat' | 'brackets' // technical to serialize arrays in the URL\r\n omitParamsByValues?: Array<'all' | 'default' | 'unknown' | 'none' | 'void '> \r\n}\r\n\r\n/** \r\nGeneric hook to handle search parameters in the URL\r\n@param mandatory - Mandatory parameters (e.g., page=1, page_size=10, etc.)\r\n@param optional - Optional parameters (e.g., order, search, etc.)\r\n@param defaultParams - Default parameters sent in the URL on initialization\r\n@param forceParams - Parameters forced into the URL regardless of user input\r\n@param omitParamsByValues - Parameters omitted if they have specific values \r\n*/\r\nexport const useMagicSearchParams = <\r\n M extends Record<string, unknown> & CommonParams,\r\n O extends Record<string, unknown>,\r\n>({\r\n mandatory = {} as M,\r\n optional = {} as O,\r\n defaultParams = {} as Partial<MergeParams<M, O>>,\r\n arraySerialization = 'csv',\r\n forceParams = {} as {} as Partial<MergeParams<M, O>>,\r\n omitParamsByValues = [] as Array<'all' | 'default' | 'unknown' | 'none' | 'void '>\r\n}: UseMagicSearchParamsOptions<M, O>)=> {\r\n\r\n const [searchParams, setSearchParams] = useSearchParams() \r\n // Ref to store subscriptions: { paramName: [callback1, callback2, ...] }\r\n const subscriptionsRef = useRef<Record<string, Array<() => unknown>>>({}); \r\n const previousParamsRef = useRef<Record<string, unknown>>({})\r\n\r\n const TOTAL_PARAMS_PAGE: MergeParams<M, O> = useMemo(() => {\r\n return { ...mandatory, ...optional };\r\n }, [mandatory, optional]);\r\n\r\n const PARAM_ORDER = useMemo(() => {\r\n return Array.from(Object.keys(TOTAL_PARAMS_PAGE))\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n // we get the keys that are arrays according to TOTAL_PARAMS_PAGE since these require special treatment in the URL due to serialization mode\r\n const ARRAY_KEYS = useMemo(() => {\r\n return Object.keys(TOTAL_PARAMS_PAGE).filter(\r\n (key) => Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n );\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n const appendArrayValues = (\r\n finallyParams: Record<string, unknown>,\r\n newParams: Record<string, string | string[] | unknown>\r\n ): Record<string, unknown> => {\r\n \r\n // Note: We cannot modify the object of the final parameters directly, as immutability must be maintained\r\n const updatedParams = { ...finallyParams };\r\n \r\n\r\n if (ARRAY_KEYS.length === 0) return updatedParams;\r\n \r\n ARRAY_KEYS.forEach((key) => {\r\n // We use the current values directly from searchParams (source of truth)\r\n // This avoids depending on finallyParams in which the arrays have been omitted\r\n let currentValues = []; \r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const raw = searchParams.get(key) || '';\r\n // For csv we expect \"value1,value2,...\" (no prefix)\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean) as Array<string>\r\n break;\r\n }\r\n case 'repeat': {\r\n // Here we get all ocurrences of key\r\n const urlParams = searchParams.getAll(key) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n \r\n console.log({REPEAT: currentValues})\r\n break;\r\n }\r\n case 'brackets': {\r\n // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)\r\n const urlParams = searchParams.getAll(`${key}[]`) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n console.log({BRACKETS: urlParams})\r\n \r\n \r\n break;\r\n }\r\n default: {\r\n // Mode by default works as csv\r\n const raw = searchParams.get(key) ?? '';\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean);\r\n }\r\n break; \r\n }\r\n // Update array values with new ones\r\n \r\n if (newParams[key] !== undefined) {\r\n const incoming = newParams[key];\r\n let combined: string[] = []\r\n if (typeof incoming === 'string') {\r\n // If it is a string, it is toggled (add/remove)\r\n combined = currentValues.includes(incoming)\r\n ? currentValues.filter((v) => v !== incoming)\r\n : [...currentValues, incoming];\r\n console.log({currentValues})\r\n console.log({incoming})\r\n console.log({CONBINED_STRING: combined})\r\n } else if (Array.isArray(incoming)) {\r\n // if an array is passed, repeated values are merged into a single value\r\n // Note: Set is used to remove duplicates\r\n combined = Array.from(new Set([ ...incoming]));\r\n console.log({incoming})\r\n console.log({combined})\r\n } else {\r\n \r\n combined = currentValues;\r\n }\r\n\r\n updatedParams[key] = combined\r\n\r\n }\r\n });\r\n return updatedParams\r\n };\r\n\r\n const transformParamsToURLSearch = (params: Record<string, unknown>): URLSearchParams => {\r\n console.log({PARAMS_RECIBIDOS_TRANSFORM: params})\r\n\r\n const newParam: URLSearchParams = new URLSearchParams()\r\n\r\n const paramsKeys = Object.keys(params)\r\n\r\n for (const key of paramsKeys) {\r\n if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n const arrayValue = params[key] as unknown[]\r\n console.log({arrayValue})\r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const csvValue = arrayValue.join(',')\r\n // set ensure that the previous value is replaced\r\n newParam.set(key, csvValue)\r\n break\r\n } case 'repeat': {\r\n \r\n for (const item of arrayValue) {\r\n console.log({item})\r\n // add new value to the key, instead of replacing it\r\n newParam.append(key, item as string)\r\n \r\n }\r\n break\r\n } case 'brackets': {\r\n for (const item of arrayValue) {\r\n newParam.append(`${key}[]`, item as string)\r\n }\r\n break\r\n } default: {\r\n const csvValue = arrayValue.join(',')\r\n newParam.set(key, csvValue)\r\n }\r\n }\r\n } else {\r\n newParam.set(key, params[key] as string)\r\n }\r\n }\r\n return newParam\r\n }\r\n // @ts-ignore\r\n const hasForcedParamsValues = ({ paramsForced, compareParams }) => {\r\n\r\n // Iterates over the forced parameters and verifies that they exist in the URL and match their values\r\n // Ej: { page: 1, page_size: 10 } === { page: 1, page_size: 10 } => true\r\n const allParamsMatch = Object.entries(paramsForced).every(\r\n ([key, value]) => compareParams[key] === value\r\n );\r\n\r\n return allParamsMatch;\r\n };\r\n \r\n useEffect(() => {\r\n\r\n const keysDefaultParams: string[] = Object.keys(defaultParams)\r\n const keysForceParams: string[] = Object.keys(forceParams)\r\n if(keysDefaultParams.length === 0 && keysForceParams.length === 0) return\r\n \r\n\r\n function handleStartingParams() {\r\n\r\n const defaultParamsString = transformParamsToURLSearch(defaultParams).toString()\r\n const paramsUrl = getParams()\r\n const paramsUrlString = transformParamsToURLSearch(paramsUrl).toString()\r\n const forceParamsString = transformParamsToURLSearch(forceParams).toString()\r\n\r\n console.log({defaultParamsString})\r\n\r\n const isForcedParams: boolean = hasForcedParamsValues({ paramsForced: forceParams, compareParams: paramsUrl })\r\n\r\n if (!isForcedParams) {\r\n\r\n // In this case, the forced parameters take precedence over the default parameters and the parameters of the current URL (which could have been modified by the user, e.g., page_size=1000)\r\n\r\n updateParams({ newParams: {\r\n ...defaultParams,\r\n ...forceParams\r\n }})\r\n return\r\n }\r\n // In this way it will be validated that the forced parameters keys and values are in the current URL\r\n const isIncludesForcedParams = hasForcedParamsValues({ paramsForced: forceParamsString, compareParams: defaultParams })\r\n\r\n if (keysDefaultParams.length > 0 && isIncludesForcedParams) {\r\n if (defaultParamsString === paramsUrlString) return // this means that the URL already has the default parameters\r\n updateParams({ newParams: defaultParams })\r\n }\r\n\r\n }\r\n handleStartingParams()\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Convert a string value to its original type (number, boolean, array) according to TOTAL_PARAMS_PAGE\r\n * @param value - Chain obtained from the URL\r\n * @param key - Key of the parameter\r\n */\r\n const convertOriginalType = (value: string, key: string) => {\r\n // Given that the parameters of a URL are recieved as strings, they are converted to their original type\r\n if (typeof TOTAL_PARAMS_PAGE[key] === 'number') {\r\n return parseInt(value)\r\n } else if (typeof TOTAL_PARAMS_PAGE[key] === 'boolean') {\r\n return value === 'true'\r\n } else if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n // The result will be a valid array represented in the URL ej: tags=tag1,tag2,tag3 to ['tag1', 'tag2', 'tag3'], useful to combine the values of the arrays with the new ones\r\n \r\n if (arraySerialization === 'csv') {\r\n return searchParams.getAll(key).join('').split(',')\r\n } else if (arraySerialization === 'repeat') {\r\n \r\n console.log({SEARCH_PARAMS: searchParams.getAll(key)})\r\n return searchParams.getAll(key)\r\n } else if (arraySerialization === 'brackets') {\r\n return searchParams.getAll(`${key}[]`)\r\n }\r\n \r\n \r\n }\r\n // Note: dates are not converted as it is better to handle them directly in the component that receives them, using a library like < date-fns >\r\n return value\r\n }\r\n \r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n */\r\n const getStringUrl = (key: string, paramsUrl: Record<string, unknown>) => {\r\n const isKeyArray = Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n if (isKeyArray) {\r\n\r\n if (arraySerialization === 'brackets') {\r\n\r\n const arrayUrl = searchParams.getAll(`${key}[]`)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayUrl }).toString()\r\n // in this way the array of the URL is decoded to its original form ej: tags[]=tag1&tags[]=tag2&tags[]=tag3\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n } else if (arraySerialization === 'csv') {\r\n const arrayValue = searchParams.getAll(key)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n }\r\n const arrayValue = searchParams.getAll(key)\r\n const stringResult = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n return stringResult\r\n } else {\r\n \r\n return paramsUrl[key] as string\r\n }\r\n }\r\n const getParamsObj = (searchParams: URLSearchParams): Record<string, string | string[]> => {\r\n const paramsObj: Record<string, string | string[]> = {};\r\n // @ts-ignore\r\n for (const [key, value] of searchParams.entries()) {\r\n if (key.endsWith('[]')) {\r\n const bareKey = key.replace('[]', '');\r\n if (paramsObj[bareKey]) {\r\n (paramsObj[bareKey] as string[]).push(value);\r\n } else {\r\n paramsObj[bareKey] = [value];\r\n }\r\n } else {\r\n // If the key already exists, it is a repeated parameter\r\n if (paramsObj[key]) {\r\n if (Array.isArray(paramsObj[key])) {\r\n (paramsObj[key] as string[]).push(value);\r\n } else {\r\n paramsObj[key] = [paramsObj[key] as string, value];\r\n }\r\n } else {\r\n paramsObj[key] = value;\r\n }\r\n }\r\n }\r\n return paramsObj;\r\n }\r\n // Optimization: While the parameters are not updated, the current parameters of the URL are not recalculated\r\n const CURRENT_PARAMS_URL: Record<string, unknown> = useMemo(() => {\r\n\r\n return arraySerialization === 'brackets' ? getParamsObj(searchParams) : Object.fromEntries(searchParams.entries())\r\n }, [searchParams, arraySerialization])\r\n\r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n * @returns - Returns the current parameters of the URL\r\n */\r\n const getParams = ({ convert = true } = {}): MergeParams<M, O> => {\r\n // All the paramteres are extracted from the URL and converted into an object\r\n\r\n const params = Object.keys(CURRENT_PARAMS_URL).reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(TOTAL_PARAMS_PAGE, key)) {\r\n const realKey = arraySerialization === 'brackets' ? key.replace('[]', '') : key\r\n // @ts-ignore\r\n acc[realKey] = convert === true\r\n ? convertOriginalType(CURRENT_PARAMS_URL[key] as string, key)\r\n : getStringUrl(key, CURRENT_PARAMS_URL)\r\n }\r\n return acc\r\n }, {})\r\n \r\n return params as MergeParams<M, O>\r\n }\r\n type keys = keyof MergeParams<M, O>\r\n // Note: in this way the return of the getParam function is typed dynamically, thus having autocomplete in the IDE (eg: value.split(','))\r\n type TagReturn<T extends boolean> = T extends true ? string[] : string;\r\n /**\r\n * Gets the value of a parameter from the URL and converts it to its original type if desired\r\n * @param key - Key of the parameter\r\n * @param options - Options to convert the value to its original type, default is true\r\n * @returns - Returns the value of the parameter\r\n */\r\n\r\n const getParam = <T extends boolean>(key: keys, options?: { convert: T }): TagReturn<T> => {\r\n\r\n const keyStr = String(key)\r\n // @ts-ignore\r\n const value = options?.convert === true ? convertOriginalType(searchParams.get(keyStr), keyStr) : getStringUrl(keyStr, CURRENT_PARAMS_URL)\r\n return value as TagReturn<T> \r\n }\r\n \r\n type OptionalParamsFiltered = Partial<O>\r\n\r\n const calculateOmittedParameters = (newParams: Record<string, unknown | unknown[]>, keepParams: Record<string, boolean>) => {\r\n // Calculate the ommited parameters, that is, the parameters that have not been sent in the request\r\n const params = getParams()\r\n // hasOw\r\n // Note: it will be necessary to omit the parameters that are arrays because the idea is not to replace them but to add or remove some values\r\n const newParamsWithoutArray = Object.entries(newParams).filter(([key,]) => !Array.isArray(TOTAL_PARAMS_PAGE[key]))\r\n const result = Object.assign({\r\n ...params,\r\n ...Object.fromEntries(newParamsWithoutArray),\r\n ...forceParams // the forced parameters will always be sent and will maintain their value\r\n })\r\n const paramsFiltered: OptionalParamsFiltered = Object.keys(result).reduce((acc, key) => {\r\n // for default no parameters are omitted unless specified in the keepParams object\r\n if (Object.prototype.hasOwnProperty.call(keepParams, key) && keepParams[key] === false) {\r\n return acc\r\n // Note: They array of parameters omitted by values (e.g., ['all', 'default']) are omitted since they are usually a default value that is not desired to be sent\r\n } else if (!!result[key] !== false && !omitParamsByValues.includes(result[key])) {\r\n // @ts-ignore\r\n acc[key] = result[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n return {\r\n ...mandatory,\r\n ...paramsFiltered\r\n } \r\n }\r\n // @ts-ignore\r\n const sortParameters = (paramsFiltered) => {\r\n // sort the parameters according to the structure so that it persists with each change in the URL, eg: localhost:3000/?page=1&page_size=10\r\n // Note: this visibly improves the user experience\r\n const orderedParams = PARAM_ORDER.reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(paramsFiltered, key)) {\r\n // @ts-ignore\r\n acc[key] = paramsFiltered[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n return orderedParams\r\n }\r\n\r\n const mandatoryParameters = () => {\r\n // Note: in case there are arrays in the URL, they are converted to their original form ej: tags=['tag1', 'tag2'] otherwise the parameters are extracted without converting to optimize performance\r\n const isNecessaryConvert: boolean = ARRAY_KEYS.length > 0 ? true : false\r\n const totalParametros: Record<string, unknown> = getParams({ convert: isNecessaryConvert })\r\n\r\n const paramsUrlFound: Record<string, boolean> = Object.keys(totalParametros).reduce(\r\n (acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(mandatory, key)) {\r\n // @ts-ignore\r\n acc[key] = totalParametros[key]\r\n }\r\n return acc\r\n },\r\n {}\r\n )\r\n\r\n return paramsUrlFound\r\n }\r\n /**\r\n clears the parameters of the URL, keeping the mandatory parameters\r\n * @param keepMandatoryParams - If true, the mandatory parameters are kept in the URL\r\n */\r\n\r\n const clearParams = ({ keepMandatoryParams = true } = {}): void => {\r\n // for default, the mandatory parameters are not cleared since the current pagination would be lost\r\n const paramsTransformed = transformParamsToURLSearch(\r\n {\r\n ...mandatory,\r\n \r\n ...(keepMandatoryParams && {\r\n ...mandatoryParameters()\r\n }),\r\n ...forceParams \r\n }\r\n )\r\n setSearchParams(paramsTransformed) \r\n }\r\n\r\n // transforms the keys to boolean to know which parameters to keep\r\n type KeepParamsTransformedValuesBoolean = Partial<Record<keyof typeof TOTAL_PARAMS_PAGE, boolean>>\r\n type NewParams = Partial<typeof TOTAL_PARAMS_PAGE> \r\n type KeepParams = KeepParamsTransformedValuesBoolean\r\n /**\r\n Merges the new parameters with the current ones, omits the parameters that are not sent and sorts them according to the structure\r\n * @param newParams - New parameters to be sent in the URL\r\n * @param keepParams - Parameters to keep in the URL, default is true\r\n */\r\n const updateParams = ({ newParams = {} as NewParams, keepParams = {} as KeepParams } = {}) => {\r\n\r\n if (\r\n Object.keys(newParams).length === 0 &&\r\n Object.keys(keepParams).length === 0\r\n ) {\r\n clearParams()\r\n return\r\n }\r\n // @ts-ignore\r\n const finallyParamters = calculateOmittedParameters(newParams, keepParams)\r\n\r\n const convertedArrayValues = appendArrayValues(finallyParamters, newParams)\r\n\r\n const paramsSorted = sortParameters(convertedArrayValues)\r\n\r\n setSearchParams(transformParamsToURLSearch(paramsSorted))\r\n\r\n }\r\n\r\n /**\r\n * @param paramName - Name of the parameter to subscribe to\r\n * @param callbacks - Callbacks to be executed when the parameter changes\r\n * @returns - Returns the function to unsubscribe\r\n */\r\n const onChange = useCallback( (paramName: keys, callbacks: Array<() => void>) => {\r\n const paramNameStr = String(paramName)\r\n // replace the previous callbacks with the new ones so as not to accumulate callbacks\r\n subscriptionsRef.current[paramNameStr] = callbacks;\r\n }, [])\r\n \r\n // each time searchParams changes, we notify the subscribers\r\n useEffect(() => {\r\n\r\n for (const [key, value] of Object.entries(subscriptionsRef.current)) {\r\n\r\n const newValue = CURRENT_PARAMS_URL[key] ?? null \r\n const oldValue = previousParamsRef.current[key] ?? null\r\n if (newValue !== oldValue) {\r\n \r\n for (const callback of value) {\r\n callback()\r\n\r\n }\r\n }\r\n // once the callback is executed, the previous value is updated to ensure that the next time the value changes, the callback is executed\r\n previousParamsRef.current[key] = newValue\r\n }\r\n\r\n \r\n }, [CURRENT_PARAMS_URL])\r\n return {\r\n searchParams,\r\n updateParams,\r\n clearParams,\r\n getParams,\r\n getParam,\r\n onChange\r\n }\r\n}\r\n\r\n"],"names":["_ref","mandatory","_ref$mandatory","_ref$optional","optional","_ref$defaultParams","defaultParams","_ref$arraySerializati","arraySerialization","_ref$forceParams","forceParams","_ref$omitParamsByValu","omitParamsByValues","_useSearchParams","useSearchParams","searchParams","setSearchParams","subscriptionsRef","useRef","previousParamsRef","TOTAL_PARAMS_PAGE","useMemo","_extends","PARAM_ORDER","Array","from","Object","keys","ARRAY_KEYS","filter","key","isArray","transformParamsToURLSearch","params","console","log","PARAMS_RECIBIDOS_TRANSFORM","newParam","URLSearchParams","_i","_paramsKeys","length","arrayValue","csvValue","join","set","_step","_iterator","_createForOfIteratorHelperLoose","done","item","value","append","_step2","_iterator2","hasForcedParamsValues","_ref2","compareParams","entries","paramsForced","every","_ref3","useEffect","keysDefaultParams","keysForceParams","defaultParamsString","toString","paramsUrl","getParams","paramsUrlString","forceParamsString","isIncludesForcedParams","updateParams","newParams","handleStartingParams","convertOriginalType","parseInt","getAll","split","SEARCH_PARAMS","getStringUrl","_transformParamsToURL3","_transformParamsToURL","arrayUrl","encodedQueryArray","decodeURIComponent","_transformParamsToURL2","CURRENT_PARAMS_URL","_step3","paramsObj","_iterator3","_step3$value","endsWith","bareKey","replace","push","getParamsObj","fromEntries","_temp","_ref4$convert","convert","reduce","acc","prototype","hasOwnProperty","call","clearParams","_temp2","totalParametros","_ref6$keepMandatoryPa","keepMandatoryParams","paramsTransformed","_temp3","_ref7$newParams","_ref7","_ref7$keepParams","keepParams","paramsFiltered","convertedArrayValues","finallyParams","updatedParams","forEach","currentValues","get","map","v","trim","Boolean","urlParams","REPEAT","BRACKETS","_searchParams$get","undefined","incoming","combined","includes","concat","CONBINED_STRING","Set","appendArrayValues","newParamsWithoutArray","_ref5","result","assign","calculateOmittedParameters","paramsSorted","onChange","useCallback","paramName","callbacks","paramNameStr","String","current","_i2","_Object$entries","_CURRENT_PARAMS_URL$k","_previousParamsRef$cu","_Object$entries$_i","newValue","_step4","_iterator4","callback","getParam","options","keyStr"],"mappings":"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"}
1
+ {"version":3,"file":"react-magic-search-params.cjs.production.min.js","sources":["../src/useMagicSearchParams.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom'\r\nimport { useMemo, useEffect, useRef, useCallback } from 'react'\r\n\r\n\r\n// Custom hook with advanced techniques to handle search parameters for any pagination\r\n\r\ntype CommonParams = {\r\n page?: number\r\n page_size?: number\r\n}\r\n/*\r\nMaps all properties of M (mandatory) as required\r\nand all properties of O (optional) as optional. \r\n*/\r\ntype MergeParams<M, O> = {\r\n [K in keyof M]: M[K]\r\n} & {\r\n [K in keyof O]?: O[K]\r\n}\r\n/**\r\n * Interface for the configuration object that the hook receives \r\n */\r\nexport interface UseMagicSearchParamsOptions<\r\n M extends Record<string, unknown>,\r\n O extends Record<string, unknown>\r\n> {\r\n mandatory: M \r\n optional?: O\r\n defaultParams?: Partial<MergeParams<M, O>>\r\n forceParams?: Partial<MergeParams<M, O>> // transform all to partial to avoid errors\r\n arraySerialization?: 'csv' | 'repeat' | 'brackets' // technical to serialize arrays in the URL\r\n omitParamsByValues?: Array<'all' | 'default' | 'unknown' | 'none' | 'void '> \r\n}\r\n\r\n/** \r\nGeneric hook to handle search parameters in the URL\r\n@param mandatory - Mandatory parameters (e.g., page=1, page_size=10, etc.)\r\n@param optional - Optional parameters (e.g., order, search, etc.)\r\n@param defaultParams - Default parameters sent in the URL on initialization\r\n@param forceParams - Parameters forced into the URL regardless of user input\r\n@param omitParamsByValues - Parameters omitted if they have specific values \r\n*/\r\nexport const useMagicSearchParams = <\r\n M extends Record<string, unknown> & CommonParams,\r\n O extends Record<string, unknown>,\r\n>({\r\n mandatory = {} as M,\r\n optional = {} as O,\r\n defaultParams = {} as Partial<MergeParams<M, O>>,\r\n arraySerialization = 'csv',\r\n forceParams = {} as {} as Partial<MergeParams<M, O>>,\r\n omitParamsByValues = [] as Array<'all' | 'default' | 'unknown' | 'none' | 'void '>\r\n}: UseMagicSearchParamsOptions<M, O>)=> {\r\n\r\n const [searchParams, setSearchParams] = useSearchParams() \r\n // Ref to store subscriptions: { paramName: [callback1, callback2, ...] }\r\n const subscriptionsRef = useRef<Record<string, Array<() => unknown>>>({}); \r\n const previousParamsRef = useRef<Record<string, unknown>>({})\r\n\r\n const TOTAL_PARAMS_PAGE: MergeParams<M, O> = useMemo(() => {\r\n return { ...mandatory, ...optional };\r\n }, [mandatory, optional]);\r\n\r\n const PARAM_ORDER = useMemo(() => {\r\n return Array.from(Object.keys(TOTAL_PARAMS_PAGE))\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n // we get the keys that are arrays according to TOTAL_PARAMS_PAGE since these require special treatment in the URL due to serialization mode\r\n const ARRAY_KEYS = useMemo(() => {\r\n return Object.keys(TOTAL_PARAMS_PAGE).filter(\r\n (key) => Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n );\r\n }, [TOTAL_PARAMS_PAGE])\r\n\r\n const appendArrayValues = (\r\n finallyParams: Record<string, unknown>,\r\n newParams: Record<string, string | string[] | unknown>\r\n ): Record<string, unknown> => {\r\n \r\n // Note: We cannot modify the object of the final parameters directly, as immutability must be maintained\r\n const updatedParams = { ...finallyParams };\r\n \r\n if (ARRAY_KEYS.length === 0) return updatedParams;\r\n \r\n ARRAY_KEYS.forEach((key) => {\r\n // We use the current values directly from searchParams (source of truth)\r\n // This avoids depending on finallyParams in which the arrays have been omitted\r\n let currentValues = []; \r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const raw = searchParams.get(key) || '';\r\n // For csv we expect \"value1,value2,...\" (no prefix)\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean) as Array<string>\r\n break;\r\n }\r\n case 'repeat': {\r\n // Here we get all ocurrences of key\r\n const urlParams = searchParams.getAll(key) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n\r\n break;\r\n }\r\n case 'brackets': {\r\n // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)\r\n const urlParams = searchParams.getAll(`${key}[]`) as Array<string>\r\n currentValues = urlParams.length > 0 ? urlParams : []\r\n\r\n break;\r\n }\r\n default: {\r\n // Mode by default works as csv\r\n const raw = searchParams.get(key) ?? '';\r\n currentValues = raw.split(',')\r\n .map((v) => v.trim())\r\n .filter(Boolean);\r\n }\r\n break; \r\n }\r\n // Update array values with new ones\r\n \r\n if (newParams[key] !== undefined) {\r\n const incoming = newParams[key];\r\n let combined: string[] = []\r\n if (typeof incoming === 'string') {\r\n // If it is a string, it is toggled (add/remove)\r\n combined = currentValues.includes(incoming)\r\n ? currentValues.filter((v) => v !== incoming)\r\n : [...currentValues, incoming];\r\n } else if (Array.isArray(incoming)) {\r\n // if an array is passed, repeated values are merged into a single value\r\n // Note: Set is used to remove duplicates\r\n combined = Array.from(new Set([ ...incoming]));\r\n\r\n } else {\r\n \r\n combined = currentValues;\r\n }\r\n\r\n updatedParams[key] = combined\r\n\r\n }\r\n });\r\n return updatedParams\r\n };\r\n\r\n const transformParamsToURLSearch = (params: Record<string, unknown>): URLSearchParams => {\r\n console.log({PARAMS_RECIBIDOS_TRANSFORM: params})\r\n\r\n const newParam: URLSearchParams = new URLSearchParams()\r\n\r\n const paramsKeys = Object.keys(params)\r\n\r\n for (const key of paramsKeys) {\r\n if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n const arrayValue = params[key] as unknown[]\r\n console.log({arrayValue})\r\n switch (arraySerialization) {\r\n case 'csv': {\r\n const csvValue = arrayValue.join(',')\r\n // set ensure that the previous value is replaced\r\n newParam.set(key, csvValue)\r\n break\r\n } case 'repeat': {\r\n \r\n for (const item of arrayValue) {\r\n\r\n // add new value to the key, instead of replacing it\r\n newParam.append(key, item as string)\r\n \r\n }\r\n break\r\n } case 'brackets': {\r\n for (const item of arrayValue) {\r\n newParam.append(`${key}[]`, item as string)\r\n }\r\n break\r\n } default: {\r\n const csvValue = arrayValue.join(',')\r\n newParam.set(key, csvValue)\r\n }\r\n }\r\n } else {\r\n newParam.set(key, params[key] as string)\r\n }\r\n }\r\n return newParam\r\n }\r\n // @ts-ignore\r\n const hasForcedParamsValues = ({ paramsForced, compareParams }) => {\r\n\r\n // Iterates over the forced parameters and verifies that they exist in the URL and match their values\r\n // Ej: { page: 1, page_size: 10 } === { page: 1, page_size: 10 } => true\r\n const allParamsMatch = Object.entries(paramsForced).every(\r\n ([key, value]) => compareParams[key] === value\r\n );\r\n\r\n return allParamsMatch;\r\n };\r\n \r\n useEffect(() => {\r\n\r\n const keysDefaultParams: string[] = Object.keys(defaultParams)\r\n const keysForceParams: string[] = Object.keys(forceParams)\r\n if(keysDefaultParams.length === 0 && keysForceParams.length === 0) return\r\n \r\n\r\n function handleStartingParams() {\r\n\r\n const defaultParamsString = transformParamsToURLSearch(defaultParams).toString()\r\n const paramsUrl = getParams()\r\n const paramsUrlString = transformParamsToURLSearch(paramsUrl).toString()\r\n const forceParamsString = transformParamsToURLSearch(forceParams).toString()\r\n\r\n console.log({defaultParamsString})\r\n\r\n const isForcedParams: boolean = hasForcedParamsValues({ paramsForced: forceParams, compareParams: paramsUrl })\r\n\r\n if (!isForcedParams) {\r\n\r\n // In this case, the forced parameters take precedence over the default parameters and the parameters of the current URL (which could have been modified by the user, e.g., page_size=1000)\r\n\r\n updateParams({ newParams: {\r\n ...defaultParams,\r\n ...forceParams\r\n }})\r\n return\r\n }\r\n // In this way it will be validated that the forced parameters keys and values are in the current URL\r\n const isIncludesForcedParams = hasForcedParamsValues({ paramsForced: forceParamsString, compareParams: defaultParams })\r\n\r\n if (keysDefaultParams.length > 0 && isIncludesForcedParams) {\r\n if (defaultParamsString === paramsUrlString) return // this means that the URL already has the default parameters\r\n updateParams({ newParams: defaultParams })\r\n }\r\n\r\n }\r\n handleStartingParams()\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Convert a string value to its original type (number, boolean, array) according to TOTAL_PARAMS_PAGE\r\n * @param value - Chain obtained from the URL\r\n * @param key - Key of the parameter\r\n */\r\n const convertOriginalType = (value: string, key: string) => {\r\n // Given that the parameters of a URL are recieved as strings, they are converted to their original type\r\n if (typeof TOTAL_PARAMS_PAGE[key] === 'number') {\r\n return parseInt(value)\r\n } else if (typeof TOTAL_PARAMS_PAGE[key] === 'boolean') {\r\n return value === 'true'\r\n } else if (Array.isArray(TOTAL_PARAMS_PAGE[key])) {\r\n // The result will be a valid array represented in the URL ej: tags=tag1,tag2,tag3 to ['tag1', 'tag2', 'tag3'], useful to combine the values of the arrays with the new ones\r\n \r\n if (arraySerialization === 'csv') {\r\n return searchParams.getAll(key).join('').split(',')\r\n } else if (arraySerialization === 'repeat') {\r\n \r\n console.log({SEARCH_PARAMS: searchParams.getAll(key)})\r\n return searchParams.getAll(key)\r\n } else if (arraySerialization === 'brackets') {\r\n return searchParams.getAll(`${key}[]`)\r\n }\r\n \r\n \r\n }\r\n // Note: dates are not converted as it is better to handle them directly in the component that receives them, using a library like < date-fns >\r\n return value\r\n }\r\n \r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n */\r\n const getStringUrl = (key: string, paramsUrl: Record<string, unknown>) => {\r\n const isKeyArray = Array.isArray(TOTAL_PARAMS_PAGE[key])\r\n if (isKeyArray) {\r\n\r\n if (arraySerialization === 'brackets') {\r\n\r\n const arrayUrl = searchParams.getAll(`${key}[]`)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayUrl }).toString()\r\n // in this way the array of the URL is decoded to its original form ej: tags[]=tag1&tags[]=tag2&tags[]=tag3\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n } else if (arraySerialization === 'csv') {\r\n const arrayValue = searchParams.getAll(key)\r\n const encodedQueryArray = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n const unencodeQuery = decodeURIComponent(encodedQueryArray)\r\n return unencodeQuery\r\n }\r\n const arrayValue = searchParams.getAll(key)\r\n const stringResult = transformParamsToURLSearch({ [key]: arrayValue }).toString()\r\n return stringResult\r\n } else {\r\n \r\n return paramsUrl[key] as string\r\n }\r\n }\r\n const getParamsObj = (searchParams: URLSearchParams): Record<string, string | string[]> => {\r\n const paramsObj: Record<string, string | string[]> = {};\r\n // @ts-ignore\r\n for (const [key, value] of searchParams.entries()) {\r\n if (key.endsWith('[]')) {\r\n const bareKey = key.replace('[]', '');\r\n if (paramsObj[bareKey]) {\r\n (paramsObj[bareKey] as string[]).push(value);\r\n } else {\r\n paramsObj[bareKey] = [value];\r\n }\r\n } else {\r\n // If the key already exists, it is a repeated parameter\r\n if (paramsObj[key]) {\r\n if (Array.isArray(paramsObj[key])) {\r\n (paramsObj[key] as string[]).push(value);\r\n } else {\r\n paramsObj[key] = [paramsObj[key] as string, value];\r\n }\r\n } else {\r\n paramsObj[key] = value;\r\n }\r\n }\r\n }\r\n return paramsObj;\r\n }\r\n // Optimization: While the parameters are not updated, the current parameters of the URL are not recalculated\r\n const CURRENT_PARAMS_URL: Record<string, unknown> = useMemo(() => {\r\n\r\n return arraySerialization === 'brackets' ? getParamsObj(searchParams) : Object.fromEntries(searchParams.entries())\r\n }, [searchParams, arraySerialization])\r\n\r\n /**\r\n * Gets the current parameters from the URL and converts them to their original type if desired\r\n * @param convert - If true, converts from string to the inferred type (number, boolean, ...)\r\n * @returns - Returns the current parameters of the URL\r\n */\r\n const getParams = ({ convert = true } = {}): MergeParams<M, O> => {\r\n // All the paramteres are extracted from the URL and converted into an object\r\n\r\n const params = Object.keys(CURRENT_PARAMS_URL).reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(TOTAL_PARAMS_PAGE, key)) {\r\n const realKey = arraySerialization === 'brackets' ? key.replace('[]', '') : key\r\n // @ts-ignore\r\n acc[realKey] = convert === true\r\n ? convertOriginalType(CURRENT_PARAMS_URL[key] as string, key)\r\n : getStringUrl(key, CURRENT_PARAMS_URL)\r\n }\r\n return acc\r\n }, {})\r\n \r\n return params as MergeParams<M, O>\r\n }\r\n type keys = keyof MergeParams<M, O>\r\n // Note: in this way the return of the getParam function is typed dynamically, thus having autocomplete in the IDE (eg: value.split(','))\r\n type TagReturn<T extends boolean> = T extends true ? string[] : string;\r\n /**\r\n * Gets the value of a parameter from the URL and converts it to its original type if desired\r\n * @param key - Key of the parameter\r\n * @param options - Options to convert the value to its original type, default is true\r\n * @returns - Returns the value of the parameter\r\n */\r\n\r\n const getParam = <T extends boolean>(key: keys, options?: { convert: T }): TagReturn<T> => {\r\n\r\n const keyStr = String(key)\r\n // @ts-ignore\r\n const value = options?.convert === true ? convertOriginalType(searchParams.get(keyStr), keyStr) : getStringUrl(keyStr, CURRENT_PARAMS_URL)\r\n return value as TagReturn<T> \r\n }\r\n \r\n type OptionalParamsFiltered = Partial<O>\r\n\r\n const calculateOmittedParameters = (newParams: Record<string, unknown | unknown[]>, keepParams: Record<string, boolean>) => {\r\n // Calculate the ommited parameters, that is, the parameters that have not been sent in the request\r\n const params = getParams()\r\n // hasOw\r\n // Note: it will be necessary to omit the parameters that are arrays because the idea is not to replace them but to add or remove some values\r\n const newParamsWithoutArray = Object.entries(newParams).filter(([key,]) => !Array.isArray(TOTAL_PARAMS_PAGE[key]))\r\n const result = Object.assign({\r\n ...params,\r\n ...Object.fromEntries(newParamsWithoutArray),\r\n ...forceParams // the forced parameters will always be sent and will maintain their value\r\n })\r\n const paramsFiltered: OptionalParamsFiltered = Object.keys(result).reduce((acc, key) => {\r\n // for default no parameters are omitted unless specified in the keepParams object\r\n if (Object.prototype.hasOwnProperty.call(keepParams, key) && keepParams[key] === false) {\r\n return acc\r\n // Note: They array of parameters omitted by values (e.g., ['all', 'default']) are omitted since they are usually a default value that is not desired to be sent\r\n } else if (!!result[key] !== false && !omitParamsByValues.includes(result[key])) {\r\n // @ts-ignore\r\n acc[key] = result[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n\r\n return {\r\n ...mandatory,\r\n ...paramsFiltered\r\n } \r\n }\r\n // @ts-ignore\r\n const sortParameters = (paramsFiltered) => {\r\n // sort the parameters according to the structure so that it persists with each change in the URL, eg: localhost:3000/?page=1&page_size=10\r\n // Note: this visibly improves the user experience\r\n const orderedParams = PARAM_ORDER.reduce((acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(paramsFiltered, key)) {\r\n // @ts-ignore\r\n acc[key] = paramsFiltered[key]\r\n }\r\n\r\n return acc\r\n }, {})\r\n return orderedParams\r\n }\r\n\r\n const mandatoryParameters = () => {\r\n // Note: in case there are arrays in the URL, they are converted to their original form ej: tags=['tag1', 'tag2'] otherwise the parameters are extracted without converting to optimize performance\r\n const isNecessaryConvert: boolean = ARRAY_KEYS.length > 0 ? true : false\r\n const totalParametros: Record<string, unknown> = getParams({ convert: isNecessaryConvert })\r\n\r\n const paramsUrlFound: Record<string, boolean> = Object.keys(totalParametros).reduce(\r\n (acc, key) => {\r\n if (Object.prototype.hasOwnProperty.call(mandatory, key)) {\r\n // @ts-ignore\r\n acc[key] = totalParametros[key]\r\n }\r\n return acc\r\n },\r\n {}\r\n )\r\n\r\n return paramsUrlFound\r\n }\r\n /**\r\n clears the parameters of the URL, keeping the mandatory parameters\r\n * @param keepMandatoryParams - If true, the mandatory parameters are kept in the URL\r\n */\r\n\r\n const clearParams = ({ keepMandatoryParams = true } = {}): void => {\r\n // for default, the mandatory parameters are not cleared since the current pagination would be lost\r\n const paramsTransformed = transformParamsToURLSearch(\r\n {\r\n ...mandatory,\r\n \r\n ...(keepMandatoryParams && {\r\n ...mandatoryParameters()\r\n }),\r\n ...forceParams \r\n }\r\n )\r\n setSearchParams(paramsTransformed) \r\n }\r\n\r\n // transforms the keys to boolean to know which parameters to keep\r\n type KeepParamsTransformedValuesBoolean = Partial<Record<keyof typeof TOTAL_PARAMS_PAGE, boolean>>\r\n type NewParams = Partial<typeof TOTAL_PARAMS_PAGE> \r\n type KeepParams = KeepParamsTransformedValuesBoolean\r\n /**\r\n Merges the new parameters with the current ones, omits the parameters that are not sent and sorts them according to the structure\r\n * @param newParams - New parameters to be sent in the URL\r\n * @param keepParams - Parameters to keep in the URL, default is true\r\n */\r\n const updateParams = ({ newParams = {} as NewParams, keepParams = {} as KeepParams } = {}) => {\r\n\r\n if (\r\n Object.keys(newParams).length === 0 &&\r\n Object.keys(keepParams).length === 0\r\n ) {\r\n clearParams()\r\n return\r\n }\r\n // @ts-ignore\r\n const finallyParamters = calculateOmittedParameters(newParams, keepParams)\r\n\r\n const convertedArrayValues = appendArrayValues(finallyParamters, newParams)\r\n\r\n const paramsSorted = sortParameters(convertedArrayValues)\r\n\r\n setSearchParams(transformParamsToURLSearch(paramsSorted))\r\n\r\n }\r\n\r\n /**\r\n * @param paramName - Name of the parameter to subscribe to\r\n * @param callbacks - Callbacks to be executed when the parameter changes\r\n * @returns - Returns the function to unsubscribe\r\n */\r\n const onChange = useCallback( (paramName: keys, callbacks: Array<() => void>) => {\r\n const paramNameStr = String(paramName)\r\n // replace the previous callbacks with the new ones so as not to accumulate callbacks\r\n subscriptionsRef.current[paramNameStr] = callbacks;\r\n }, [])\r\n \r\n // each time searchParams changes, we notify the subscribers\r\n useEffect(() => {\r\n\r\n for (const [key, value] of Object.entries(subscriptionsRef.current)) {\r\n\r\n const newValue = CURRENT_PARAMS_URL[key] ?? null \r\n const oldValue = previousParamsRef.current[key] ?? null\r\n if (newValue !== oldValue) {\r\n \r\n for (const callback of value) {\r\n callback()\r\n\r\n }\r\n }\r\n // once the callback is executed, the previous value is updated to ensure that the next time the value changes, the callback is executed\r\n previousParamsRef.current[key] = newValue\r\n }\r\n\r\n }, [CURRENT_PARAMS_URL])\r\n return {\r\n searchParams,\r\n updateParams,\r\n clearParams,\r\n getParams,\r\n getParam,\r\n onChange\r\n }\r\n}\r\n\r\n"],"names":["_ref","mandatory","_ref$mandatory","_ref$optional","optional","_ref$defaultParams","defaultParams","_ref$arraySerializati","arraySerialization","_ref$forceParams","forceParams","_ref$omitParamsByValu","omitParamsByValues","_useSearchParams","useSearchParams","searchParams","setSearchParams","subscriptionsRef","useRef","previousParamsRef","TOTAL_PARAMS_PAGE","useMemo","_extends","PARAM_ORDER","Array","from","Object","keys","ARRAY_KEYS","filter","key","isArray","transformParamsToURLSearch","params","console","log","PARAMS_RECIBIDOS_TRANSFORM","newParam","URLSearchParams","_i","_paramsKeys","length","arrayValue","csvValue","join","set","_step","_iterator","_createForOfIteratorHelperLoose","done","append","value","_step2","_iterator2","hasForcedParamsValues","_ref2","compareParams","entries","paramsForced","every","_ref3","useEffect","keysDefaultParams","keysForceParams","defaultParamsString","toString","paramsUrl","getParams","paramsUrlString","forceParamsString","isIncludesForcedParams","updateParams","newParams","handleStartingParams","convertOriginalType","parseInt","getAll","split","SEARCH_PARAMS","getStringUrl","_transformParamsToURL3","_transformParamsToURL","arrayUrl","encodedQueryArray","decodeURIComponent","_transformParamsToURL2","CURRENT_PARAMS_URL","_step3","paramsObj","_iterator3","_step3$value","endsWith","bareKey","replace","push","getParamsObj","fromEntries","_temp","_ref4$convert","convert","reduce","acc","prototype","hasOwnProperty","call","clearParams","_temp2","totalParametros","_ref6$keepMandatoryPa","keepMandatoryParams","paramsTransformed","_temp3","_ref7$newParams","_ref7","_ref7$keepParams","keepParams","paramsFiltered","convertedArrayValues","finallyParams","updatedParams","forEach","currentValues","get","map","v","trim","Boolean","urlParams","_searchParams$get","undefined","combined","incoming","includes","concat","Set","appendArrayValues","newParamsWithoutArray","_ref5","result","assign","calculateOmittedParameters","paramsSorted","onChange","useCallback","paramName","callbacks","paramNameStr","String","current","_i2","_Object$entries","_CURRENT_PARAMS_URL$k","_previousParamsRef$cu","_Object$entries$_i","newValue","_step4","_iterator4","callback","getParam","options","keyStr"],"mappings":"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"}
@@ -102,9 +102,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
102
102
  // Here we get all ocurrences of key
103
103
  var urlParams = searchParams.getAll(key);
104
104
  currentValues = urlParams.length > 0 ? urlParams : [];
105
- console.log({
106
- REPEAT: currentValues
107
- });
108
105
  break;
109
106
  }
110
107
  case 'brackets':
@@ -112,9 +109,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
112
109
  // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)
113
110
  var _urlParams = searchParams.getAll(key + "[]");
114
111
  currentValues = _urlParams.length > 0 ? _urlParams : [];
115
- console.log({
116
- BRACKETS: _urlParams
117
- });
118
112
  break;
119
113
  }
120
114
  default:
@@ -137,25 +131,10 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
137
131
  combined = currentValues.includes(incoming) ? currentValues.filter(function (v) {
138
132
  return v !== incoming;
139
133
  }) : [].concat(currentValues, [incoming]);
140
- console.log({
141
- currentValues: currentValues
142
- });
143
- console.log({
144
- incoming: incoming
145
- });
146
- console.log({
147
- CONBINED_STRING: combined
148
- });
149
134
  } else if (Array.isArray(incoming)) {
150
135
  // if an array is passed, repeated values are merged into a single value
151
136
  // Note: Set is used to remove duplicates
152
137
  combined = Array.from(new Set([].concat(incoming)));
153
- console.log({
154
- incoming: incoming
155
- });
156
- console.log({
157
- combined: combined
158
- });
159
138
  } else {
160
139
  combined = currentValues;
161
140
  }
@@ -189,9 +168,6 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
189
168
  {
190
169
  for (var _iterator = _createForOfIteratorHelperLoose(arrayValue), _step; !(_step = _iterator()).done;) {
191
170
  var item = _step.value;
192
- console.log({
193
- item: item
194
- });
195
171
  // add new value to the key, instead of replacing it
196
172
  newParam.append(key, item);
197
173
  }
@@ -513,4 +489,3 @@ var useMagicSearchParams = function useMagicSearchParams(_ref) {
513
489
  };
514
490
 
515
491
  export { useMagicSearchParams };
516
- //# sourceMappingURL=react-magic-search-params.esm.js.map
package/package.json CHANGED
@@ -17,7 +17,8 @@
17
17
  "use-query-parameters"
18
18
 
19
19
  ],
20
- "version": "1.1.4",
20
+ "version": "1.2.0",
21
+ "private": false,
21
22
  "license": "MIT",
22
23
  "main": "dist/index.js",
23
24
  "typings": "dist/index.d.ts",
@@ -35,7 +36,9 @@
35
36
  "lint": "tsdx lint",
36
37
  "prepare": "tsdx build",
37
38
  "size": "size-limit",
38
- "analyze": "size-limit --why"
39
+ "analyze": "size-limit --why",
40
+ "prepack": "copy README_NPM.md README.md",
41
+ "postpack": "git checkout -- README.md"
39
42
  },
40
43
  "peerDependencies": {
41
44
  "react": ">=16",
@@ -70,8 +73,8 @@
70
73
  "@types/react": "^19.0.10",
71
74
  "@types/react-dom": "^19.0.4",
72
75
  "husky": "^9.1.7",
73
- "react": "^19.0.0",
74
- "react-dom": "^19.0.0",
76
+ "react": "^18.2.0",
77
+ "react-dom": "^18.2.0",
75
78
  "size-limit": "^11.2.0",
76
79
  "tsdx": "^0.14.1",
77
80
  "tslib": "^2.8.1",
@@ -79,6 +82,7 @@
79
82
  "vitest": "^3.0.8",
80
83
  "@testing-library/react": "^16.2.0"
81
84
  },
85
+
82
86
  "exports": {
83
87
  ".": {
84
88
  "import": "./dist/react-magic-search-params.esm.js",
@@ -80,7 +80,6 @@ export const useMagicSearchParams = <
80
80
  // Note: We cannot modify the object of the final parameters directly, as immutability must be maintained
81
81
  const updatedParams = { ...finallyParams };
82
82
 
83
-
84
83
  if (ARRAY_KEYS.length === 0) return updatedParams;
85
84
 
86
85
  ARRAY_KEYS.forEach((key) => {
@@ -100,17 +99,14 @@ export const useMagicSearchParams = <
100
99
  // Here we get all ocurrences of key
101
100
  const urlParams = searchParams.getAll(key) as Array<string>
102
101
  currentValues = urlParams.length > 0 ? urlParams : []
103
-
104
- console.log({REPEAT: currentValues})
102
+
105
103
  break;
106
104
  }
107
105
  case 'brackets': {
108
106
  // Build URLSearchParams from current parameters (to ensure no serialized values are taken previously)
109
107
  const urlParams = searchParams.getAll(`${key}[]`) as Array<string>
110
108
  currentValues = urlParams.length > 0 ? urlParams : []
111
- console.log({BRACKETS: urlParams})
112
-
113
-
109
+
114
110
  break;
115
111
  }
116
112
  default: {
@@ -132,15 +128,11 @@ export const useMagicSearchParams = <
132
128
  combined = currentValues.includes(incoming)
133
129
  ? currentValues.filter((v) => v !== incoming)
134
130
  : [...currentValues, incoming];
135
- console.log({currentValues})
136
- console.log({incoming})
137
- console.log({CONBINED_STRING: combined})
138
131
  } else if (Array.isArray(incoming)) {
139
132
  // if an array is passed, repeated values are merged into a single value
140
133
  // Note: Set is used to remove duplicates
141
134
  combined = Array.from(new Set([ ...incoming]));
142
- console.log({incoming})
143
- console.log({combined})
135
+
144
136
  } else {
145
137
 
146
138
  combined = currentValues;
@@ -173,7 +165,7 @@ export const useMagicSearchParams = <
173
165
  } case 'repeat': {
174
166
 
175
167
  for (const item of arrayValue) {
176
- console.log({item})
168
+
177
169
  // add new value to the key, instead of replacing it
178
170
  newParam.append(key, item as string)
179
171
 
@@ -521,7 +513,6 @@ export const useMagicSearchParams = <
521
513
  previousParamsRef.current[key] = newValue
522
514
  }
523
515
 
524
-
525
516
  }, [CURRENT_PARAMS_URL])
526
517
  return {
527
518
  searchParams,