@bhbr/copycat 0.0.0-stage → 1.0.0

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.
package/README.md CHANGED
@@ -1,3 +1,6 @@
1
- # Temporary Holding Version
1
+ # Description
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Some functions for object copying:
4
+
5
+ - copy: a shallow copy
6
+ - deepCopy: a deep copy
@@ -0,0 +1,3 @@
1
+ export declare function copy(obj: any): any;
2
+ export declare function deepCopy(obj: any, memo?: Array<Array<object>>): any;
3
+ //# sourceMappingURL=copycat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copycat.d.ts","sourceRoot":"","sources":["../src/copycat.ts"],"names":[],"mappings":"AAGA,wBAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAwClC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,GAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAM,GAAG,GAAG,CAoFvE"}
@@ -0,0 +1,113 @@
1
+ import { isInstanceOf } from '@bhbr/upper-class';
2
+ export function copy(obj) {
3
+ // shallow copy
4
+ // numbers, string, booleans
5
+ // are passed by value anyway,
6
+ // so no need to create an explicit copy
7
+ if (typeof obj != 'object' || obj === null) {
8
+ return obj;
9
+ }
10
+ // Arrays are by default passed by reference.
11
+ // So for a copy, we create a new
12
+ // empty Array and fill it
13
+ if (obj.constructor.name == 'Array') {
14
+ let newObj = [];
15
+ for (let x of obj) {
16
+ newObj.push(x);
17
+ }
18
+ return newObj;
19
+ }
20
+ // If the object has a copy method (with no arguments), use that
21
+ if (obj.copy !== undefined) {
22
+ if (typeof obj.copy === 'function') {
23
+ let copy = obj.copy();
24
+ if (copy !== undefined) {
25
+ return copy;
26
+ }
27
+ }
28
+ }
29
+ // Objects have a convenience method:
30
+ // assign all of the original object's
31
+ // properties to an empty object
32
+ return Object.assign(new obj.constructor(), obj);
33
+ // This is a "shallow" copy though:
34
+ // Porperties that are objects will be shared
35
+ // with the original. Modifying or reassigning
36
+ // them in the original will affect the copy,
37
+ // and vice versa
38
+ }
39
+ export function deepCopy(obj, memo = []) {
40
+ // A deep copy recursively creates copies of all the objects
41
+ // encountered as properties. Shared objects (i. e.
42
+ // the same object assigned to different properties)
43
+ // must be tracked and their identity retained.
44
+ // This is done via memoization and the reason
45
+ // why this implementation is so convoluted
46
+ if (obj.deepCopy !== undefined) {
47
+ if (typeof obj.deepCopy === 'function') {
48
+ let copy = obj.deepCopy();
49
+ if (copy !== undefined) {
50
+ return copy;
51
+ }
52
+ }
53
+ }
54
+ if (typeof obj != 'object' || obj === null) {
55
+ return obj;
56
+ }
57
+ if (obj.constructor.name.endsWith('Event')) {
58
+ return null;
59
+ }
60
+ if (obj.constructor.name == 'Array') {
61
+ let newObj = [];
62
+ memo.push([obj, newObj]);
63
+ for (let value of obj) {
64
+ var copiedValue;
65
+ var alreadyCopied = false;
66
+ for (let pair of memo) {
67
+ if (pair[0] === value) {
68
+ alreadyCopied = true;
69
+ copiedValue = pair[1];
70
+ }
71
+ }
72
+ if (alreadyCopied) {
73
+ newObj.push(copiedValue);
74
+ }
75
+ else {
76
+ let y = deepCopy(value, memo);
77
+ newObj.push(y);
78
+ memo.push([value, y]);
79
+ }
80
+ }
81
+ return newObj;
82
+ }
83
+ let newObj;
84
+ if (isInstanceOf(obj, 'Element')) {
85
+ newObj = document.createElement(obj.namespaceURI, obj.localName);
86
+ }
87
+ else {
88
+ newObj = Object.create(obj.constructor.prototype);
89
+ }
90
+ memo.push([obj, newObj]);
91
+ if (newObj === null) {
92
+ return newObj;
93
+ }
94
+ for (let [key, value] of Object.entries(obj)) {
95
+ var copiedValue;
96
+ var alreadyCopied = false;
97
+ for (let pair of memo) {
98
+ if (pair[0] === value) {
99
+ alreadyCopied = true;
100
+ copiedValue = pair[1];
101
+ }
102
+ }
103
+ if (alreadyCopied) {
104
+ newObj[key] = copiedValue;
105
+ }
106
+ else {
107
+ let y = deepCopy(value, memo);
108
+ newObj[key] = y;
109
+ }
110
+ }
111
+ return newObj;
112
+ }
113
+ //# sourceMappingURL=copycat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copycat.js","sourceRoot":"","sources":["../src/copycat.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,42 @@
1
1
  {
2
2
  "name": "@bhbr/copycat",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Some functions for object copying (deep and shallow)",
5
+ "type": "module",
6
+ "main": "./dist/copycat.js",
7
+ "types": "./dist/copycat.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/copycat.d.ts",
11
+ "import": "./dist/copycat.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist/copycat.js",
16
+ "dist/copycat.d.ts",
17
+ "dist/copycat.js.map",
18
+ "dist/copycat.d.ts.map"
19
+ ],
20
+ "scripts": {
21
+ "build": "cd build && ./build.sh",
22
+ "test": "node dist/_tests/copycat_tests.js",
23
+ "prepack": "npm run build"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/bhbr/copycat"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/bhbr/copycat/issues"
31
+ },
32
+ "homepage": "https://github.com/bhbr/copycat#readme",
33
+ "keywords": [],
34
+ "author": "Ben Hambrecht",
35
+ "license": "ISC",
36
+ "dependencies": {
37
+ "@bhbr/upper-class": "^1.0.1"
38
+ },
39
+ "devDependencies": {
40
+ "@bhbr/tsts": "^1.1.3"
41
+ }
42
+ }