@sd-jwt/utils 0.1.2-alpha.7 → 0.1.2-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.ts CHANGED
@@ -2,5 +2,6 @@ export * from './base64url';
2
2
  export * from './assert';
3
3
  export * from './getValueByKeyAnyLevel';
4
4
  export * from './isPromise';
5
- export * from './swapClaims';
6
5
  export * from './hasherAlgorithm';
6
+ export * from './object';
7
+ export * from './simpleDeepEqual';
package/build/index.js CHANGED
@@ -18,6 +18,7 @@ __exportStar(require("./base64url"), exports);
18
18
  __exportStar(require("./assert"), exports);
19
19
  __exportStar(require("./getValueByKeyAnyLevel"), exports);
20
20
  __exportStar(require("./isPromise"), exports);
21
- __exportStar(require("./swapClaims"), exports);
22
21
  __exportStar(require("./hasherAlgorithm"), exports);
22
+ __exportStar(require("./object"), exports);
23
+ __exportStar(require("./simpleDeepEqual"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,2CAAwB;AACxB,0DAAuC;AACvC,8CAA2B;AAC3B,+CAA4B;AAC5B,oDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,2CAAwB;AACxB,0DAAuC;AACvC,8CAA2B;AAC3B,oDAAiC;AACjC,2CAAwB;AACxB,oDAAiC"}
@@ -0,0 +1,5 @@
1
+ export declare function isObject(input: any): boolean;
2
+ export declare function getAllKeys(object: unknown, keys?: Array<string>): Array<string>;
3
+ export declare function deleteByPath(object: Record<string, unknown>, path: string[]): void;
4
+ export declare function getByPath(item: any[] | Record<string, unknown>, path: Array<string | number>): unknown;
5
+ export declare function hasByPath(item: any[] | Record<string, unknown>, path: Array<string | number>): boolean;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasByPath = exports.getByPath = exports.deleteByPath = exports.getAllKeys = exports.isObject = void 0;
4
+ function isObject(input) {
5
+ return typeof input === 'object' && input !== null && !Array.isArray(input);
6
+ }
7
+ exports.isObject = isObject;
8
+ function getAllKeys(object, keys = []) {
9
+ if (typeof object !== 'object' || typeof object === null)
10
+ return keys;
11
+ const record = object;
12
+ const objectKeys = Object.keys(record);
13
+ const objectValues = Object.values(record);
14
+ keys.push(...objectKeys);
15
+ for (const objectValue of objectValues) {
16
+ if (typeof objectValue === 'object' &&
17
+ objectValue !== null &&
18
+ !Array.isArray(objectValue)) {
19
+ getAllKeys(objectValue, keys);
20
+ }
21
+ }
22
+ return keys;
23
+ }
24
+ exports.getAllKeys = getAllKeys;
25
+ function deleteByPath(object, path) {
26
+ let currentObject = object;
27
+ const parts = [...path];
28
+ const last = parts.pop();
29
+ for (const part of parts) {
30
+ currentObject = currentObject[part];
31
+ if (!currentObject) {
32
+ return;
33
+ }
34
+ }
35
+ if (last) {
36
+ delete currentObject[last];
37
+ }
38
+ }
39
+ exports.deleteByPath = deleteByPath;
40
+ function getByPath(item, path) {
41
+ let current = item;
42
+ for (const key of path) {
43
+ if (Array.isArray(current)) {
44
+ const keyAsNumber = Number(key);
45
+ if (isNaN(keyAsNumber)) {
46
+ throw new Error(`Unable to get ${path.join('.')} from array ${item}. ${key} is not a number.`);
47
+ }
48
+ if (keyAsNumber >= current.length) {
49
+ throw new Error(`Unable to get ${path.join('.')} from array ${item}. ${key} is out of bounds.`);
50
+ }
51
+ current = current[keyAsNumber];
52
+ }
53
+ else if (typeof current === 'object' && current !== null) {
54
+ if (!(key in current)) {
55
+ throw new Error(`Unable to get ${path.join('.')} from ${item}. ${key} does not exists in ${current}.`);
56
+ }
57
+ current = current[key];
58
+ }
59
+ else {
60
+ throw new Error(`Unable to get ${path.join('.')} from ${item}. ${key} is not an object or array.`);
61
+ }
62
+ }
63
+ return current;
64
+ }
65
+ exports.getByPath = getByPath;
66
+ function hasByPath(item, path) {
67
+ try {
68
+ getByPath(item, path);
69
+ return true;
70
+ }
71
+ catch (_a) {
72
+ return false;
73
+ }
74
+ }
75
+ exports.hasByPath = hasByPath;
76
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAC,KAAU;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC/E,CAAC;AAFD,4BAEC;AAED,SAAgB,UAAU,CACtB,MAAe,EACf,OAAsB,EAAE;IAExB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IACrE,MAAM,MAAM,GAAG,MAAiC,CAAA;IAEhD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAExB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACrC,IACI,OAAO,WAAW,KAAK,QAAQ;YAC/B,WAAW,KAAK,IAAI;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC7B,CAAC;YACC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAtBD,gCAsBC;AAED,SAAgB,YAAY,CAAC,MAA+B,EAAE,IAAc;IACxE,IAAI,aAAa,GAAwC,MAAM,CAAA;IAC/D,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,aAAa,GAAG,aAAa,CAAC,IAAI,CAEnB,CAAA;QAEf,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAM;QACV,CAAC;IACL,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACP,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;AACL,CAAC;AAhBD,oCAgBC;AAED,SAAgB,SAAS,CACrB,IAAqC,EACrC,IAA4B;IAE5B,IAAI,OAAO,GAAQ,IAAI,CAAA;IACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACX,iBAAiB,IAAI,CAAC,IAAI,CACtB,GAAG,CACN,eAAe,IAAI,KAAK,GAAG,mBAAmB,CAClD,CAAA;YACL,CAAC;YACD,IAAI,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACX,iBAAiB,IAAI,CAAC,IAAI,CACtB,GAAG,CACN,eAAe,IAAI,KAAK,GAAG,oBAAoB,CACnD,CAAA;YACL,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACX,iBAAiB,IAAI,CAAC,IAAI,CACtB,GAAG,CACN,SAAS,IAAI,KAAK,GAAG,uBAAuB,OAAO,GAAG,CAC1D,CAAA;YACL,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CACX,iBAAiB,IAAI,CAAC,IAAI,CACtB,GAAG,CACN,SAAS,IAAI,KAAK,GAAG,6BAA6B,CACtD,CAAA;QACL,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAA;AAClB,CAAC;AAzCD,8BAyCC;AAED,SAAgB,SAAS,CACrB,IAAqC,EACrC,IAA4B;IAE5B,IAAI,CAAC;QACD,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrB,OAAO,IAAI,CAAA;IACf,CAAC;IAAC,WAAM,CAAC;QACL,OAAO,KAAK,CAAA;IAChB,CAAC;AACL,CAAC;AAVD,8BAUC"}
@@ -1 +1 @@
1
- export declare const simpleDeepEqual: (lhs: unknown, rhs: unknown) => boolean;
1
+ export declare function simpleDeepEqual(lhs: unknown, rhs: unknown): boolean;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.simpleDeepEqual = void 0;
4
- const simpleDeepEqual = (lhs, rhs) => {
4
+ function simpleDeepEqual(lhs, rhs) {
5
5
  if (lhs === rhs)
6
6
  return true;
7
7
  if (typeof lhs !== 'object' || typeof rhs !== 'object')
@@ -14,7 +14,7 @@ const simpleDeepEqual = (lhs, rhs) => {
14
14
  const keys2 = Object.keys(r);
15
15
  if (keys1.length !== keys2.length)
16
16
  return false;
17
- return keys1.every((key) => (0, exports.simpleDeepEqual)(l[key], r[key]));
18
- };
17
+ return keys1.every((key) => simpleDeepEqual(l[key], r[key]));
18
+ }
19
19
  exports.simpleDeepEqual = simpleDeepEqual;
20
20
  //# sourceMappingURL=simpleDeepEqual.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simpleDeepEqual.js","sourceRoot":"","sources":["../src/simpleDeepEqual.ts"],"names":[],"mappings":";;;AAAO,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAY,EAAW,EAAE;IACnE,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAE5B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAEpE,MAAM,CAAC,GAAG,kBAAK,GAAG,CAA6B,CAAA;IAC/C,MAAM,CAAC,GAAG,kBAAK,GAAG,CAA6B,CAAA;IAE/C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACtE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAE/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC,CAAA;AAjBY,QAAA,eAAe,mBAiB3B"}
1
+ {"version":3,"file":"simpleDeepEqual.js","sourceRoot":"","sources":["../src/simpleDeepEqual.ts"],"names":[],"mappings":";;;AAAA,SAAgB,eAAe,CAAC,GAAY,EAAE,GAAY;IACtD,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAE5B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAEpE,MAAM,CAAC,GAAG,kBAAK,GAAG,CAA6B,CAAA;IAC/C,MAAM,CAAC,GAAG,kBAAK,GAAG,CAA6B,CAAA;IAE/C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACtE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAE/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC;AAjBD,0CAiBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sd-jwt/utils",
3
- "version": "0.1.2-alpha.7",
3
+ "version": "0.1.2-alpha.9",
4
4
  "description": "Utility functions for sd-jwt Draft 06 and sd-jwt-vc Draft 01",
5
5
  "license": "(MIT OR Apache-2.0)",
6
6
  "author": "Berend Sliedrecht <sliedrecht@berend.io>",
@@ -33,10 +33,11 @@
33
33
  "build"
34
34
  ],
35
35
  "scripts": {
36
- "build": "tsc"
36
+ "build": "tsc",
37
+ "test": "node --require ts-node/register --test ./tests/*.test.ts"
37
38
  },
38
39
  "dependencies": {
39
- "@sd-jwt/types": "0.1.2-alpha.7",
40
+ "@sd-jwt/types": "0.1.2-alpha.9",
40
41
  "buffer": "*"
41
42
  },
42
43
  "devDependencies": {
@@ -44,5 +45,5 @@
44
45
  "ts-node": "*",
45
46
  "typescript": "*"
46
47
  },
47
- "gitHead": "c970f98dd86e25732fe49034a3f6c9d4e9dbab49"
48
+ "gitHead": "80d6d4115037cc264a5384202268cc7969df1872"
48
49
  }
@@ -1,2 +0,0 @@
1
- import { DisclosureWithDigest } from '@sd-jwt/types';
2
- export declare const swapClaims: (payload: Record<string, unknown>, disclosures: Array<DisclosureWithDigest>, newPayload?: Record<string, unknown>) => Record<string, unknown>;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.swapClaims = void 0;
4
- const shouldInsertDisclosure = (key, value, disclosures) => {
5
- if (key !== '_sd')
6
- return [];
7
- if (!Array.isArray(value))
8
- return [];
9
- const filteredDisclosures = [];
10
- for (const d of disclosures) {
11
- if (value.includes(d.digest)) {
12
- filteredDisclosures.push(d);
13
- }
14
- }
15
- return filteredDisclosures;
16
- };
17
- const shouldIncludeCleartextClaim = (key, value) => key !== '_sd' && key !== '_sd_alg' && typeof value !== 'object';
18
- const swapClaims = (payload, disclosures, newPayload = {}) => {
19
- const entries = Object.entries(payload);
20
- // Loop over de payload
21
- for (let i = 0; i < entries.length; i++) {
22
- const [key, value] = entries[i];
23
- // See whether we have an `_sd` key with an array of disclosures.
24
- const foundDisclosures = shouldInsertDisclosure(key, value, disclosures);
25
- // Add the disclosed items to the pretty payload
26
- foundDisclosures.forEach((d) => {
27
- newPayload[d.key] = d.value;
28
- });
29
- // Skip the rest as `_sd` is a special case
30
- if (key === '_sd') {
31
- continue;
32
- }
33
- // Include all the primitive claims into the new payload
34
- if (shouldIncludeCleartextClaim(key, value)) {
35
- newPayload[key] = value;
36
- continue;
37
- }
38
- if (typeof value === 'object' && Array.isArray(value)) {
39
- newPayload[key] = swapClaimsInsideArray(value, disclosures);
40
- continue;
41
- }
42
- if (typeof value === 'object' &&
43
- value !== null &&
44
- !Array.isArray(value)) {
45
- newPayload[key] = (0, exports.swapClaims)(value, disclosures);
46
- }
47
- }
48
- return newPayload;
49
- };
50
- exports.swapClaims = swapClaims;
51
- const swapClaimsInsideArray = (array, disclosures) => {
52
- const processedArray = [];
53
- for (const el of array) {
54
- if (typeof el === 'object' && el !== null && '...' in el) {
55
- const hash = el['...'];
56
- let disclosureFound = false;
57
- let disclosureValue;
58
- disclosureLoop: for (const d of disclosures) {
59
- if (d.digest === hash && d.key === undefined) {
60
- disclosureValue = d.value;
61
- disclosureFound = true;
62
- break disclosureLoop;
63
- }
64
- }
65
- processedArray.push(disclosureFound ? disclosureValue : el);
66
- }
67
- else {
68
- processedArray.push(el);
69
- }
70
- }
71
- return processedArray;
72
- };
73
- //# sourceMappingURL=swapClaims.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swapClaims.js","sourceRoot":"","sources":["../src/swapClaims.ts"],"names":[],"mappings":"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"}