{"version":3,"file":"index.cjs","names":[],"sources":["../src/SmartURLSearchParams.ts"],"sourcesContent":["export type SmartURLSearchParamsConstructorParams = object;\n\nexport type ArrayFormat = 'bracket' | 'bracket-separator' | 'comma' | 'index' | 'none' | 'separator';\n\nexport interface ToFormattedStringParams {\n    arrayFormat?: ArrayFormat;\n    arrayFormatSeparator?: string;\n    forceArrayFields?: string[];\n}\n\n/**\n * An enhanced version of URLSearchParams with additional formatting capabilities.\n * Supports arrays, numbers, and handling of null and undefined values.\n * Allows custom array formatting for query strings.\n */\nclass SmartURLSearchParams extends URLSearchParams {\n    /**\n     * Creates a new instance of SmartURLSearchParams.\n     * @param {SmartURLSearchParamsConstructorParams} params - An object of parameters supporting strings, arrays, numbers, null, and undefined.\n     */\n    constructor(params?: SmartURLSearchParamsConstructorParams) {\n        super();\n\n        if (!params) {\n            return;\n        }\n\n        Object.entries(params).forEach(([key, value]: [string, unknown]) => {\n            if (value === null || value === undefined) {\n                return;\n            }\n\n            if (Array.isArray(value)) {\n                value.forEach((valueItem: number | string) => this.append(key, String(valueItem)));\n                return;\n            }\n\n            this.append(key, String(value));\n        });\n    }\n\n    /**\n     * Formats the search parameters into a query string based on specified formatting options.\n     * This method allows for advanced control over the representation of array values in the query string.\n     *\n     * @param {ToFormattedStringParams} options - The options for formatting the query string.\n     * @param {ArrayFormat} [options.arrayFormat='none'] - Specifies how array values should be formatted in the query string.\n     *    - 'bracket': Encodes arrays using brackets (e.g., 'key[]=value1&key[]=value2').\n     *    - 'index': Encodes arrays with indexes (e.g., 'key[0]=value1&key[1]=value2').\n     *    - 'comma': Encodes arrays with comma-separated values (e.g., 'key=value1,value2').\n     *    - 'separator': Encodes arrays with a custom separator specified by arrayFormatSeparator (e.g., 'key=value1|value2' for '|').\n     *    - 'bracket-separator': Encodes arrays using brackets and a custom separator (e.g., 'key[]=value1|value2' for '|').\n     *    - 'none': Encodes arrays by repeating the key for each value (default behavior, e.g., 'key=value1&key=value2').\n     * @param {string} [options.arrayFormatSeparator=','] - The separator character used for array encoding when 'separator' or 'bracket-separator' is chosen as arrayFormat.\n     * @param {string[]} [options.forceArrayFields=[]] - A list of keys that should always be formatted as arrays, even if they have a single value.\n     *\n     * @returns {string} A query string formatted according to the provided options.\n     */\n    toFormattedString({\n        arrayFormat = 'none',\n        arrayFormatSeparator = ',',\n        forceArrayFields = []\n    }: ToFormattedStringParams = {}): string {\n        const queryStringParts: string[] = [];\n\n        new Set(this.keys()).forEach((key) => {\n            const values = this.getAll(key);\n\n            if (values.length === 1 && !forceArrayFields.includes(key)) {\n                const value = values[0]!;\n                queryStringParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n                return;\n            }\n\n            switch (arrayFormat) {\n                case 'bracket':\n                    values.forEach((value) => {\n                        queryStringParts.push(`${encodeURIComponent(key)}[]=${encodeURIComponent(value)}`);\n                    });\n                    break;\n                case 'index':\n                    values.forEach((value, index) => {\n                        queryStringParts.push(`${encodeURIComponent(key)}[${index}]=${encodeURIComponent(value)}`);\n                    });\n                    break;\n                case 'comma':\n                    queryStringParts.push(`${encodeURIComponent(key)}=${values.map((value) => encodeURIComponent(value)).join(',')}`);\n                    break;\n                case 'separator':\n                    queryStringParts.push(\n                        `${encodeURIComponent(key)}=${values.map((value) => encodeURIComponent(value)).join(arrayFormatSeparator)}`\n                    );\n                    break;\n                case 'bracket-separator':\n                    queryStringParts.push(\n                        `${encodeURIComponent(key)}[]=${values.map((value) => encodeURIComponent(value)).join(arrayFormatSeparator)}`\n                    );\n                    break;\n                case 'none':\n                    queryStringParts.push(\n                        values.map((value) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&')\n                    );\n                    break;\n                default:\n                    throw new Error(`unknown arrayFormat(${arrayFormat})`);\n            }\n        });\n\n        return queryStringParts.join('&');\n    }\n}\n\nexport default SmartURLSearchParams;\n"],"mappings":";;;;;;;AAeA,IAAM,uBAAN,cAAmC,gBAAgB;;;;;CAK/C,YAAY,QAAgD;AACxD,SAAO;AAEP,MAAI,CAAC,OACD;AAGJ,SAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,KAAK,WAA8B;AAChE,OAAI,UAAU,QAAQ,UAAU,OAC5B;AAGJ,OAAI,MAAM,QAAQ,MAAM,EAAE;AACtB,UAAM,SAAS,cAA+B,KAAK,OAAO,KAAK,OAAO,UAAU,CAAC,CAAC;AAClF;;AAGJ,QAAK,OAAO,KAAK,OAAO,MAAM,CAAC;IACjC;;;;;;;;;;;;;;;;;;;CAoBN,kBAAkB,EACd,cAAc,QACd,uBAAuB,KACvB,mBAAmB,EAAE,KACI,EAAE,EAAU;EACrC,MAAM,mBAA6B,EAAE;AAErC,MAAI,IAAI,KAAK,MAAM,CAAC,CAAC,SAAS,QAAQ;GAClC,MAAM,SAAS,KAAK,OAAO,IAAI;AAE/B,OAAI,OAAO,WAAW,KAAK,CAAC,iBAAiB,SAAS,IAAI,EAAE;IACxD,MAAM,QAAQ,OAAO;AACrB,qBAAiB,KAAK,GAAG,mBAAmB,IAAI,CAAC,GAAG,mBAAmB,MAAM,GAAG;AAChF;;AAGJ,WAAQ,aAAR;IACI,KAAK;AACD,YAAO,SAAS,UAAU;AACtB,uBAAiB,KAAK,GAAG,mBAAmB,IAAI,CAAC,KAAK,mBAAmB,MAAM,GAAG;OACpF;AACF;IACJ,KAAK;AACD,YAAO,SAAS,OAAO,UAAU;AAC7B,uBAAiB,KAAK,GAAG,mBAAmB,IAAI,CAAC,GAAG,MAAM,IAAI,mBAAmB,MAAM,GAAG;OAC5F;AACF;IACJ,KAAK;AACD,sBAAiB,KAAK,GAAG,mBAAmB,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,mBAAmB,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG;AACjH;IACJ,KAAK;AACD,sBAAiB,KACb,GAAG,mBAAmB,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,mBAAmB,MAAM,CAAC,CAAC,KAAK,qBAAqB,GAC5G;AACD;IACJ,KAAK;AACD,sBAAiB,KACb,GAAG,mBAAmB,IAAI,CAAC,KAAK,OAAO,KAAK,UAAU,mBAAmB,MAAM,CAAC,CAAC,KAAK,qBAAqB,GAC9G;AACD;IACJ,KAAK;AACD,sBAAiB,KACb,OAAO,KAAK,UAAU,GAAG,mBAAmB,IAAI,CAAC,GAAG,mBAAmB,MAAM,GAAG,CAAC,KAAK,IAAI,CAC7F;AACD;IACJ,QACI,OAAM,IAAI,MAAM,uBAAuB,YAAY,GAAG;;IAEhE;AAEF,SAAO,iBAAiB,KAAK,IAAI"}