Skip to content

Commit

Permalink
Added alternative has property deep scan method
Browse files Browse the repository at this point in the history
  • Loading branch information
Avram Cosmin committed Feb 10, 2024
1 parent 272a20c commit a9241a4
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 57 deletions.
88 changes: 44 additions & 44 deletions package-lock.json

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

9 changes: 5 additions & 4 deletions package.json
@@ -1,6 +1,6 @@
{
"name": "@24vlh/ts-assert",
"version": "1.0.3",
"version": "1.0.4",
"description": "Small footprint library that helps with typescript assertions.",
"author": "@vlah.io",
"license": "Apache-2.0",
Expand All @@ -19,7 +19,7 @@
],
"scripts": {
"build": "tsc",
"index:refresh": "node ./.24vlh/scan.js",
"index:refresh": "node ./.24vlh/scan.js && git add ./src/index.ts",
"lint": "npx eslint src/**/*.ts --fix",
"prepare": "husky install",
"prepublishOnly": "npm run build",
Expand All @@ -28,15 +28,16 @@
},
"lint-staged": {
"*.ts": [
"npm run index:refresh",
"eslint --fix",
"prettier --write"
]
},
"devDependencies": {
"@types/jest": "^29.5.11",
"@types/node": "^20.10.6",
"@typescript-eslint/eslint-plugin": "^6.17.0",
"@typescript-eslint/parser": "^6.17.0",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.2",
Expand Down
7 changes: 7 additions & 0 deletions src/index.ts
@@ -1,3 +1,6 @@
export * from './lib/24vlh.type';
export * from './lib/array-type-class';
export * from './lib/array-type-primitive';
export * from './lib/array';
export * from './lib/boolean-as-string';
export * from './lib/boolean';
Expand All @@ -8,6 +11,7 @@ export * from './lib/false-as-string';
export * from './lib/false';
export * from './lib/float';
export * from './lib/function';
export * from './lib/instance-type';
export * from './lib/integer';
export * from './lib/nan';
export * from './lib/null-as-string';
Expand All @@ -18,11 +22,14 @@ export * from './lib/numeric';
export * from './lib/object-has-own-property';
export * from './lib/object-has-property-deep-scan';
export * from './lib/object-has-property';
export * from './lib/object-type';
export * from './lib/object';
export * from './lib/of-type';
export * from './lib/primitive-as-string';
export * from './lib/primitive-or-boolean-as-string';
export * from './lib/primitive-or-boolean';
export * from './lib/primitive';
export * from './lib/return-constructor';
export * from './lib/string';
export * from './lib/symbol';
export * from './lib/true-as-string';
Expand Down
31 changes: 23 additions & 8 deletions src/lib/object-has-property-deep-scan.spec.ts
@@ -1,17 +1,32 @@
import { ObjectHasPropertyDeepScan } from './object-has-property-deep-scan';
import {ObjectHasPropertyDeepScan, ObjectHasPropertyDeepScan2} from './object-has-property-deep-scan';

test('ObjectHasPropertyDeepScan: Expecting key1.key2 in { key1: { key2: 1 } } to be true', () => {
expect(ObjectHasPropertyDeepScan('key1.key2', { key1: { key2: 1 } })).toBe(
true
);
expect(ObjectHasPropertyDeepScan('key1.key2', {key1: {key2: 1}})).toBe(
true
);
});

test('ObjectHasPropertyDeepScan: Expecting key1.key2 in { key1: { key3: 1 } } to be false', () => {
expect(ObjectHasPropertyDeepScan('key1.key2', { key1: { key3: 1 } })).toBe(
false
);
expect(ObjectHasPropertyDeepScan('key1.key2', {key1: {key3: 1}})).toBe(
false
);
});

test('ObjectHasPropertyDeepScan: Expecting key1.key2 in 2 to be false', () => {
expect(ObjectHasPropertyDeepScan('key1.key2', 2)).toBe(false);
expect(ObjectHasPropertyDeepScan('key1.key2', 2)).toBe(false);
});
test('ObjectHasPropertyDeepScan2: Expecting key1.key2 in { key1: { key2: 1 } } to be true', () => {
expect(ObjectHasPropertyDeepScan2('key1.key2', {key1: {key2: 1}})).toBe(
true
);
});

test('ObjectHasPropertyDeepScan2: Expecting key1.key2 in { key1: { key3: 1 } } to be false', () => {
expect(ObjectHasPropertyDeepScan2('key1.key2', {key1: {key3: 1}})).toBe(
false
);
});

test('ObjectHasPropertyDeepScan2: Expecting key1.key2 in 2 to be false', () => {
expect(ObjectHasPropertyDeepScan2('key1.key2', 2)).toBe(false);
});
31 changes: 30 additions & 1 deletion src/lib/object-has-property-deep-scan.ts
Expand Up @@ -15,7 +15,7 @@ export function ObjectHasPropertyDeepScan(
): boolean {
if (OfObjectType(object) && OfStringType(path)) {
const keys: string[] = path.split('.');
let obj: object = object;
let obj: object = { ...object };

for (const key of keys) {
if (ObjectHasOwnProperty(key, obj)) {
Expand All @@ -30,3 +30,32 @@ export function ObjectHasPropertyDeepScan(

return false;
}

/**
* Checks if an object has a property at a given nested path.
*
* @param {unknown} path - The path of the property to check, in dot notation.
* @param {unknown} object - The object to search for the property.
*
* @return {boolean} - Returns true if the property is found, false otherwise.
*/
export function ObjectHasPropertyDeepScan2(
path: unknown,
object: unknown
): boolean {
if (OfObjectType(object) && OfStringType(path)) {
const keys: string[] = path.split('.');
let obj: object = { ...object };

return keys.every((key) => {
if (ObjectHasOwnProperty(key, obj)) {
obj = obj[key];
return true;
}

return false;
});
}

return false;
}

0 comments on commit a9241a4

Please sign in to comment.