Comparing version 4.3.0 to 5.0.0
186
index.d.ts
@@ -1,71 +0,65 @@ | ||
// 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; | ||
/** | ||
Return this value from a `mapper` function to remove a key from an object. | ||
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; | ||
@example | ||
``` | ||
import mapObject, {mapObjectSkip} from 'map-obj'; | ||
interface Options { | ||
/** | ||
Recurse nested objects and objects in arrays. | ||
const object = {one: 1, two: 2} | ||
const mapper = (key, value) => value === 1 ? [key, value] : mapObjectSkip | ||
const result = mapObject(object, mapper); | ||
@default false | ||
*/ | ||
deep?: boolean; | ||
console.log(result); | ||
//=> {one: 1} | ||
``` | ||
*/ | ||
export const mapObjectSkip: unique symbol; | ||
/** | ||
Target object to map properties on to. | ||
export type Mapper< | ||
SourceObjectType extends Record<string, any>, | ||
MappedObjectKeyType extends string, | ||
MappedObjectValueType, | ||
> = ( | ||
sourceKey: keyof SourceObjectType, | ||
sourceValue: SourceObjectType[keyof SourceObjectType], | ||
source: SourceObjectType | ||
) => [ | ||
targetKey: MappedObjectKeyType, | ||
targetValue: MappedObjectValueType, | ||
mapperOptions?: MapperOptions, | ||
] | typeof mapObjectSkip; | ||
@default {} | ||
*/ | ||
target?: {[key: string]: any}; | ||
} | ||
export interface Options { | ||
/** | ||
Recurse nested objects and objects in arrays. | ||
interface DeepOptions extends Options { | ||
deep: true; | ||
} | ||
@default false | ||
*/ | ||
readonly deep?: boolean; | ||
interface TargetOptions<TargetObjectType extends {[key: string]: any}> extends Options { | ||
target: TargetObjectType; | ||
} | ||
/** | ||
The target object to map properties on to. | ||
interface MapperOptions { | ||
/** | ||
Whether `targetValue` should be recursed. | ||
@default {} | ||
*/ | ||
readonly target?: Record<string, any>; | ||
} | ||
Requires `deep: true`. | ||
export interface DeepOptions extends Options { | ||
readonly deep: true; | ||
} | ||
@default true | ||
*/ | ||
readonly shouldRecurse?: boolean; | ||
} | ||
export interface TargetOptions<TargetObjectType extends Record<string, any>> extends Options { | ||
readonly target: TargetObjectType; | ||
} | ||
export interface MapperOptions { | ||
/** | ||
Return this value from a `mapper` function to remove a key from an object. | ||
Whether `targetValue` should be recursed. | ||
@example | ||
``` | ||
const mapObject = require('map-obj'); | ||
Requires `deep: true`. | ||
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} | ||
``` | ||
@default true | ||
*/ | ||
const mapObjectSkip: typeof skipSymbol | ||
readonly shouldRecurse?: boolean; | ||
} | ||
@@ -76,8 +70,8 @@ | ||
@param source - Source object to copy properties from. | ||
@param mapper - Mapping function. | ||
@param source - The source object to copy properties from. | ||
@param mapper - A mapping function. | ||
@example | ||
``` | ||
import mapObject = require('map-obj'); | ||
import mapObject, {mapObjectSkip} from 'map-obj'; | ||
@@ -93,61 +87,59 @@ const newObject = mapObject({foo: 'bar'}, (key, value) => [value, key]); | ||
const newObject = mapObject({one: 1, two: 2}, (key, value) => value === 1 ? [key, value] : mapObject.mapObjectSkip); | ||
const newObject = mapObject({one: 1, two: 2}, (key, value) => value === 1 ? [key, value] : mapObjectSkip); | ||
//=> {one: 1} | ||
``` | ||
*/ | ||
declare function mapObject< | ||
SourceObjectType extends object, | ||
TargetObjectType extends {[key: string]: any}, | ||
export default function mapObject< | ||
SourceObjectType extends Record<string, unknown>, | ||
TargetObjectType extends Record<string, any>, | ||
MappedObjectKeyType extends string, | ||
MappedObjectValueType | ||
MappedObjectValueType, | ||
>( | ||
source: SourceObjectType, | ||
mapper: mapObject.Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
mapper: Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
>, | ||
options: mapObject.DeepOptions & mapObject.TargetOptions<TargetObjectType> | ||
): TargetObjectType & {[key: string]: unknown}; | ||
declare function mapObject< | ||
SourceObjectType extends object, | ||
options: DeepOptions & TargetOptions<TargetObjectType> | ||
): TargetObjectType & Record<string, unknown>; | ||
export default function mapObject< | ||
SourceObjectType extends Record<string, unknown>, | ||
MappedObjectKeyType extends string, | ||
MappedObjectValueType | ||
MappedObjectValueType, | ||
>( | ||
source: SourceObjectType, | ||
mapper: mapObject.Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
mapper: Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
>, | ||
options: mapObject.DeepOptions | ||
): {[key: string]: unknown}; | ||
declare function mapObject< | ||
SourceObjectType extends {[key: string]: any}, | ||
TargetObjectType extends {[key: string]: any}, | ||
options: DeepOptions | ||
): Record<string, unknown>; | ||
export default function mapObject< | ||
SourceObjectType extends Record<string, any>, | ||
TargetObjectType extends Record<string, any>, | ||
MappedObjectKeyType extends string, | ||
MappedObjectValueType | ||
MappedObjectValueType, | ||
>( | ||
source: SourceObjectType, | ||
mapper: mapObject.Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
mapper: Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
>, | ||
options: mapObject.TargetOptions<TargetObjectType> | ||
options: TargetOptions<TargetObjectType> | ||
): TargetObjectType & {[K in MappedObjectKeyType]: MappedObjectValueType}; | ||
declare function mapObject< | ||
SourceObjectType extends {[key: string]: any}, | ||
export default function mapObject< | ||
SourceObjectType extends Record<string, any>, | ||
MappedObjectKeyType extends string, | ||
MappedObjectValueType | ||
MappedObjectValueType, | ||
>( | ||
source: SourceObjectType, | ||
mapper: mapObject.Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
mapper: Mapper< | ||
SourceObjectType, | ||
MappedObjectKeyType, | ||
MappedObjectValueType | ||
>, | ||
options?: mapObject.Options | ||
options?: Options | ||
): {[K in MappedObjectKeyType]: MappedObjectValueType}; | ||
export = mapObject; |
33
index.js
@@ -1,18 +0,17 @@ | ||
'use strict'; | ||
const isObject = value => typeof value === 'object' && value !== null; | ||
const mapObjectSkip = Symbol('skip'); | ||
// Customized for this use-case | ||
const isObjectCustom = value => | ||
isObject(value) && | ||
!(value instanceof RegExp) && | ||
!(value instanceof Error) && | ||
!(value instanceof Date); | ||
isObject(value) | ||
&& !(value instanceof RegExp) | ||
&& !(value instanceof Error) | ||
&& !(value instanceof Date); | ||
const mapObject = (object, mapper, options, isSeen = new WeakMap()) => { | ||
export const mapObjectSkip = Symbol('mapObjectSkip'); | ||
const _mapObject = (object, mapper, options, isSeen = new WeakMap()) => { | ||
options = { | ||
deep: false, | ||
target: {}, | ||
...options | ||
...options, | ||
}; | ||
@@ -29,3 +28,3 @@ | ||
const mapArray = array => array.map(element => isObjectCustom(element) ? mapObject(element, mapper, options, isSeen) : element); | ||
const mapArray = array => array.map(element => isObjectCustom(element) ? _mapObject(element, mapper, options, isSeen) : element); | ||
if (Array.isArray(object)) { | ||
@@ -50,5 +49,5 @@ return mapArray(object); | ||
if (options.deep && shouldRecurse && isObjectCustom(newValue)) { | ||
newValue = Array.isArray(newValue) ? | ||
mapArray(newValue) : | ||
mapObject(newValue, mapper, options, isSeen); | ||
newValue = Array.isArray(newValue) | ||
? mapArray(newValue) | ||
: _mapObject(newValue, mapper, options, isSeen); | ||
} | ||
@@ -62,3 +61,3 @@ | ||
module.exports = (object, mapper, options) => { | ||
export default function mapObject(object, mapper, options) { | ||
if (!isObject(object)) { | ||
@@ -68,5 +67,3 @@ throw new TypeError(`Expected an object, got \`${object}\` (${typeof object})`); | ||
return mapObject(object, mapper, options); | ||
}; | ||
module.exports.mapObjectSkip = mapObjectSkip; | ||
return _mapObject(object, mapper, options); | ||
} |
{ | ||
"name": "map-obj", | ||
"version": "4.3.0", | ||
"version": "5.0.0", | ||
"description": "Map object keys and values into a new object", | ||
@@ -13,4 +13,6 @@ "license": "MIT", | ||
}, | ||
"type": "module", | ||
"exports": "./index.js", | ||
"engines": { | ||
"node": ">=8" | ||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||
}, | ||
@@ -40,6 +42,6 @@ "scripts": { | ||
"devDependencies": { | ||
"ava": "^2.0.0", | ||
"tsd": "^0.14.0", | ||
"xo": "^0.24.0" | ||
"ava": "^3.15.0", | ||
"tsd": "^0.18.0", | ||
"xo": "^0.45.0" | ||
} | ||
} |
@@ -14,3 +14,3 @@ # map-obj | ||
```js | ||
const mapObject = require('map-obj'); | ||
import mapObject, {mapObjectSkip} from 'map-obj'; | ||
@@ -26,3 +26,3 @@ const newObject = mapObject({foo: 'bar'}, (key, value) => [value, key]); | ||
const newObject = mapObject({one: 1, two: 2}, (key, value) => value === 1 ? [key, value] : mapObject.mapObjectSkip); | ||
const newObject = mapObject({one: 1, two: 2}, (key, value) => value === 1 ? [key, value] : mapObjectSkip); | ||
//=> {one: 1} | ||
@@ -39,9 +39,9 @@ ``` | ||
Source object to copy properties from. | ||
The source object to copy properties from. | ||
#### mapper | ||
Type: `(sourceKey, sourceValue, source) => [targetKey, targetValue, mapperOptions?] | mapObject.mapObjectSkip` | ||
Type: `(sourceKey, sourceValue, source) => [targetKey, targetValue, mapperOptions?] | mapObjectSkip` | ||
Mapping function. | ||
A mapping function. | ||
@@ -77,5 +77,5 @@ ##### mapperOptions | ||
Target object to map properties on to. | ||
The target object to map properties on to. | ||
### mapObject.mapObjectSkip | ||
### mapObjectSkip | ||
@@ -85,6 +85,6 @@ Return this value from a `mapper` function to exclude the key from the new object. | ||
```js | ||
const mapObject = require('map-obj'); | ||
import mapObject, {mapObjectSkip} from 'map-obj'; | ||
const object = {one: 1, two: 2} | ||
const mapper = (key, value) => value === 1 ? [key, value] : mapObject.mapObjectSkip | ||
const mapper = (key, value) => value === 1 ? [key, value] : mapObjectSkip | ||
const result = mapObject(object, mapper); | ||
@@ -91,0 +91,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Yes
9245
172