Skip to content

Commit

Permalink
Merge pull request #96 from AthennaIO/develop
Browse files Browse the repository at this point in the history
feat(json): add omit/pick methods
  • Loading branch information
jlenon7 authored Oct 26, 2023
2 parents 832ebd5 + 6053ec9 commit e06fc4d
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 5 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@athenna/common",
"version": "4.19.0",
"version": "4.20.0",
"description": "The Athenna common helpers to use in any Node.js ESM project.",
"license": "MIT",
"author": "João Lenon <[email protected]>",
Expand Down
58 changes: 56 additions & 2 deletions src/helpers/Json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,20 @@ export class ObjectBuilder {
return this.getValue(value)
}

/**
* Omit data from object.
*/
public omit(keys: string[]) {
return Json.omit(this.object, keys)
}

/**
* Omit data from object.
*/
public pick(keys: string[]) {
return Json.pick(this.object, keys)
}

/**
* Return an array with the property names.
*/
Expand Down Expand Up @@ -229,7 +243,7 @@ export class ObjectBuilder {

/**
* Get the value referenced or not depending on
* "options.referecendValues". Also will auto set
* "options.referencedValues". Also will auto set
* the "options.defaultValue" if any value is set.
*/
private getValue(value: any, defaultValue = this.options.defaultValue): any {
Expand All @@ -255,10 +269,50 @@ export class Json {
/**
* Deep copy any object properties without reference.
*/
public static copy(object: any): any {
public static copy<T = any>(object: T): T {
return lodash.cloneDeep(object)
}

/**
* Omit data from an object.
*
* @example
* ```ts
* const obj = {
* name: 'Lenon',
* age: 22
* }
*
* const omitted = Json.omit(obj, ['name']) // { age: 22 }
* ```
*/
public static omit<T extends object = any, K extends keyof T = any>(
object: T,
keys: K[]
): Omit<T, K> {
return lodash.omit(object, keys)
}

/**
* Pick data from an object.
*
* @example
* ```ts
* const obj = {
* name: 'Lenon',
* age: 22
* }
*
* const picked = Json.pick(obj, ['name']) // { name: 'Lenon' }
* ```
*/
public static pick<T extends object = any, K extends keyof T = any>(
object: T,
keys: K[]
): Pick<T, K> {
return lodash.pick(object, keys)
}

/**
* Find all JSON inside string and return it.
*/
Expand Down
56 changes: 56 additions & 0 deletions tests/unit/JsonTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,4 +348,60 @@ export default class JsonTest {
['AGE', 22]
])
}

@Test()
public async shouldBeAbleToOmitValuesFromObject({ assert }: Context) {
const object = {
name: 'Lenon',
age: 22
}

const omitted = Json.omit(object, ['age'])

assert.deepEqual(omitted, { name: 'Lenon' })
}

@Test()
public async shouldBeAbleToPickValuesFromObject({ assert }: Context) {
const object = {
name: 'Lenon',
age: 22
}

const picked = Json.pick(object, ['age'])

assert.deepEqual(picked, { age: 22 })
}

@Test()
public async shouldBeAbleToPickValuesFromBuilder({ assert }: Context) {
const builder = Json.builder().set({ name: 'Lenon', age: 22 })
const picked = builder.pick(['name'])

assert.deepEqual(picked, { name: 'Lenon' })
}

@Test()
public async shouldBeAbleToOmitValuesFromBuilder({ assert }: Context) {
const builder = Json.builder().set({ name: 'Lenon', age: 22 })
const omitted = builder.omit(['name'])

assert.deepEqual(omitted, { age: 22 })
}

@Test()
public async shouldBeAbleToPickAdvancedKeyValuesFromBuilder({ assert }: Context) {
const builder = Json.builder().set({ users: [{ name: 'Lenon', age: 22 }] })
const picked = builder.pick(['users[0].name'])

assert.deepEqual(picked, { users: [{ name: 'Lenon' }] })
}

@Test()
public async shouldBeAbleToOmitAdvancedKeyValuesFromBuilder({ assert }: Context) {
const builder = Json.builder().set({ users: [{ name: 'Lenon', age: 22 }] })
const omitted = builder.omit(['users[0].name'])

assert.deepEqual(omitted, { users: [{ age: 22 }] })
}
}

0 comments on commit e06fc4d

Please sign in to comment.