// Unique symbol cannot be declared in a namespace directly, so we declare it top-level // See: https://github.com/sindresorhus/map-obj/pull/38#discussion_r702396878 declare const skipSymbol: unique symbol; declare namespace mapObject { type Mapper< SourceObjectType extends {[key: string]: any}, MappedObjectKeyType extends string, MappedObjectValueType > = ( sourceKey: keyof SourceObjectType, sourceValue: SourceObjectType[keyof SourceObjectType], source: SourceObjectType ) => [ targetKey: MappedObjectKeyType, targetValue: MappedObjectValueType, mapperOptions?: mapObject.MapperOptions ] | typeof mapObject.mapObjectSkip; interface Options { /** Recurse nested objects and objects in arrays. @default false */ deep?: boolean; /** Target object to map properties on to. @default {} */ target?: {[key: string]: any}; } interface DeepOptions extends Options { deep: true; } interface TargetOptions extends Options { target: TargetObjectType; } interface MapperOptions { /** Whether `targetValue` should be recursed. Requires `deep: true`. @default true */ readonly shouldRecurse?: boolean; } /** Return this value from a `mapper` function to remove a key from an object. @example ``` const mapObject = require('map-obj'); const object = {one: 1, two: 2} const mapper = (key, value) => value === 1 ? [key, value] : mapObject.mapObjectSkip const result = mapObject(object, mapper); console.log(result); //=> {one: 1} ``` */ const mapObjectSkip: typeof skipSymbol } /** Map object keys and values into a new object. @param source - Source object to copy properties from. @param mapper - Mapping function. @example ``` import mapObject = require('map-obj'); const newObject = mapObject({foo: 'bar'}, (key, value) => [value, key]); //=> {bar: 'foo'} const newObject = mapObject({FOO: true, bAr: {bAz: true}}, (key, value) => [key.toLowerCase(), value]); //=> {foo: true, bar: {bAz: true}} const newObject = mapObject({FOO: true, bAr: {bAz: true}}, (key, value) => [key.toLowerCase(), value], {deep: true}); //=> {foo: true, bar: {baz: true}} const newObject = mapObject({one: 1, two: 2}, (key, value) => value === 1 ? [key, value] : mapObject.mapObjectSkip); //=> {one: 1} ``` */ declare function mapObject< SourceObjectType extends object, TargetObjectType extends {[key: string]: any}, MappedObjectKeyType extends string, MappedObjectValueType >( source: SourceObjectType, mapper: mapObject.Mapper< SourceObjectType, MappedObjectKeyType, MappedObjectValueType >, options: mapObject.DeepOptions & mapObject.TargetOptions ): TargetObjectType & {[key: string]: unknown}; declare function mapObject< SourceObjectType extends object, MappedObjectKeyType extends string, MappedObjectValueType >( source: SourceObjectType, mapper: mapObject.Mapper< SourceObjectType, MappedObjectKeyType, MappedObjectValueType >, options: mapObject.DeepOptions ): {[key: string]: unknown}; declare function mapObject< SourceObjectType extends {[key: string]: any}, TargetObjectType extends {[key: string]: any}, MappedObjectKeyType extends string, MappedObjectValueType >( source: SourceObjectType, mapper: mapObject.Mapper< SourceObjectType, MappedObjectKeyType, MappedObjectValueType >, options: mapObject.TargetOptions ): TargetObjectType & {[K in MappedObjectKeyType]: MappedObjectValueType}; declare function mapObject< SourceObjectType extends {[key: string]: any}, MappedObjectKeyType extends string, MappedObjectValueType >( source: SourceObjectType, mapper: mapObject.Mapper< SourceObjectType, MappedObjectKeyType, MappedObjectValueType >, options?: mapObject.Options ): {[K in MappedObjectKeyType]: MappedObjectValueType}; export = mapObject;