{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface CleanOptions {\n    /** Custom predicate to determine if value should be kept */\n    predicate?: (value: unknown, key: string, path: string) => boolean;\n    /** Keep empty arrays (default: false) */\n    preserveEmptyArrays?: boolean;\n    /** Keep empty objects (default: false) */\n    preserveEmptyObjects?: boolean;\n    /** Keep empty strings (default: false - they are removed) */\n    preserveEmptyStrings?: boolean;\n    /** Paths to exclude from cleaning (supports wildcards) */\n    exclude?: string[];\n    /** Transform values while cleaning */\n    transform?: (value: unknown, key: string) => unknown;\n}\n\nconst defaultPredicate = (value: unknown, _key: string, _path: string, options: CleanOptions): boolean => {\n    if (value === null || value === undefined) return false;\n    if (!options.preserveEmptyStrings && value === '') return false;\n    return true;\n};\n\nfunction matchesPath(path: string, patterns: string[]): boolean {\n    return patterns.some(pattern => {\n        if (pattern.endsWith('*')) {\n            return path.startsWith(pattern.slice(0, -1));\n        }\n        return path === pattern;\n    });\n}\n\n/**\n * Deeply cleans an object by removing null, undefined, and empty string values.\n * Preserves 0 and false.\n */\nexport function clean<T>(input: T, options: CleanOptions = {}): T {\n    const { exclude = [], transform } = options;\n\n    function cleanRecursive(value: unknown, key: string, path: string): unknown {\n        // Apply transform if provided\n        let processedValue = value;\n        if (transform && key !== '') {\n            processedValue = transform(value, key);\n        }\n\n        // Check if path is excluded\n        if (path && matchesPath(path, exclude)) {\n            return processedValue;\n        }\n\n        // Use custom predicate or default\n        const predicate = options.predicate ?? ((v, k, p) => defaultPredicate(v, k, p, options));\n\n        if (typeof processedValue !== 'object' || processedValue === null) {\n            return processedValue;\n        }\n\n        if (processedValue instanceof Date || processedValue instanceof RegExp) {\n            return processedValue;\n        }\n\n        if (Array.isArray(processedValue)) {\n            const cleaned = processedValue\n                .map((item, index) => cleanRecursive(item, String(index), path ? `${path}[${index}]` : `[${index}]`))\n                .filter((item) => predicate(item, '', path));\n\n            if (!options.preserveEmptyArrays && cleaned.length === 0) {\n                return undefined;\n            }\n            return cleaned;\n        }\n\n        const result: Record<string, unknown> = {};\n        for (const k in processedValue as Record<string, unknown>) {\n            if (Object.prototype.hasOwnProperty.call(processedValue, k)) {\n                const childPath = path ? `${path}.${k}` : k;\n                const cleanedValue = cleanRecursive((processedValue as Record<string, unknown>)[k], k, childPath);\n\n                if (predicate(cleanedValue, k, childPath)) {\n                    result[k] = cleanedValue;\n                }\n            }\n        }\n\n        if (!options.preserveEmptyObjects && Object.keys(result).length === 0) {\n            return undefined;\n        }\n\n        return result;\n    }\n\n    const result = cleanRecursive(input, '', '');\n    return result as T;\n}\n\nexport { clean as cleanObject };\nexport default clean;\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,EAAA,gBAAAA,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAeA,IAAMK,EAAmB,CAACC,EAAgBC,EAAcC,EAAeC,IAC/D,EAAAH,GAAU,MACV,CAACG,EAAQ,sBAAwBH,IAAU,IAInD,SAASI,EAAYC,EAAcC,EAA6B,CAC5D,OAAOA,EAAS,KAAKC,GACbA,EAAQ,SAAS,GAAG,EACbF,EAAK,WAAWE,EAAQ,MAAM,EAAG,EAAE,CAAC,EAExCF,IAASE,CACnB,CACL,CAMO,SAASX,EAASY,EAAUL,EAAwB,CAAC,EAAM,CAC9D,GAAM,CAAE,QAAAM,EAAU,CAAC,EAAG,UAAAC,CAAU,EAAIP,EAEpC,SAASQ,EAAeX,EAAgBY,EAAaP,EAAuB,CAExE,IAAIQ,EAAiBb,EAMrB,GALIU,GAAaE,IAAQ,KACrBC,EAAiBH,EAAUV,EAAOY,CAAG,GAIrCP,GAAQD,EAAYC,EAAMI,CAAO,EACjC,OAAOI,EAIX,IAAMC,EAAYX,EAAQ,YAAc,CAACY,EAAGC,EAAGC,IAAMlB,EAAiBgB,EAAGC,EAAGC,EAAGd,CAAO,GAMtF,GAJI,OAAOU,GAAmB,UAAYA,IAAmB,MAIzDA,aAA0B,MAAQA,aAA0B,OAC5D,OAAOA,EAGX,GAAI,MAAM,QAAQA,CAAc,EAAG,CAC/B,IAAMK,EAAUL,EACX,IAAI,CAACM,EAAMC,IAAUT,EAAeQ,EAAM,OAAOC,CAAK,EAAGf,EAAO,GAAGA,CAAI,IAAIe,CAAK,IAAM,IAAIA,CAAK,GAAG,CAAC,EACnG,OAAQD,GAASL,EAAUK,EAAM,GAAId,CAAI,CAAC,EAE/C,MAAI,CAACF,EAAQ,qBAAuBe,EAAQ,SAAW,EACnD,OAEGA,CACX,CAEA,IAAMG,EAAkC,CAAC,EACzC,QAAWL,KAAKH,EACZ,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAgBG,CAAC,EAAG,CACzD,IAAMM,EAAYjB,EAAO,GAAGA,CAAI,IAAIW,CAAC,GAAKA,EACpCO,EAAeZ,EAAgBE,EAA2CG,CAAC,EAAGA,EAAGM,CAAS,EAE5FR,EAAUS,EAAcP,EAAGM,CAAS,IACpCD,EAAOL,CAAC,EAAIO,EAEpB,CAGJ,GAAI,GAACpB,EAAQ,sBAAwB,OAAO,KAAKkB,CAAM,EAAE,SAAW,GAIpE,OAAOA,CACX,CAGA,OADeV,EAAeH,EAAO,GAAI,EAAE,CAE/C,CAGA,IAAOgB,EAAQC","names":["index_exports","__export","clean","index_default","__toCommonJS","defaultPredicate","value","_key","_path","options","matchesPath","path","patterns","pattern","input","exclude","transform","cleanRecursive","key","processedValue","predicate","v","k","p","cleaned","item","index","result","childPath","cleanedValue","index_default","clean"]}