@cleverbrush/deep 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ declare const deepEqual: (p1: any, p2: any) => boolean;
2
+ export default deepEqual;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const isBothNaN = function (v1, v2) {
4
+ return Number.isNaN(v1) && Number.isNaN(v2);
5
+ };
6
+ const deepEqual = function (p1, p2) {
7
+ if (arguments.length !== 2)
8
+ return false;
9
+ const cache = new Map();
10
+ const compare = function (o1, o2) {
11
+ const arraysAreIdentical = function (a1, a2) {
12
+ if (a1.length !== a2.length)
13
+ return false;
14
+ const c1 = a1.map(t => t).sort();
15
+ const c2 = a2.map(t => t).sort();
16
+ for (let i = 0; i < c1.length; i++) {
17
+ if (!compare(c1[i], c2[i]))
18
+ return false;
19
+ }
20
+ return true;
21
+ };
22
+ if (arguments.length !== 2)
23
+ return false;
24
+ if (o1 === o2)
25
+ return true;
26
+ if (typeof o1 !== typeof o2)
27
+ return false;
28
+ if (isBothNaN(o1, o2))
29
+ return true;
30
+ if ((Array.isArray(o1) && !Array.isArray(o2)) || (!Array.isArray(o1) && Array.isArray(o2))) {
31
+ return false;
32
+ }
33
+ if (Array.isArray(o1) && Array.isArray(o2)) {
34
+ return arraysAreIdentical(o1, o2);
35
+ }
36
+ if (typeof o1 === 'object') {
37
+ if (cache.get(o1) === true) {
38
+ return false;
39
+ }
40
+ cache.set(o1, true);
41
+ let keys1 = Object.keys(o1);
42
+ let keys2 = Object.keys(o2);
43
+ if (keys1.length != keys2.length)
44
+ return false;
45
+ keys1.sort();
46
+ keys2.sort();
47
+ for (let i = 0; i < keys1.length; i++) {
48
+ if (keys1[i] !== keys2[i]) {
49
+ return false;
50
+ }
51
+ let v1 = o1[keys1[i]];
52
+ let v2 = o2[keys1[i]];
53
+ if (!compare(v1, v2))
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ return false;
59
+ };
60
+ return compare(p1, p2);
61
+ };
62
+ exports.default = deepEqual;
@@ -0,0 +1,2 @@
1
+ declare const deepExtend: (...args: any) => any;
2
+ export default deepExtend;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const deepExtend = function () {
4
+ if (arguments.length === 0)
5
+ return false;
6
+ if (arguments.length === 1)
7
+ return arguments[0];
8
+ if (typeof arguments[0] !== 'object')
9
+ return false;
10
+ const result = {};
11
+ const extendObject = function (o1, o2) {
12
+ if (o2 == null)
13
+ return;
14
+ const keys = Object.keys(o2);
15
+ for (let i = 0; i < keys.length; i++) {
16
+ if (o2.hasOwnProperty(keys[i])) {
17
+ if ((!o1.hasOwnProperty(keys[i])) || !(typeof o1[keys[i]] === 'object' && typeof o2[keys[i]] === 'object')) {
18
+ o1[keys[i]] = o2[keys[i]];
19
+ }
20
+ else {
21
+ if (o1[keys[i]] == null) {
22
+ o1[keys[i]] = o2[keys[i]];
23
+ }
24
+ else {
25
+ extendObject(o1[keys[i]], o2[keys[i]]);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ };
31
+ for (let i = 0; i < arguments.length; i++) {
32
+ if (typeof arguments[i] === 'object' && arguments[i]) {
33
+ extendObject(result, arguments[i]);
34
+ }
35
+ }
36
+ return result;
37
+ };
38
+ exports.default = deepExtend;
@@ -0,0 +1,3 @@
1
+ import deepEqual from './deepEqual';
2
+ import deepExtend from './deepExtend';
3
+ export { deepEqual, deepExtend };
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deepExtend = exports.deepEqual = void 0;
7
+ const deepEqual_1 = __importDefault(require("./deepEqual"));
8
+ exports.deepEqual = deepEqual_1.default;
9
+ const deepExtend_1 = __importDefault(require("./deepExtend"));
10
+ exports.deepExtend = deepExtend_1.default;
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@cleverbrush/deep",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "keywords": [
6
+ "deep operations on objects",
7
+ "deep equal",
8
+ "deep extend"
9
+ ],
10
+ "author": "Andrew Zolotukhin <andrew_zol@cleverbrush.com>",
11
+ "license": "BSD",
12
+ "main": "./dist/index.js",
13
+ "scripts": {
14
+ "watch": "tsc --watch",
15
+ "build": "tsc"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "github:cleverbrush/libs"
20
+ },
21
+ "types": "./dist/index.d.ts"
22
+ }
@@ -0,0 +1,67 @@
1
+ const isBothNaN = function (v1, v2) {
2
+ return Number.isNaN(v1) && Number.isNaN(v2);
3
+ };
4
+
5
+ const deepEqual = function (p1, p2) {
6
+ if (arguments.length !== 2) return false;
7
+ const cache = new Map();
8
+
9
+ const compare = function (o1, o2) {
10
+ const arraysAreIdentical = function (a1, a2) {
11
+ if (a1.length !== a2.length) return false;
12
+ const c1 = a1.map((t) => t).sort();
13
+ const c2 = a2.map((t) => t).sort();
14
+
15
+ for (let i = 0; i < c1.length; i++) {
16
+ if (!compare(c1[i], c2[i])) return false;
17
+ }
18
+ return true;
19
+ };
20
+
21
+ if (arguments.length !== 2) return false;
22
+ if (o1 === o2) return true;
23
+ if (typeof o1 !== typeof o2) return false;
24
+ if (isBothNaN(o1, o2)) return true;
25
+
26
+ if (
27
+ (Array.isArray(o1) && !Array.isArray(o2)) ||
28
+ (!Array.isArray(o1) && Array.isArray(o2))
29
+ ) {
30
+ return false;
31
+ }
32
+ if (Array.isArray(o1) && Array.isArray(o2)) {
33
+ return arraysAreIdentical(o1, o2);
34
+ }
35
+
36
+ if (typeof o1 === 'object') {
37
+ if (cache.get(o1) === true) {
38
+ return false;
39
+ }
40
+
41
+ cache.set(o1, true);
42
+
43
+ let keys1 = Object.keys(o1);
44
+ let keys2 = Object.keys(o2);
45
+ if (keys1.length != keys2.length) return false;
46
+
47
+ keys1.sort();
48
+ keys2.sort();
49
+ for (let i = 0; i < keys1.length; i++) {
50
+ if (keys1[i] !== keys2[i]) {
51
+ return false;
52
+ }
53
+
54
+ let v1 = o1[keys1[i]];
55
+ let v2 = o2[keys1[i]];
56
+ if (!compare(v1, v2)) return false;
57
+ }
58
+ return true;
59
+ }
60
+
61
+ return false;
62
+ };
63
+
64
+ return compare(p1, p2);
65
+ };
66
+
67
+ export default deepEqual;
@@ -0,0 +1,41 @@
1
+ const deepExtend: (...args: any) => any = function () {
2
+ if (arguments.length === 0) return false;
3
+ if (arguments.length === 1) return arguments[0];
4
+ if (typeof arguments[0] !== 'object') return false;
5
+
6
+ const result = {};
7
+
8
+ const extendObject = function (o1, o2) {
9
+ if (o2 == null) return;
10
+ const keys = Object.keys(o2);
11
+
12
+ for (let i = 0; i < keys.length; i++) {
13
+ if (o2.hasOwnProperty(keys[i])) {
14
+ if (
15
+ !o1.hasOwnProperty(keys[i]) ||
16
+ !(
17
+ typeof o1[keys[i]] === 'object' &&
18
+ typeof o2[keys[i]] === 'object'
19
+ )
20
+ ) {
21
+ o1[keys[i]] = o2[keys[i]];
22
+ } else {
23
+ if (o1[keys[i]] == null) {
24
+ o1[keys[i]] = o2[keys[i]];
25
+ } else {
26
+ extendObject(o1[keys[i]], o2[keys[i]]);
27
+ }
28
+ }
29
+ }
30
+ }
31
+ };
32
+
33
+ for (let i = 0; i < arguments.length; i++) {
34
+ if (typeof arguments[i] === 'object' && arguments[i]) {
35
+ extendObject(result, arguments[i]);
36
+ }
37
+ }
38
+
39
+ return result;
40
+ };
41
+ export default deepExtend;
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ import deepEqual from './deepEqual';
2
+ import deepExtend from './deepExtend';
3
+
4
+ export { deepEqual, deepExtend };
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist",
5
+ "declaration": true,
6
+ "target": "ES2020",
7
+ "module": "CommonJS",
8
+ "esModuleInterop": true,
9
+ "moduleResolution": "Node"
10
+ },
11
+ "files": ["./src/index.ts"],
12
+ "watchOptions": {
13
+ "excludeDirectories": ["./dist"]
14
+ }
15
+ }