Skip to content

Commit 96daed7

Browse files
committed
feat: new until check-name-in-object
1 parent fdd13d8 commit 96daed7

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

plugin/classes/Form.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,14 @@ export default class Form extends EventEmitter implements FormDependence{
125125
get changed() {
126126
return !!Object.keys(this.#changes).length || !!this.dependencies.find(d => d.changed);
127127
}
128-
128+
129+
/**
130+
* @description Method check name for including in changes.
131+
* */
132+
checkNameForChangedStatus(dependenceName: string) {
133+
134+
}
135+
129136
/**
130137
* Getter/Setter for values.
131138
*/

plugin/classes/Input.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ export default class Input extends EventEmitter {
3434
this.parentForm?.input(this.name, v);
3535
}
3636

37+
/**
38+
* @description Boolean value, true if parent form mark current field like changed.
39+
* */
40+
get changed() {
41+
if (!this.name) return false;
42+
if (!this.parentForm) return false;
43+
return this.parentForm.changed
44+
}
45+
3746
/**
3847
* @description Run all validations. Input is not validated If on
3948
* e of guard don't return true.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import splitName from "./split-name";
2+
3+
/**
4+
* @description Return true if object include name, otherwise - false. Object should be granted!
5+
* @example
6+
* { user: { id: 2, address: {city: "Mars"} } }
7+
* user.id -> true
8+
* user -> true
9+
* user.name -> false
10+
* user.name.label -> false
11+
* */
12+
export default function checkNameInObject<T extends Record<string, any>>(object: T, searchName: string ) {
13+
const names = splitName(searchName);
14+
15+
for(let i = 0; i < names.length; i++) {
16+
const name = names[i];
17+
try {
18+
if ((name in object) === false || !object.hasOwnProperty(name)) return false;
19+
} catch (e) {
20+
return false;
21+
}
22+
object = object[name];
23+
}
24+
25+
return true;
26+
}

plugin/utils/split-name.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function splitName(name: string) {
2+
return name.split('.');
3+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import checkNameInObject from "../../plugin/utils/check-name-in-object";
2+
3+
describe("Tests for check name in object", () => {
4+
5+
test("Simple test. Should be true in inline object", () => {
6+
const obj = {
7+
name: 'Jenesius'
8+
}
9+
expect(checkNameInObject(obj, 'name')).toBe(true);
10+
})
11+
12+
test("Should be false when provided wrong name", () => {
13+
const obj = {
14+
label: "Mark"
15+
}
16+
expect(checkNameInObject(obj, 'name')).toBe(false);
17+
})
18+
test('Should be false when provided long composite name', () => {
19+
const obj = {
20+
user: {
21+
address: {
22+
city: {
23+
name: 'Mogilve'
24+
}
25+
}
26+
}
27+
}
28+
expect(checkNameInObject(obj, 'user.email.short')).toBe(false);
29+
})
30+
test("Should be false when some intermediate value is primitive", () => {
31+
const obj = {
32+
user: {
33+
address: null
34+
}
35+
}
36+
expect(checkNameInObject(obj, 'user.address.city.name')).toBe(false);
37+
})
38+
39+
test('True, when long composite name included', () => {
40+
const obj = {
41+
user: {
42+
address: {
43+
city: {
44+
name: "mogilev"
45+
}
46+
}
47+
}
48+
}
49+
expect(checkNameInObject(obj, 'user.address.city.name')).toBe(true);
50+
})
51+
52+
})

0 commit comments

Comments
 (0)