@xyo-network/hash 2.84.19 → 2.85.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.
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
9
  var __export = (target, all) => {
9
10
  for (var name in all)
10
11
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -34,16 +35,11 @@ __export(src_exports, {
34
35
  deepBy: () => deepBy,
35
36
  deepOmitUnderscoreFields: () => deepOmitUnderscoreFields,
36
37
  deepPickUnderscoreFields: () => deepPickUnderscoreFields,
37
- isHex: () => isHex,
38
38
  removeEmptyFields: () => removeEmptyFields,
39
39
  sortFields: () => sortFields
40
40
  });
41
41
  module.exports = __toCommonJS(src_exports);
42
42
 
43
- // src/model.ts
44
- var hexRegex = /[\da-f]+/i;
45
- var isHex = (value) => hexRegex.test(value);
46
-
47
43
  // src/PayloadHasher.ts
48
44
  var import_hex = require("@xylabs/hex");
49
45
  var import_platform = require("@xylabs/platform");
@@ -54,7 +50,7 @@ var import_sha = __toESM(require("sha.js"), 1);
54
50
 
55
51
  // src/removeEmptyFields.ts
56
52
  var import_typeof = require("@xylabs/typeof");
57
- var removeEmptyFields = (obj) => {
53
+ var removeEmptyFields = /* @__PURE__ */ __name((obj) => {
58
54
  if (obj === null || Array.isArray(obj))
59
55
  return obj;
60
56
  const newObject = {};
@@ -66,11 +62,11 @@ var removeEmptyFields = (obj) => {
66
62
  }
67
63
  }
68
64
  return newObject;
69
- };
65
+ }, "removeEmptyFields");
70
66
 
71
67
  // src/removeFields.ts
72
68
  var import_lodash = require("@xylabs/lodash");
73
- var deepBy = (obj, predicate, func) => {
69
+ var deepBy = /* @__PURE__ */ __name((obj, predicate, func) => {
74
70
  if (Array.isArray(obj)) {
75
71
  return obj;
76
72
  }
@@ -80,50 +76,59 @@ var deepBy = (obj, predicate, func) => {
80
76
  const pickedNonObjects = (0, import_lodash.omitBy)(nonObjects, predicate);
81
77
  const processedObjects = (0, import_lodash.mapValues)(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
82
78
  return (0, import_lodash.merge)({}, pickedNonObjects, processedObjects);
83
- };
84
- var deepOmitUnderscoreFields = (obj) => {
79
+ }, "deepBy");
80
+ var deepOmitUnderscoreFields = /* @__PURE__ */ __name((obj) => {
85
81
  return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.omitBy);
86
- };
87
- var deepPickUnderscoreFields = (obj) => {
82
+ }, "deepOmitUnderscoreFields");
83
+ var deepPickUnderscoreFields = /* @__PURE__ */ __name((obj) => {
88
84
  return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.pickBy);
89
- };
85
+ }, "deepPickUnderscoreFields");
90
86
 
91
87
  // src/sortFields.ts
92
88
  var import_object = require("@xyo-network/object");
93
- var subSort = (value) => {
89
+ var subSort = /* @__PURE__ */ __name((value) => {
94
90
  return (0, import_object.isObject)(value) ? sortFields(value) : value;
95
- };
96
- var sortFields = (obj) => {
91
+ }, "subSort");
92
+ var sortFields = /* @__PURE__ */ __name((obj) => {
97
93
  const result = {};
98
94
  const keys = Object.keys(obj);
99
95
  for (const key of keys.sort()) {
100
96
  result[key] = subSort(obj[key]);
101
97
  }
102
98
  return result;
103
- };
99
+ }, "sortFields");
104
100
 
105
101
  // src/PayloadHasher.ts
106
- var wasmSupportStatic = new import_wasm.WasmSupport(["bigInt"]);
102
+ var wasmSupportStatic = new import_wasm.WasmSupport([
103
+ "bigInt"
104
+ ]);
107
105
  var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
106
+ static {
107
+ __name(this, "PayloadHasher");
108
+ }
108
109
  static allowSubtle = true;
109
110
  static wasmInitialized = wasmSupportStatic.initialize();
110
111
  static wasmSupport = wasmSupportStatic;
111
112
  static async filterExclude(objs = [], hash) {
112
- const hashes = Array.isArray(hash) ? hash : [hash];
113
+ const hashes = Array.isArray(hash) ? hash : [
114
+ hash
115
+ ];
113
116
  return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
114
117
  }
