@xyo-network/hash 2.75.0 → 2.75.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.
Files changed (58) hide show
  1. package/dist/browser/PayloadHasher.d.cts +20 -0
  2. package/dist/browser/PayloadHasher.d.cts.map +1 -0
  3. package/dist/browser/PayloadHasher.js +10 -57
  4. package/dist/browser/PayloadHasher.js.map +1 -1
  5. package/dist/browser/index.d.cts +5 -0
  6. package/dist/browser/index.d.cts.map +1 -0
  7. package/dist/browser/index.js +4 -119
  8. package/dist/browser/index.js.map +1 -1
  9. package/dist/browser/model.d.cts +2 -0
  10. package/dist/browser/model.d.cts.map +1 -0
  11. package/dist/browser/removeEmptyFields.d.cts +2 -0
  12. package/dist/browser/removeEmptyFields.d.cts.map +1 -0
  13. package/dist/browser/removeEmptyFields.js +1 -2
  14. package/dist/browser/removeEmptyFields.js.map +1 -1
  15. package/dist/browser/removeFields.d.cts +7 -0
  16. package/dist/browser/removeFields.d.cts.map +1 -0
  17. package/dist/browser/removeFields.js +3 -4
  18. package/dist/browser/removeFields.js.map +1 -1
  19. package/dist/browser/sortFields.d.cts +3 -0
  20. package/dist/browser/sortFields.d.cts.map +1 -0
  21. package/dist/browser/sortFields.js +2 -3
  22. package/dist/browser/sortFields.js.map +1 -1
  23. package/dist/docs.json +3448 -0
  24. package/dist/node/PayloadHasher.d.cts +20 -0
  25. package/dist/node/PayloadHasher.d.cts.map +1 -0
  26. package/dist/node/PayloadHasher.js +66 -15
  27. package/dist/node/PayloadHasher.js.map +1 -1
  28. package/dist/node/PayloadHasher.mjs +63 -13
  29. package/dist/node/PayloadHasher.mjs.map +1 -1
  30. package/dist/node/index.d.cts +5 -0
  31. package/dist/node/index.d.cts.map +1 -0
  32. package/dist/node/index.js +145 -9
  33. package/dist/node/index.js.map +1 -1
  34. package/dist/node/index.mjs +122 -4
  35. package/dist/node/index.mjs.map +1 -1
  36. package/dist/node/model.d.cts +2 -0
  37. package/dist/node/model.d.cts.map +1 -0
  38. package/dist/node/model.js +2 -0
  39. package/dist/node/model.js.map +1 -1
  40. package/dist/node/removeEmptyFields.d.cts +2 -0
  41. package/dist/node/removeEmptyFields.d.cts.map +1 -0
  42. package/dist/node/removeEmptyFields.js +3 -1
  43. package/dist/node/removeEmptyFields.js.map +1 -1
  44. package/dist/node/removeEmptyFields.mjs +2 -1
  45. package/dist/node/removeEmptyFields.mjs.map +1 -1
  46. package/dist/node/removeFields.d.cts +7 -0
  47. package/dist/node/removeFields.d.cts.map +1 -0
  48. package/dist/node/removeFields.js +5 -3
  49. package/dist/node/removeFields.js.map +1 -1
  50. package/dist/node/removeFields.mjs +4 -3
  51. package/dist/node/removeFields.mjs.map +1 -1
  52. package/dist/node/sortFields.d.cts +3 -0
  53. package/dist/node/sortFields.d.cts.map +1 -0
  54. package/dist/node/sortFields.js +4 -2
  55. package/dist/node/sortFields.js.map +1 -1
  56. package/dist/node/sortFields.mjs +3 -2
  57. package/dist/node/sortFields.mjs.map +1 -1
  58. package/package.json +8 -8
