Skip to content

Commit 2de53fa

Browse files
committed
safe
1 parent 055d92d commit 2de53fa

File tree

3 files changed

+112
-6
lines changed

3 files changed

+112
-6
lines changed

index.d.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@ interface LogggerOptions {
66
time: 'iso' | 'ru' | 'en';
77
}
88
interface Loggger {
9-
(msg: string | object, category?: string, level?: number): void;
9+
//(msg: string | object, category?: string, level?: number): void;
1010
setOptions(opts: LogggerOptions): void;
1111

12-
debug(msg:string):void;
13-
info(msg:string):void;
14-
warn(msg:string):void;
15-
error(msg:string):void;
12+
debug(msg: string): void;
13+
info(msg: string): void;
14+
warn(msg: string): void;
15+
error(msg: string): void;
1616
}
1717

1818
export declare var log: Loggger;
1919

20+
21+
/* @file ./src/safe.js */
22+
interface SafeOps {
23+
bit(value: number, bit: number): boolean;
24+
25+
get<TObject extends object, TKey extends keyof TObject>(object: TObject, path: TKey): TObject[TKey];
26+
set<TObject extends object, T>(object: TObject, path: string, value:T): T;
27+
unset<TObject extends object>(object: TObject, path: string): void;
28+
}
29+
export declare var safe: SafeOps;

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22

33
module.exports = Object.assign({}, {
4-
node: require('./src/node'),
4+
node: require('./src/node'),
5+
safe: require('./src/safe'),
56
log: require('./src/log')
67
});

src/safe.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* name : Rightech IoT Cloud ~.
3+
* description : ~
4+
* author : Oleg Prohazko
5+
*
6+
* LLC, Komnet, Russian Federation, Moscow, 2016
7+
*
8+
*/
9+
10+
11+
function bit(value, bit) {
12+
return ((value) & (1 << bit)) !== 0;
13+
}
14+
15+
function get(object, path) {
16+
if (!object) {
17+
return object;
18+
}
19+
20+
if (path in object) {
21+
return object[path];
22+
}
23+
const keys = path.split('.');
24+
for (let i = 0; i < keys.length; i++) {
25+
const key = keys[i];
26+
27+
if(typeof object === 'number' && isFinite(key)) {
28+
return bit(object, +key);
29+
}
30+
31+
if (!object || !object.hasOwnProperty(key)) {
32+
object = undefined;
33+
break;
34+
}
35+
object = object[key];
36+
}
37+
return object;
38+
}
39+
40+
function set(object, path, value) {
41+
const keys = path.split('.');
42+
let i = 0;
43+
for (; i < keys.length - 1; i++) { // eslint-disable-line no-magic-numbers
44+
const key = keys[i];
45+
if (!object.hasOwnProperty(key)) {
46+
object[key] = {};
47+
}
48+
object = object[key];
49+
}
50+
if (value === undefined) {
51+
delete object[keys[i]];
52+
} else {
53+
object[keys[i]] = value;
54+
}
55+
56+
return value;
57+
}
58+
59+
function unset(object, path) {
60+
return set(object, path, undefined);
61+
}
62+
63+
function copy(object, path, target, fallback) {
64+
const hasFallback = typeof fallback !== 'undefined';
65+
let value = get(object, path);
66+
67+
if (typeof value === 'undefined') {
68+
if (hasFallback) {
69+
value = fallback;
70+
} else {
71+
return value;
72+
}
73+
}
74+
set(object, target, value);
75+
return value;
76+
}
77+
78+
function swap(object, path, target) {
79+
const value = copy(object, path, target);
80+
if (typeof value === 'undefined') {
81+
return value;
82+
}
83+
set(object, target, value);
84+
unset(object, path);
85+
return value;
86+
}
87+
88+
module.exports = {
89+
bit,
90+
get,
91+
set,
92+
unset,
93+
copy,
94+
swap
95+
};

0 commit comments

Comments
 (0)