115
118
  static async filterInclude(objs = [], hash) {
116
- const hashes = Array.isArray(hash) ? hash : [hash];
119
+ const hashes = Array.isArray(hash) ? hash : [
120
+ hash
121
+ ];
117
122
  return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
118
123
  }
119
124
  static async find(objs = [], hash) {
120
125
  return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
121
126
  }
122
127
  /**
123
- * Asynchronously hashes a payload
124
- * @param obj A payload
125
- * @returns The payload hash
126
- */
128
+ * Asynchronously hashes a payload
129
+ * @param obj A payload
130
+ * @returns The payload hash
131
+ */
127
132
  static async hashAsync(obj) {
128
133
  if (_PayloadHasher.allowSubtle) {
129
134
  try {
@@ -131,7 +136,9 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
131
136
  const stringToHash = this.stringifyHashFields(obj);
132
137
  const b = enc.encode(stringToHash);
133
138
  const hashArray = await import_platform.subtle.digest("SHA-256", b);
134
- return (0, import_hex.hexFromArrayBuffer)(hashArray, { bitLength: 256 });
139
+ return (0, import_hex.hexFromArrayBuffer)(hashArray, {
140
+ bitLength: 256
141
+ });
135
142
  } catch (ex) {
136
143
  const error = ex;
137
144
  console.error(`Setting allowSubtle to false [${error.message}]`);
@@ -154,35 +161,38 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
154
161
  return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
155
162
  }
156
163
  /**
157
- * Creates an array of payload/hash tuples based on the payloads passed in
158
- * @param objs Any array of payloads
159
- * @returns An array of payload/hash tuples
160
- */
164
+ * Creates an array of payload/hash tuples based on the payloads passed in
165
+ * @param objs Any array of payloads
166
+ * @returns An array of payload/hash tuples
167
+ */
161
168
  static async hashPairs(objs) {
162
- return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
169
+ return await Promise.all(objs.map(async (obj) => [
170
+ obj,
171
+ await _PayloadHasher.hashAsync(obj)
172
+ ]));
163
173
  }
164
174
  /**
165
- * Synchronously hashes a payload
166
- * @param obj A payload
167
- * @returns The payload hash
168
- */
175
+ * Synchronously hashes a payload
176
+ * @param obj A payload
177
+ * @returns The payload hash
178
+ */
169
179
  static hashSync(obj) {
170
180
  return (0, import_hex.asHash)((0, import_sha.default)("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
171
181
  }
172
182
  /**
173
- * Creates an array of payload hashes based on the payloads passed in
174
- * @param objs Any array of payloads
175
- * @returns An array of payload hashes
176
- */
183
+ * Creates an array of payload hashes based on the payloads passed in
184
+ * @param objs Any array of payloads
185
+ * @returns An array of payload hashes
186
+ */
177
187
  static async hashes(objs) {
178
188
  return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
179
189
  }
180
190
  /**
181
- * Returns a clone of the payload that is JSON safe
182
- * @param obj A payload
183
- * @param meta Keeps underscore (meta) fields if set to true
184
- * @returns Returns a clone of the payload that is JSON safe
185
- */
191
+ * Returns a clone of the payload that is JSON safe
192
+ * @param obj A payload
193
+ * @param meta Keeps underscore (meta) fields if set to true
194
+ * @returns Returns a clone of the payload that is JSON safe
195
+ */
186
196
  static jsonPayload(payload, meta = false) {
187
197
  return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
188
198
  }
@@ -190,18 +200,17 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
190
200
  return JSON.stringify(this.hashFields(obj));
191
201
  }
192
202
  /**
193
- * Creates an object map of payload hashes to payloads based on the payloads passed in
194
- * @param objs Any array of payloads
195
- * @returns A map of hashes to payloads
196
- */
203
+ * Creates an object map of payload hashes to payloads based on the payloads passed in
204
+ * @param objs Any array of payloads
205
+ * @returns A map of hashes to payloads
206
+ */
197
207
  static async toMap(objs) {
198
- return Object.fromEntries(
199
- await Promise.all(
200
- objs.map(async (obj) => {
201
- return [await _PayloadHasher.hashAsync(obj), obj];
202
- })
203
- )
204
- );
208
+ return Object.fromEntries(await Promise.all(objs.map(async (obj) => {
209
+ return [
210
+ await _PayloadHasher.hashAsync(obj),
211
+ obj
212
+ ];
213
+ })));
205
214
  }
206
215
  async hashAsync() {
207
216
  return await _PayloadHasher.hashAsync(this.obj);
@@ -210,10 +219,10 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
210
219
  return _PayloadHasher.hashSync(this.obj);
211
220
  }
212
221
  /**
213
- * Returns a clone of the payload that is JSON safe
214
- * @param meta Keeps underscore (meta) fields if set to true
215
- * @returns Returns a clone of the payload that is JSON safe
216
- */
222
+ * Returns a clone of the payload that is JSON safe
223
+ * @param meta Keeps underscore (meta) fields if set to true
224
+ * @returns Returns a clone of the payload that is JSON safe
225
+ */
217
226
  jsonPayload(meta = false) {
218
227
  return _PayloadHasher.jsonPayload(this.obj, meta);
219
228
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './model'\nexport * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[\\da-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends EmptyObject>(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 EmptyObject>(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 EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hashAsync<T extends EmptyObject>(obj: T): Promise<Hash> {\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends EmptyObject>(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 /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\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 /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\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 { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends EmptyObject>(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 EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } 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 EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n"],"mappings":"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","names":["import_object","obj","shajs"]}
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 { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends EmptyObject>(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 EmptyObject>(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 EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hashAsync<T extends EmptyObject>(obj: T): Promise<Hash> {\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends EmptyObject>(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 /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\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 /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\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 { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends EmptyObject>(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 EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } 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 EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n"],"mappings":"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","names":["import_object","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitUnderscoreFields","_","key","startsWith","deepPickUnderscoreFields","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","wasmInitialized","initialize","wasmSupport","filterExclude","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterInclude","find","hashAsync","obj","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitUnderscoreFields","Promise","all","shajs","update","toString","jsonPayload","payload","meta","JSON","stringify","toMap","Object","fromEntries"]}
@@ -1,4 +1,3 @@
1
- export * from './model';
2
1
  export * from './PayloadHasher';
3
2
  export * from './removeEmptyFields';
4
3
  export * from './removeFields';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
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,4 +1,3 @@
1
- export * from './model';
2
1
  export * from './PayloadHasher';
3
2
  export * from './removeEmptyFields';
4
3
  export * from './removeFields';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
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,4 +1,3 @@
1
- export * from './model';
2
1
  export * from './PayloadHasher';
3
2
  export * from './removeEmptyFields';
4
3
  export * from './removeFields';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
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,6 +1,5 @@
1
- // src/model.ts
2
- var hexRegex = /[\da-f]+/i;
3
- var isHex = (value) => hexRegex.test(value);
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
3
 
5
4
  // src/PayloadHasher.ts
6
5
  import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
@@ -12,7 +11,7 @@ import shajs from "sha.js";
12
11
 
13
12
  // src/removeEmptyFields.ts
14
13
  import { typeOf } from "@xylabs/typeof";
15
- var removeEmptyFields = (obj) => {
14
+ var removeEmptyFields = /* @__PURE__ */ __name((obj) => {
16
15
  if (obj === null || Array.isArray(obj))
17
16
  return obj;
18
17
  const newObject = {};
@@ -24,11 +23,11 @@ var removeEmptyFields = (obj) => {
24
23
  }
25
24
  }
26
25
  return newObject;
27
- };
26
+ }, "removeEmptyFields");
28
27
 
29
28
  // src/removeFields.ts
30
29
  import { isObject, mapValues, merge, omitBy, pickBy } from "@xylabs/lodash";
31
- var deepBy = (obj, predicate, func) => {
30
+ var deepBy = /* @__PURE__ */ __name((obj, predicate, func) => {
32
31
  if (Array.isArray(obj)) {
33
32
  return obj;
34
33
  }
@@ -38,50 +37,59 @@ var deepBy = (obj, predicate, func) => {
38
37
  const pickedNonObjects = omitBy(nonObjects, predicate);
39
38
  const processedObjects = mapValues(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
40
39
  return merge({}, pickedNonObjects, processedObjects);
41
- };
42
- var deepOmitUnderscoreFields = (obj) => {
40
+ }, "deepBy");
41
+ var deepOmitUnderscoreFields = /* @__PURE__ */ __name((obj) => {
43
42
  return deepBy(obj, (_, key) => key.startsWith("_"), omitBy);
44
- };
45
- var deepPickUnderscoreFields = (obj) => {
43
+ }, "deepOmitUnderscoreFields");
44
+ var deepPickUnderscoreFields = /* @__PURE__ */ __name((obj) => {
46
45
  return deepBy(obj, (_, key) => key.startsWith("_"), pickBy);
47
- };
46
+ }, "deepPickUnderscoreFields");
48
47
 
49
48
  // src/sortFields.ts
50
49
  import { isObject as isObject2 } from "@xyo-network/object";
51
- var subSort = (value) => {
50
+ var subSort = /* @__PURE__ */ __name((value) => {
52
51
  return isObject2(value) ? sortFields(value) : value;
53
- };
54
- var sortFields = (obj) => {
52
+ }, "subSort");
53
+ var sortFields = /* @__PURE__ */ __name((obj) => {
55
54
  const result = {};
56
55
  const keys = Object.keys(obj);
57
56
  for (const key of keys.sort()) {
58
57
  result[key] = subSort(obj[key]);
59
58
  }
60
59
  return result;
61
- };
60
+ }, "sortFields");
62
61
 
63
62
  // src/PayloadHasher.ts
64
- var wasmSupportStatic = new WasmSupport(["bigInt"]);
63
+ var wasmSupportStatic = new WasmSupport([
64
+ "bigInt"
65
+ ]);
65
66
  var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
67
+ static {
68
+ __name(this, "PayloadHasher");
69
+ }
66
70
  static allowSubtle = true;
67
71
  static wasmInitialized = wasmSupportStatic.initialize();
68
72
  static wasmSupport = wasmSupportStatic;
69
73
  static async filterExclude(objs = [], hash) {
70
- const hashes = Array.isArray(hash) ? hash : [hash];
74
+ const hashes = Array.isArray(hash) ? hash : [
75
+ hash
76
+ ];
71
77
  return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
72
78
  }
73
79
  static async filterInclude(objs = [], hash) {
74
- const hashes = Array.isArray(hash) ? hash : [hash];
80
+ const hashes = Array.isArray(hash) ? hash : [
81
+ hash
82
+ ];
75
83
  return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
76
84
  }
77
85
  static async find(objs = [], hash) {
78
86
  return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
79
87
  }
80
88
  /**
81
- * Asynchronously hashes a payload
82
- * @param obj A payload
83
- * @returns The payload hash
84
- */
89
+ * Asynchronously hashes a payload
90
+ * @param obj A payload
91
+ * @returns The payload hash
92
+ */
85
93
  static async hashAsync(obj) {
86
94
  if (_PayloadHasher.allowSubtle) {
87
95
  try {
@@ -89,7 +97,9 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
89
97
  const stringToHash = this.stringifyHashFields(obj);
90
98
  const b = enc.encode(stringToHash);
91
99
  const hashArray = await subtle.digest("SHA-256", b);
92
- return hexFromArrayBuffer(hashArray, { bitLength: 256 });
100
+ return hexFromArrayBuffer(hashArray, {
101
+ bitLength: 256
102
+ });
93
103
  } catch (ex) {
94
104
  const error = ex;
95
105
  console.error(`Setting allowSubtle to false [${error.message}]`);
@@ -112,35 +122,38 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
112
122
  return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
113
123
  }
114
124
  /**
115
- * Creates an array of payload/hash tuples based on the payloads passed in
116
- * @param objs Any array of payloads
117
- * @returns An array of payload/hash tuples
118
- */
125
+ * Creates an array of payload/hash tuples based on the payloads passed in
126
+ * @param objs Any array of payloads
127
+ * @returns An array of payload/hash tuples
128
+ */
119
129
  static async hashPairs(objs) {
120
- return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
130
+ return await Promise.all(objs.map(async (obj) => [
131
+ obj,
132
+ await _PayloadHasher.hashAsync(obj)
133
+ ]));
121
134
  }
122
135
  /**
123
- * Synchronously hashes a payload
124
- * @param obj A payload
125
- * @returns The payload hash
126
- */
136
+ * Synchronously hashes a payload
137
+ * @param obj A payload
138
+ * @returns The payload hash
139
+ */
127
140
  static hashSync(obj) {
128
141
  return asHash(shajs("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
129
142
  }
130
143
  /**
131
- * Creates an array of payload hashes based on the payloads passed in
132
- * @param objs Any array of payloads
133
- * @returns An array of payload hashes
134
- */
144
+ * Creates an array of payload hashes based on the payloads passed in
145
+ * @param objs Any array of payloads
146
+ * @returns An array of payload hashes
147
+ */
135
148
  static async hashes(objs) {
136
149
  return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
137
150
  }
138
151
  /**
139
- * Returns a clone of the payload that is JSON safe
140
- * @param obj A payload
141
- * @param meta Keeps underscore (meta) fields if set to true
142
- * @returns Returns a clone of the payload that is JSON safe
143
- */
152
+ * Returns a clone of the payload that is JSON safe
153
+ * @param obj A payload
154
+ * @param meta Keeps underscore (meta) fields if set to true
155
+ * @returns Returns a clone of the payload that is JSON safe
156
+ */
144
157
  static jsonPayload(payload, meta = false) {
145
158
  return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
146
159
  }
@@ -148,18 +161,17 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
148
161
  return JSON.stringify(this.hashFields(obj));
149
162
  }
150
163
  /**
151
- * Creates an object map of payload hashes to payloads based on the payloads passed in
152
- * @param objs Any array of payloads
153
- * @returns A map of hashes to payloads
154
- */
164
+ * Creates an object map of payload hashes to payloads based on the payloads passed in
165
+ * @param objs Any array of payloads
166
+ * @returns A map of hashes to payloads
167
+ */
155
168
  static async toMap(objs) {
156
- return Object.fromEntries(
157
- await Promise.all(
158
- objs.map(async (obj) => {
159
- return [await _PayloadHasher.hashAsync(obj), obj];
160
- })
161
- )
162
- );
169
+ return Object.fromEntries(await Promise.all(objs.map(async (obj) => {
170
+ return [
171
+ await _PayloadHasher.hashAsync(obj),
172
+ obj
173
+ ];
174
+ })));
163
175
  }
164
176
  async hashAsync() {
165
177
  return await _PayloadHasher.hashAsync(this.obj);
@@ -168,10 +180,10 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
168
180
  return _PayloadHasher.hashSync(this.obj);
169
181
  }
170
182
  /**
171
- * Returns a clone of the payload that is JSON safe
172
- * @param meta Keeps underscore (meta) fields if set to true
173
- * @returns Returns a clone of the payload that is JSON safe
174
- */
183
+ * Returns a clone of the payload that is JSON safe
184
+ * @param meta Keeps underscore (meta) fields if set to true
185
+ * @returns Returns a clone of the payload that is JSON safe
186
+ */
175
187
  jsonPayload(meta = false) {
176
188
  return _PayloadHasher.jsonPayload(this.obj, meta);
177
189
  }
@@ -181,7 +193,6 @@ export {
181
193
  deepBy,
182
194
  deepOmitUnderscoreFields,
183
195
  deepPickUnderscoreFields,
184
- isHex,
185
196
  removeEmptyFields,
186
197
  sortFields
187
198
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[\\da-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends EmptyObject>(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 EmptyObject>(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 EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hashAsync<T extends EmptyObject>(obj: T): Promise<Hash> {\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends EmptyObject>(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 /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\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 /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\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 { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends EmptyObject>(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 EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } 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 EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n"],"mappings":"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","names":["obj","isObject"]}
1
+ {"version":3,"sources":["../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n static async filterExclude<T extends EmptyObject>(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 EmptyObject>(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 EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hashAsync<T extends EmptyObject>(obj: T): Promise<Hash> {\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends EmptyObject>(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 /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\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 /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\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 { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\n\nexport const deepBy = <T extends EmptyObject>(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 EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } 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 EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n"],"mappings":"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","names":["asHash","hexFromArrayBuffer","subtle","ObjectWrapper","WasmSupport","sha256","shajs","typeOf","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","isObject","mapValues","merge","omitBy","pickBy","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitUnderscoreFields","_","key","startsWith","deepPickUnderscoreFields","isObject","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","wasmInitialized","initialize","wasmSupport","filterExclude","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterInclude","find","hashAsync","obj","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitUnderscoreFields","Promise","all","shajs","update","toString","jsonPayload","payload","meta","JSON","stringify","toMap","Object","fromEntries"]}