@@ -0,0 +1,20 @@
1
+ import { AnyObject, ObjectWrapper } from '@xyo-network/object';
2
+ import { WasmSupport } from '@xyo-network/wasm';
3
+ import { Hash } from './model';
4
+ export declare class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {
5
+ static readonly wasmInitialized: Promise<void>;
6
+ static readonly wasmSupport: WasmSupport;
7
+ static filterExclude<T extends AnyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
8
+ static filterInclude<T extends AnyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
9
+ static find<T extends AnyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
10
+ static hashAsync<T extends AnyObject>(obj: T): Promise<Hash>;
11
+ static hashFields<T extends AnyObject>(obj: T): T;
12
+ static hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]>;
13
+ static hashSync<T extends AnyObject>(obj: T): Hash;
14
+ static hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]>;
15
+ static stringifyHashFields<T extends AnyObject>(obj: T): string;
16
+ static toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>>;
17
+ hashAsync(): Promise<Hash>;
18
+ hashSync(): Hash;
19
+ }
20
+ //# sourceMappingURL=PayloadHasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAO9B,qBAAa,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IAClF,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKrF,aAAa,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKrF,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;WAI7E,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;WAIpC,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAI5E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;WAIrC,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAIpE,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC;WAIzC,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAMtE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,QAAQ,IAAI,IAAI;CAGjB"}
@@ -26,32 +26,83 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/PayloadHasher.ts
29
31
  var PayloadHasher_exports = {};
30
32
  __export(PayloadHasher_exports, {
31
33
  PayloadHasher: () => PayloadHasher
32
34
  });
33
35
  module.exports = __toCommonJS(PayloadHasher_exports);
34
- var import_object = require("@xyo-network/object");
36
+ var import_object2 = require("@xyo-network/object");
35
37
  var import_wasm = require("@xyo-network/wasm");
36
38
  var import_hash_wasm = require("hash-wasm");
37
39
  var import_sha = __toESM(require("sha.js"));
38
- var import_removeEmptyFields = require("./removeEmptyFields");
39
- var import_removeFields = require("./removeFields");
40
- var import_sortFields = require("./sortFields");
41
- const wasmSupportStatic = new import_wasm.WasmSupport(["bigInt"]);
42
- class PayloadHasher extends import_object.ObjectWrapper {
40
+
41
+ // src/removeEmptyFields.ts
42
+ var import_typeof = require("@xyo-network/typeof");
43
+ var removeEmptyFields = (obj) => {
44
+ if (obj === null || Array.isArray(obj))
45
+ return obj;
46
+ const newObject = {};
47
+ Object.entries(obj).forEach(([key, value]) => {
48
+ if ((0, import_typeof.typeOf)(value) === "object") {
49
+ newObject[key] = removeEmptyFields(value);
50
+ } else if (value !== void 0) {
51
+ newObject[key] = value;
52
+ }
53
+ });
54
+ return newObject;
55
+ };
56
+
57
+ // src/removeFields.ts
58
+ var import_lodash = require("@xylabs/lodash");
59
+ var deepBy = (obj, predicate, func) => {
60
+ if (Array.isArray(obj)) {
61
+ return obj;
62
+ }
63
+ const onlyObjects = (0, import_lodash.pickBy)(obj, import_lodash.isObject);
64
+ const nonObjects = (0, import_lodash.pickBy)(obj, (value) => !(0, import_lodash.isObject)(value));
65
+ const pickedObjects = (0, import_lodash.omitBy)(onlyObjects, predicate);
66
+ const pickedNonObjects = (0, import_lodash.omitBy)(nonObjects, predicate);
67
+ const processedObjects = (0, import_lodash.mapValues)(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
68
+ return (0, import_lodash.merge)({}, pickedNonObjects, processedObjects);
69
+ };
70
+ var deepOmitUnderscoreFields = (obj) => {
71
+ return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.omitBy);
72
+ };
73
+
74
+ // src/sortFields.ts
75
+ var import_object = require("@xyo-network/object");
76
+ var subSort = (value) => {
77
+ return (0, import_object.isObject)(value) ? sortFields(value) : value;
78
+ };
79
+ var sortFields = (obj) => {
80
+ const stringyObj = obj;
81
+ const result = {};
82
+ Object.keys(obj).sort().forEach((key) => {
83
+ result[key] = subSort(stringyObj[key]);
84
+ });
85
+ return result;
86
+ };
87
+
88
+ // src/PayloadHasher.ts
89
+ var wasmSupportStatic = new import_wasm.WasmSupport(["bigInt"]);
90
+ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
43
91
  static wasmInitialized = wasmSupportStatic.initialize();
44
92
  static wasmSupport = wasmSupportStatic;
45
93
  static async filterExclude(objs = [], hash) {
94
+ var _a;
46
95
  const hashes = Array.isArray(hash) ? hash : [hash];
47
- return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
96
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
48
97
  }
49
98
  static async filterInclude(objs = [], hash) {
99
+ var _a;
50
100
  const hashes = Array.isArray(hash) ? hash : [hash];
51
- return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
101
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
52
102
  }
53
103
  static async find(objs = [], hash) {
54
- return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
104
+ var _a;
105
+ return (_a = (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
55
106
  }
56
107
  static async hashAsync(obj) {
57
108
  await this.wasmInitialized;
@@ -66,10 +117,10 @@ class PayloadHasher extends import_object.ObjectWrapper {
66
117
  return this.hashSync(obj);
67
118
  }
68
119
  static hashFields(obj) {
69
- return (0, import_sortFields.sortFields)((0, import_removeEmptyFields.removeEmptyFields)((0, import_removeFields.deepOmitUnderscoreFields)(obj)));
120
+ return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
70
121
  }
71
122
  static async hashPairs(objs) {
72
- return await Promise.all(objs.map(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]));
123
+ return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
73
124
  }
74
125
  static hashSync(obj) {
75
126
  return (0, import_sha.default)("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex");
@@ -82,16 +133,16 @@ class PayloadHasher extends import_object.ObjectWrapper {
82
133
  }
83
134
  static async toMap(objs) {
84
135
  const result = {};
85
- await Promise.all(objs.map(async (obj) => result[await PayloadHasher.hashAsync(obj)] = obj));
136
+ await Promise.all(objs.map(async (obj) => result[await _PayloadHasher.hashAsync(obj)] = obj));
86
137
  return result;
87
138
  }
88
139
  async hashAsync() {
89
- return await PayloadHasher.hashAsync(this.obj);
140
+ return await _PayloadHasher.hashAsync(this.obj);
90
141
  }
91
142
  hashSync() {
92
- return PayloadHasher.hashSync(this.obj);
143
+ return _PayloadHasher.hashSync(this.obj);
93
144
  }
94
- }
145
+ };
95
146
  // Annotate the CommonJS export names for ESM import in node:
96
147
  0 && (module.exports = {
97
148
  PayloadHasher
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PayloadHasher.ts"],"sourcesContent":["import { AnyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { Hash } from './model'\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterInclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async find<T extends AnyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<T extends AnyObject>(obj: T): Promise<Hash> {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return await sha256(stringToHash)\n } catch (ex) {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends AnyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n static async hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]))\n }\n\n static hashSync<T extends AnyObject>(obj: T): Hash {\n return shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex')\n }\n\n static async hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n static stringifyHashFields<T extends AnyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAyC;AACzC,kBAA4B;AAC5B,uBAAuB;AACvB,iBAAkB;AAGlB,+BAAkC;AAClC,0BAAyC;AACzC,wBAA2B;AAE3B,MAAM,oBAAoB,IAAI,wBAAY,CAAC,QAAQ,CAAC;AAE7C,MAAM,sBAAuD,4BAAiB;AAAA,EACnF,OAAgB,kBAAkB,kBAAkB,WAAW;AAAA,EAC/D,OAAgB,cAAc;AAAA,EAE9B,aAAa,cAAmC,OAAY,CAAC,GAAG,MAAmC;AACjG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAChH;AAAA,EAEA,aAAa,cAAmC,OAAY,CAAC,GAAG,MAAmC;AACjG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAC/G;AAAA,EAEA,aAAa,KAA0B,OAAY,CAAC,GAAG,MAAoC;AACzF,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,EAClF;AAAA,EAEA,aAAa,UAA+B,KAAuB;AACjE,UAAM,KAAK;AACX,QAAI,KAAK,YAAY,YAAY;AAC/B,YAAM,eAAe,KAAK,oBAAoB,GAAG;AACjD,UAAI;AACF,eAAO,UAAM,yBAAO,YAAY;AAAA,MAClC,SAAS,IAAI;AACX,aAAK,YAAY,YAAY;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO,WAAgC,KAAW;AAChD,eAAO,kCAAW,gDAAkB,8CAAyB,GAAG,CAAC,CAAC;AAAA,EACpE;AAAA,EAEA,aAAa,UAA+B,MAAiC;AAC3E,WAAO,MAAM,QAAQ,IAAI,KAAK,IAA0B,OAAO,QAAQ,CAAC,KAAK,MAAM,cAAc,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,EACnH;AAAA,EAEA,OAAO,SAA8B,KAAc;AACjD,eAAO,WAAAA,SAAM,QAAQ,EAAE,OAAO,KAAK,oBAAoB,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,KAAK;AAAA,EACtF;AAAA,EAEA,aAAa,OAA4B,MAA4B;AACnE,WAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA,EAEA,OAAO,oBAAyC,KAAQ;AACtD,WAAO,KAAK,UAAU,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AAAA,EAEA,aAAa,MAA2B,MAAqC;AAC3E,UAAM,SAA4B,CAAC;AACnC,UAAM,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAS,OAAO,MAAM,cAAc,UAAU,GAAG,CAAC,IAAI,GAAI,CAAC;AAC7F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAA2B;AAC/B,WAAO,MAAM,cAAc,UAAU,KAAK,GAAG;AAAA,EAC/C;AAAA,EAEA,WAAiB;AACf,WAAO,cAAc,SAAS,KAAK,GAAG;AAAA,EACxC;AACF;","names":["shajs"]}
1
+ {"version":3,"sources":["../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["import { AnyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { Hash } from './model'\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterInclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async find<T extends AnyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<T extends AnyObject>(obj: T): Promise<Hash> {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return await sha256(stringToHash)\n } catch (ex) {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends AnyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n static async hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]))\n }\n\n static hashSync<T extends AnyObject>(obj: T): Hash {\n return shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex')\n }\n\n static async hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n static stringifyHashFields<T extends AnyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n}\n","import { typeOf } from '@xyo-network/typeof'\n\nexport const removeEmptyFields = <T extends Record<string, unknown>>(obj: T) => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: Record<string, unknown> = {}\n Object.entries(obj).forEach(([key, value]) => {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n })\n return newObject as T\n}\n","import { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { AnyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends AnyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, isObject, StringKeyObject } from '@xyo-network/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends AnyObject = AnyObject>(obj: T) => {\n const stringyObj = obj as StringKeyObject\n\n const result: StringKeyObject = {}\n Object.keys(obj)\n .sort()\n .forEach((key) => {\n result[key] = subSort(stringyObj[key])\n })\n return result as T\n}\n"],"mappings":"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","names":["import_object","obj","shajs"]}
@@ -1,24 +1,74 @@
1
+ // src/PayloadHasher.ts
1
2
  import { ObjectWrapper } from "@xyo-network/object";
2
3
  import { WasmSupport } from "@xyo-network/wasm";
3
4
  import { sha256 } from "hash-wasm";
4
5
  import shajs from "sha.js";
5
- import { removeEmptyFields } from "./removeEmptyFields";
6
- import { deepOmitUnderscoreFields } from "./removeFields";
7
- import { sortFields } from "./sortFields";
8
- const wasmSupportStatic = new WasmSupport(["bigInt"]);
9
- class PayloadHasher extends ObjectWrapper {
6
+
7
+ // src/removeEmptyFields.ts
8
+ import { typeOf } from "@xyo-network/typeof";
9
+ var removeEmptyFields = (obj) => {
10
+ if (obj === null || Array.isArray(obj))
11
+ return obj;
12
+ const newObject = {};
13
+ Object.entries(obj).forEach(([key, value]) => {
14
+ if (typeOf(value) === "object") {
15
+ newObject[key] = removeEmptyFields(value);
16
+ } else if (value !== void 0) {
17
+ newObject[key] = value;
18
+ }
19
+ });
20
+ return newObject;
21
+ };
22
+
23
+ // src/removeFields.ts
24
+ import { isObject, mapValues, merge, omitBy, pickBy } from "@xylabs/lodash";
25
+ var deepBy = (obj, predicate, func) => {
26
+ if (Array.isArray(obj)) {
27
+ return obj;
28
+ }
29
+ const onlyObjects = pickBy(obj, isObject);
30
+ const nonObjects = pickBy(obj, (value) => !isObject(value));
31
+ const pickedObjects = omitBy(onlyObjects, predicate);
32
+ const pickedNonObjects = omitBy(nonObjects, predicate);
33
+ const processedObjects = mapValues(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
34
+ return merge({}, pickedNonObjects, processedObjects);
35
+ };
36
+ var deepOmitUnderscoreFields = (obj) => {
37
+ return deepBy(obj, (_, key) => key.startsWith("_"), omitBy);
38
+ };
39
+
40
+ // src/sortFields.ts
41
+ import { isObject as isObject2 } from "@xyo-network/object";
42
+ var subSort = (value) => {
43
+ return isObject2(value) ? sortFields(value) : value;
44
+ };
45
+ var sortFields = (obj) => {
46
+ const stringyObj = obj;
47
+ const result = {};
48
+ Object.keys(obj).sort().forEach((key) => {
49
+ result[key] = subSort(stringyObj[key]);
50
+ });
51
+ return result;
52
+ };
53
+
54
+ // src/PayloadHasher.ts
55
+ var wasmSupportStatic = new WasmSupport(["bigInt"]);
56
+ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
10
57
  static wasmInitialized = wasmSupportStatic.initialize();
11
58
  static wasmSupport = wasmSupportStatic;
12
59
  static async filterExclude(objs = [], hash) {
60
+ var _a;
13
61
  const hashes = Array.isArray(hash) ? hash : [hash];
14
- return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
62
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
15
63
  }
16
64
  static async filterInclude(objs = [], hash) {
65
+ var _a;
17
66
  const hashes = Array.isArray(hash) ? hash : [hash];
18
- return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
67
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
19
68
  }
20
69
  static async find(objs = [], hash) {
21
- return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
70
+ var _a;
71
+ return (_a = (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
22
72
  }
23
73
  static async hashAsync(obj) {
24
74
  await this.wasmInitialized;
@@ -36,7 +86,7 @@ class PayloadHasher extends ObjectWrapper {
36
86
  return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
37
87
  }
38
88
  static async hashPairs(objs) {
39
- return await Promise.all(objs.map(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]));
89
+ return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
40
90
  }
41
91
  static hashSync(obj) {
42
92
  return shajs("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex");
@@ -49,16 +99,16 @@ class PayloadHasher extends ObjectWrapper {
49
99
  }
50
100
  static async toMap(objs) {
51
101
  const result = {};
52
- await Promise.all(objs.map(async (obj) => result[await PayloadHasher.hashAsync(obj)] = obj));
102
+ await Promise.all(objs.map(async (obj) => result[await _PayloadHasher.hashAsync(obj)] = obj));
53
103
  return result;
54
104
  }
55
105
  async hashAsync() {
56
- return await PayloadHasher.hashAsync(this.obj);
106
+ return await _PayloadHasher.hashAsync(this.obj);
57
107
  }
58
108
  hashSync() {
59
- return PayloadHasher.hashSync(this.obj);
109
+ return _PayloadHasher.hashSync(this.obj);
60
110
  }
61
- }
111
+ };
62
112
  export {
63
113
  PayloadHasher
64
114
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PayloadHasher.ts"],"sourcesContent":["import { AnyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { Hash } from './model'\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterInclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async find<T extends AnyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<T extends AnyObject>(obj: T): Promise<Hash> {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return await sha256(stringToHash)\n } catch (ex) {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends AnyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n static async hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]))\n }\n\n static hashSync<T extends AnyObject>(obj: T): Hash {\n return shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex')\n }\n\n static async hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n static stringifyHashFields<T extends AnyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n}\n"],"mappings":"AAAA,SAAoB,qBAAqB;AACzC,SAAS,mBAAmB;AAC5B,SAAS,cAAc;AACvB,OAAO,WAAW;AAGlB,SAAS,yBAAyB;AAClC,SAAS,gCAAgC;AACzC,SAAS,kBAAkB;AAE3B,MAAM,oBAAoB,IAAI,YAAY,CAAC,QAAQ,CAAC;AAE7C,MAAM,sBAAuD,cAAiB;AAAA,EACnF,OAAgB,kBAAkB,kBAAkB,WAAW;AAAA,EAC/D,OAAgB,cAAc;AAAA,EAE9B,aAAa,cAAmC,OAAY,CAAC,GAAG,MAAmC;AACjG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAChH;AAAA,EAEA,aAAa,cAAmC,OAAY,CAAC,GAAG,MAAmC;AACjG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAC/G;AAAA,EAEA,aAAa,KAA0B,OAAY,CAAC,GAAG,MAAoC;AACzF,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,EAClF;AAAA,EAEA,aAAa,UAA+B,KAAuB;AACjE,UAAM,KAAK;AACX,QAAI,KAAK,YAAY,YAAY;AAC/B,YAAM,eAAe,KAAK,oBAAoB,GAAG;AACjD,UAAI;AACF,eAAO,MAAM,OAAO,YAAY;AAAA,MAClC,SAAS,IAAI;AACX,aAAK,YAAY,YAAY;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO,WAAgC,KAAW;AAChD,WAAO,WAAW,kBAAkB,yBAAyB,GAAG,CAAC,CAAC;AAAA,EACpE;AAAA,EAEA,aAAa,UAA+B,MAAiC;AAC3E,WAAO,MAAM,QAAQ,IAAI,KAAK,IAA0B,OAAO,QAAQ,CAAC,KAAK,MAAM,cAAc,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,EACnH;AAAA,EAEA,OAAO,SAA8B,KAAc;AACjD,WAAO,MAAM,QAAQ,EAAE,OAAO,KAAK,oBAAoB,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,KAAK;AAAA,EACtF;AAAA,EAEA,aAAa,OAA4B,MAA4B;AACnE,WAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA,EAEA,OAAO,oBAAyC,KAAQ;AACtD,WAAO,KAAK,UAAU,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AAAA,EAEA,aAAa,MAA2B,MAAqC;AAC3E,UAAM,SAA4B,CAAC;AACnC,UAAM,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAS,OAAO,MAAM,cAAc,UAAU,GAAG,CAAC,IAAI,GAAI,CAAC;AAC7F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAA2B;AAC/B,WAAO,MAAM,cAAc,UAAU,KAAK,GAAG;AAAA,EAC/C;AAAA,EAEA,WAAiB;AACf,WAAO,cAAc,SAAS,KAAK,GAAG;AAAA,EACxC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["import { AnyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { Hash } from './model'\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterInclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async find<T extends AnyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<T extends AnyObject>(obj: T): Promise<Hash> {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return await sha256(stringToHash)\n } catch (ex) {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends AnyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n static async hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]))\n }\n\n static hashSync<T extends AnyObject>(obj: T): Hash {\n return shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex')\n }\n\n static async hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n static stringifyHashFields<T extends AnyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n}\n","import { typeOf } from '@xyo-network/typeof'\n\nexport const removeEmptyFields = <T extends Record<string, unknown>>(obj: T) => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: Record<string, unknown> = {}\n Object.entries(obj).forEach(([key, value]) => {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n })\n return newObject as T\n}\n","import { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { AnyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends AnyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, isObject, StringKeyObject } from '@xyo-network/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends AnyObject = AnyObject>(obj: T) => {\n const stringyObj = obj as StringKeyObject\n\n const result: StringKeyObject = {}\n Object.keys(obj)\n .sort()\n .forEach((key) => {\n result[key] = subSort(stringyObj[key])\n })\n return result as T\n}\n"],"mappings":"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","names":["obj","isObject"]}
@@ -0,0 +1,5 @@
1
+ export * from './PayloadHasher';
2
+ export * from './removeEmptyFields';
3
+ export * from './removeFields';
4
+ export * from './sortFields';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
@@ -1,8 +1,14 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
6
12
  var __copyProps = (to, from, except, desc) => {
7
13
  if (from && typeof from === "object" || typeof from === "function") {
8
14
  for (let key of __getOwnPropNames(from))
@@ -11,19 +17,149 @@ var __copyProps = (to, from, except, desc) => {
11
17
  }
12
18
  return to;
13
19
  };
14
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
15
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
16
31
  var src_exports = {};
32
+ __export(src_exports, {
33
+ PayloadHasher: () => PayloadHasher,
34
+ deepBy: () => deepBy,
35
+ deepOmitUnderscoreFields: () => deepOmitUnderscoreFields,
36
+ deepPickUnderscoreFields: () => deepPickUnderscoreFields,
37
+ removeEmptyFields: () => removeEmptyFields,
38
+ sortFields: () => sortFields
39
+ });
17
40
  module.exports = __toCommonJS(src_exports);
18
- __reExport(src_exports, require("./PayloadHasher"), module.exports);
19
- __reExport(src_exports, require("./removeEmptyFields"), module.exports);
20
- __reExport(src_exports, require("./removeFields"), module.exports);
21
- __reExport(src_exports, require("./sortFields"), module.exports);
41
+
42
+ // src/PayloadHasher.ts
43
+ var import_object2 = require("@xyo-network/object");
44
+ var import_wasm = require("@xyo-network/wasm");
45
+ var import_hash_wasm = require("hash-wasm");
46
+ var import_sha = __toESM(require("sha.js"));
47
+
48
+ // src/removeEmptyFields.ts
49
+ var import_typeof = require("@xyo-network/typeof");
50
+ var removeEmptyFields = (obj) => {
51
+ if (obj === null || Array.isArray(obj))
52
+ return obj;
53
+ const newObject = {};
54
+ Object.entries(obj).forEach(([key, value]) => {
55
+ if ((0, import_typeof.typeOf)(value) === "object") {
56
+ newObject[key] = removeEmptyFields(value);
57
+ } else if (value !== void 0) {
58
+ newObject[key] = value;
59
+ }
60
+ });
61
+ return newObject;
62
+ };
63
+
64
+ // src/removeFields.ts
65
+ var import_lodash = require("@xylabs/lodash");
66
+ var deepBy = (obj, predicate, func) => {
67
+ if (Array.isArray(obj)) {
68
+ return obj;
69
+ }
70
+ const onlyObjects = (0, import_lodash.pickBy)(obj, import_lodash.isObject);
71
+ const nonObjects = (0, import_lodash.pickBy)(obj, (value) => !(0, import_lodash.isObject)(value));
72
+ const pickedObjects = (0, import_lodash.omitBy)(onlyObjects, predicate);
73
+ const pickedNonObjects = (0, import_lodash.omitBy)(nonObjects, predicate);
74
+ const processedObjects = (0, import_lodash.mapValues)(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
75
+ return (0, import_lodash.merge)({}, pickedNonObjects, processedObjects);
76
+ };
77
+ var deepOmitUnderscoreFields = (obj) => {
78
+ return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.omitBy);
79
+ };
80
+ var deepPickUnderscoreFields = (obj) => {
81
+ return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.pickBy);
82
+ };
83
+
84
+ // src/sortFields.ts
85
+ var import_object = require("@xyo-network/object");
86
+ var subSort = (value) => {
87
+ return (0, import_object.isObject)(value) ? sortFields(value) : value;
88
+ };
89
+ var sortFields = (obj) => {
90
+ const stringyObj = obj;
91
+ const result = {};
92
+ Object.keys(obj).sort().forEach((key) => {
93
+ result[key] = subSort(stringyObj[key]);
94
+ });
95
+ return result;
96
+ };
97
+
98
+ // src/PayloadHasher.ts
99
+ var wasmSupportStatic = new import_wasm.WasmSupport(["bigInt"]);
100
+ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
101
+ static wasmInitialized = wasmSupportStatic.initialize();
102
+ static wasmSupport = wasmSupportStatic;
103
+ static async filterExclude(objs = [], hash) {
104
+ var _a;
105
+ const hashes = Array.isArray(hash) ? hash : [hash];
106
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
107
+ }
108
+ static async filterInclude(objs = [], hash) {
109
+ var _a;
110
+ const hashes = Array.isArray(hash) ? hash : [hash];
111
+ return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
112
+ }
113
+ static async find(objs = [], hash) {
114
+ var _a;
115
+ return (_a = (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
116
+ }
117
+ static async hashAsync(obj) {
118
+ await this.wasmInitialized;
119
+ if (this.wasmSupport.canUseWasm) {
120
+ const stringToHash = this.stringifyHashFields(obj);
121
+ try {
122
+ return await (0, import_hash_wasm.sha256)(stringToHash);
123
+ } catch (ex) {
124
+ this.wasmSupport.allowWasm = false;
125
+ }
126
+ }
127
+ return this.hashSync(obj);
128
+ }
129
+ static hashFields(obj) {
130
+ return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
131
+ }
132
+ static async hashPairs(objs) {
133
+ return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
134
+ }
135
+ static hashSync(obj) {
136
+ return (0, import_sha.default)("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex");
137
+ }
138
+ static async hashes(objs) {
139
+ return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
140
+ }
141
+ static stringifyHashFields(obj) {
142
+ return JSON.stringify(this.hashFields(obj));
143
+ }
144
+ static async toMap(objs) {
145
+ const result = {};
146
+ await Promise.all(objs.map(async (obj) => result[await _PayloadHasher.hashAsync(obj)] = obj));
147
+ return result;
148
+ }
149
+ async hashAsync() {
150
+ return await _PayloadHasher.hashAsync(this.obj);
151
+ }
152
+ hashSync() {
153
+ return _PayloadHasher.hashSync(this.obj);
154
+ }
155
+ };
22
156
  // Annotate the CommonJS export names for ESM import in node:
23
157
  0 && (module.exports = {
24
- ...require("./PayloadHasher"),
25
- ...require("./removeEmptyFields"),
26
- ...require("./removeFields"),
27
- ...require("./sortFields")
158
+ PayloadHasher,
159
+ deepBy,
160
+ deepOmitUnderscoreFields,
161
+ deepPickUnderscoreFields,
162
+ removeEmptyFields,
163
+ sortFields
28
164
  });
29
165
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wBAAc,4BAAd;AACA,wBAAc,gCADd;AAEA,wBAAc,2BAFd;AAGA,wBAAc,yBAHd;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { AnyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { Hash } from './model'\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends AnyObject = AnyObject> extends ObjectWrapper<T> {\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterInclude<T extends AnyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async find<T extends AnyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<T extends AnyObject>(obj: T): Promise<Hash> {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return await sha256(stringToHash)\n } catch (ex) {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends AnyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n static async hashPairs<T extends AnyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hashAsync(obj)]))\n }\n\n static hashSync<T extends AnyObject>(obj: T): Hash {\n return shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex')\n }\n\n static async hashes<T extends AnyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n static stringifyHashFields<T extends AnyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends AnyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n}\n","import { typeOf } from '@xyo-network/typeof'\n\nexport const removeEmptyFields = <T extends Record<string, unknown>>(obj: T) => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: Record<string, unknown> = {}\n Object.entries(obj).forEach(([key, value]) => {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n })\n return newObject as T\n}\n","import { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { AnyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends AnyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends AnyObject>(obj: T) => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, isObject, StringKeyObject } from '@xyo-network/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends AnyObject = AnyObject>(obj: T) => {\n const stringyObj = obj as StringKeyObject\n\n const result: StringKeyObject = {}\n Object.keys(obj)\n .sort()\n .forEach((key) => {\n result[key] = subSort(stringyObj[key])\n })\n return result as T\n}\n"],"mappings":"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","names":["import_object","obj","shajs"]}