@twin.org/core 0.0.3-next.37 → 0.0.3-next.39

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.
@@ -137,7 +137,7 @@ export class Base64 {
137
137
  (Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] << 4) |
138
138
  (Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 2)] >> 2);
139
139
  arr[curByte++] = (tmp >> 8) & 0xff;
140
- arr[curByte++] = tmp & 0xff;
140
+ arr[curByte] = tmp & 0xff;
141
141
  }
142
142
  return arr;
143
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../src/encoding/base64.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\n/* eslint-disable no-mixed-operators */\n\nimport { nameof } from \"@twin.org/nameof\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport { Guards } from \"../utils/guards.js\";\n\n/**\n * Class to help with base64 Encoding/Decoding.\n * Sourced from https://github.com/beatgammit/base64-js.\n */\nexport class Base64 {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<Base64>();\n\n\t/**\n\t * Alphabet table for encoding.\n\t * @internal\n\t */\n\tprivate static readonly _LOOKUP: string =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n\t/**\n\t * Alphabet table for decoding.\n\t * @internal\n\t */\n\tprivate static readonly _REVERSE_LOOKUP: { [id: number]: number } = {\n\t\t\"43\": 62,\n\t\t\"45\": 62,\n\t\t\"47\": 63,\n\t\t\"48\": 52,\n\t\t\"49\": 53,\n\t\t\"50\": 54,\n\t\t\"51\": 55,\n\t\t\"52\": 56,\n\t\t\"53\": 57,\n\t\t\"54\": 58,\n\t\t\"55\": 59,\n\t\t\"56\": 60,\n\t\t\"57\": 61,\n\t\t\"65\": 0,\n\t\t\"66\": 1,\n\t\t\"67\": 2,\n\t\t\"68\": 3,\n\t\t\"69\": 4,\n\t\t\"70\": 5,\n\t\t\"71\": 6,\n\t\t\"72\": 7,\n\t\t\"73\": 8,\n\t\t\"74\": 9,\n\t\t\"75\": 10,\n\t\t\"76\": 11,\n\t\t\"77\": 12,\n\t\t\"78\": 13,\n\t\t\"79\": 14,\n\t\t\"80\": 15,\n\t\t\"81\": 16,\n\t\t\"82\": 17,\n\t\t\"83\": 18,\n\t\t\"84\": 19,\n\t\t\"85\": 20,\n\t\t\"86\": 21,\n\t\t\"87\": 22,\n\t\t\"88\": 23,\n\t\t\"89\": 24,\n\t\t\"90\": 25,\n\t\t\"95\": 63,\n\t\t\"97\": 26,\n\t\t\"98\": 27,\n\t\t\"99\": 28,\n\t\t\"100\": 29,\n\t\t\"101\": 30,\n\t\t\"102\": 31,\n\t\t\"103\": 32,\n\t\t\"104\": 33,\n\t\t\"105\": 34,\n\t\t\"106\": 35,\n\t\t\"107\": 36,\n\t\t\"108\": 37,\n\t\t\"109\": 38,\n\t\t\"110\": 39,\n\t\t\"111\": 40,\n\t\t\"112\": 41,\n\t\t\"113\": 42,\n\t\t\"114\": 43,\n\t\t\"115\": 44,\n\t\t\"116\": 45,\n\t\t\"117\": 46,\n\t\t\"118\": 47,\n\t\t\"119\": 48,\n\t\t\"120\": 49,\n\t\t\"121\": 50,\n\t\t\"122\": 51\n\t};\n\n\t/**\n\t * Get the byte length of the data.\n\t * @param base64 The base64 string.\n\t * @returns The byte length of the data.\n\t */\n\tpublic static byteLength(base64: string): number {\n\t\tconst lens = Base64.getLengths(base64);\n\t\treturn Base64.calcByteLength(lens[0], lens[1]);\n\t}\n\n\t/**\n\t * Convert the base 64 string to a byte array.\n\t * @param base64 The base64 string to convert.\n\t * @returns The byte array.\n\t */\n\tpublic static decode(base64: string): Uint8Array {\n\t\tGuards.string(Base64.CLASS_NAME, nameof(base64), base64);\n\n\t\tlet tmp;\n\t\tconst lens = Base64.getLengths(base64);\n\t\tconst validLen = lens[0];\n\t\tconst placeHoldersLen = lens[1];\n\n\t\tconst arr = new Uint8Array(Base64.calcByteLength(validLen, placeHoldersLen));\n\n\t\tlet curByte = 0;\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tconst len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n\n\t\tlet i;\n\t\tfor (i = 0; i < len; i += 4) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 18) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] << 12) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 2)] << 6) |\n\t\t\t\tBase64._REVERSE_LOOKUP[base64.charCodeAt(i + 3)];\n\t\t\tarr[curByte++] = (tmp >> 16) & 0xff;\n\t\t\tarr[curByte++] = (tmp >> 8) & 0xff;\n\t\t\tarr[curByte++] = tmp & 0xff;\n\t\t}\n\n\t\tif (placeHoldersLen === 2) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 2) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] >> 4);\n\t\t\tarr[curByte++] = tmp & 0xff;\n\t\t}\n\n\t\tif (placeHoldersLen === 1) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 10) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] << 4) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 2)] >> 2);\n\t\t\tarr[curByte++] = (tmp >> 8) & 0xff;\n\t\t\tarr[curByte++] = tmp & 0xff;\n\t\t}\n\n\t\treturn arr;\n\t}\n\n\t/**\n\t * Convert a byte array to base 64.\n\t * @param bytes The byte array to convert.\n\t * @returns The data as base64 string.\n\t */\n\tpublic static encode(bytes: Uint8Array): string {\n\t\tGuards.uint8Array(Base64.CLASS_NAME, nameof(bytes), bytes);\n\n\t\tlet tmp;\n\t\tconst len = bytes.length;\n\t\tconst extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\n\t\tconst parts = [];\n\t\tconst maxChunkLength = 16383; // must be multiple of 3\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (let i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n\t\t\tparts.push(Base64.encodeChunk(bytes, i, Math.min(i + maxChunkLength, len2)));\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tif (extraBytes === 1) {\n\t\t\ttmp = bytes[len - 1];\n\t\t\tparts.push(`${Base64._LOOKUP[tmp >> 2] + Base64._LOOKUP[(tmp << 4) & 0x3f]}==`);\n\t\t} else if (extraBytes === 2) {\n\t\t\ttmp = (bytes[len - 2] << 8) + bytes[len - 1];\n\t\t\tparts.push(\n\t\t\t\t`${Base64._LOOKUP[tmp >> 10] + Base64._LOOKUP[(tmp >> 4) & 0x3f] + Base64._LOOKUP[(tmp << 2) & 0x3f]}=`\n\t\t\t);\n\t\t}\n\n\t\treturn parts.join(\"\");\n\t}\n\n\t/**\n\t * Calculate the byte length.\n\t * @param validLen The valid length.\n\t * @param placeHoldersLen The placeholder length.\n\t * @returns The length.\n\t * @internal\n\t */\n\tprivate static calcByteLength(validLen: number, placeHoldersLen: number): number {\n\t\treturn ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen;\n\t}\n\n\t/**\n\t * Get the valid and placeholder lengths from a bas64 string.\n\t * @param base64 The base64 string.\n\t * @returns The lengths.\n\t * @internal\n\t */\n\tprivate static getLengths(base64: string): number[] {\n\t\tconst len = base64.length;\n\n\t\tif (len % 4 > 0) {\n\t\t\tthrow new GeneralError(Base64.CLASS_NAME, \"length4Multiple\", { value: len });\n\t\t}\n\n\t\t// Trim off extra bytes after placeholder bytes are found\n\t\t// See: https://github.com/beatgammit/base64-js/issues/42\n\t\tlet validLen = base64.indexOf(\"=\");\n\t\tif (validLen === -1) {\n\t\t\tvalidLen = len;\n\t\t}\n\n\t\tconst placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4);\n\n\t\treturn [validLen, placeHoldersLen];\n\t}\n\n\t/**\n\t * Convert the triplet to base 64.\n\t * @param num The number to convert.\n\t * @returns The base64 encoding.\n\t * @internal\n\t */\n\tprivate static tripletToBase64(num: number): string {\n\t\treturn (\n\t\t\tBase64._LOOKUP[(num >> 18) & 0x3f] +\n\t\t\tBase64._LOOKUP[(num >> 12) & 0x3f] +\n\t\t\tBase64._LOOKUP[(num >> 6) & 0x3f] +\n\t\t\tBase64._LOOKUP[num & 0x3f]\n\t\t);\n\t}\n\n\t/**\n\t * Encode a chunk.\n\t * @param bytes The byte array.\n\t * @param start The start index in the buffer.\n\t * @param end The end index in the buffer.\n\t * @returns The encoded chunk.\n\t * @internal\n\t */\n\tprivate static encodeChunk(bytes: Uint8Array, start: number, end: number): string {\n\t\tlet tmp;\n\t\tconst output = [];\n\t\tfor (let i = start; i < end; i += 3) {\n\t\t\ttmp = ((bytes[i] << 16) & 0xff0000) + ((bytes[i + 1] << 8) & 0xff00) + (bytes[i + 2] & 0xff);\n\t\t\toutput.push(Base64.tripletToBase64(tmp));\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../src/encoding/base64.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,+BAA+B;AAC/B,uCAAuC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;GAGG;AACH,MAAM,OAAO,MAAM;IAClB;;OAEG;IACI,MAAM,CAAU,UAAU,YAA4B;IAE7D;;;OAGG;IACK,MAAM,CAAU,OAAO,GAC9B,kEAAkE,CAAC;IAEpE;;;OAGG;IACK,MAAM,CAAU,eAAe,GAA6B;QACnE,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;KACT,CAAC;IAEF;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,MAAc;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,MAAc;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,YAAkB,MAAM,CAAC,CAAC;QAEzD,IAAI,GAAG,CAAC;QACR,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QAE7E,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,sEAAsE;QACtE,MAAM,GAAG,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE1D,IAAI,CAAC,CAAC;QACN,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,GAAG;gBACF,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpD,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACxD,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACvD,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YACpC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACnC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG;gBACF,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnD,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG;gBACF,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACpD,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACvD,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACnC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,OAAO,GAAG,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,KAAiB;QACrC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,WAAiB,KAAK,CAAC,CAAC;QAE3D,IAAI,GAAG,CAAC;QACR,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,sCAAsC;QAClE,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,wBAAwB;QAEtD,+EAA+E;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,sEAAsE;QACtE,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;aAAM,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YAC7B,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CACT,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACvG,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,eAAuB;QACtE,OAAO,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,UAAU,CAAC,MAAc;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAE1B,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,yDAAyD;QACzD,yDAAyD;QACzD,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,QAAQ,GAAG,GAAG,CAAC;QAChB,CAAC;QAED,MAAM,eAAe,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAElE,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,eAAe,CAAC,GAAW;QACzC,OAAO,CACN,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAC1B,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,WAAW,CAAC,KAAiB,EAAE,KAAa,EAAE,GAAW;QACvE,IAAI,GAAG,CAAC;QACR,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-bitwise */\n/* eslint-disable no-mixed-operators */\n\nimport { nameof } from \"@twin.org/nameof\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport { Guards } from \"../utils/guards.js\";\n\n/**\n * Class to help with base64 Encoding/Decoding.\n * Sourced from https://github.com/beatgammit/base64-js.\n */\nexport class Base64 {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<Base64>();\n\n\t/**\n\t * Alphabet table for encoding.\n\t * @internal\n\t */\n\tprivate static readonly _LOOKUP: string =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n\t/**\n\t * Alphabet table for decoding.\n\t * @internal\n\t */\n\tprivate static readonly _REVERSE_LOOKUP: { [id: number]: number } = {\n\t\t\"43\": 62,\n\t\t\"45\": 62,\n\t\t\"47\": 63,\n\t\t\"48\": 52,\n\t\t\"49\": 53,\n\t\t\"50\": 54,\n\t\t\"51\": 55,\n\t\t\"52\": 56,\n\t\t\"53\": 57,\n\t\t\"54\": 58,\n\t\t\"55\": 59,\n\t\t\"56\": 60,\n\t\t\"57\": 61,\n\t\t\"65\": 0,\n\t\t\"66\": 1,\n\t\t\"67\": 2,\n\t\t\"68\": 3,\n\t\t\"69\": 4,\n\t\t\"70\": 5,\n\t\t\"71\": 6,\n\t\t\"72\": 7,\n\t\t\"73\": 8,\n\t\t\"74\": 9,\n\t\t\"75\": 10,\n\t\t\"76\": 11,\n\t\t\"77\": 12,\n\t\t\"78\": 13,\n\t\t\"79\": 14,\n\t\t\"80\": 15,\n\t\t\"81\": 16,\n\t\t\"82\": 17,\n\t\t\"83\": 18,\n\t\t\"84\": 19,\n\t\t\"85\": 20,\n\t\t\"86\": 21,\n\t\t\"87\": 22,\n\t\t\"88\": 23,\n\t\t\"89\": 24,\n\t\t\"90\": 25,\n\t\t\"95\": 63,\n\t\t\"97\": 26,\n\t\t\"98\": 27,\n\t\t\"99\": 28,\n\t\t\"100\": 29,\n\t\t\"101\": 30,\n\t\t\"102\": 31,\n\t\t\"103\": 32,\n\t\t\"104\": 33,\n\t\t\"105\": 34,\n\t\t\"106\": 35,\n\t\t\"107\": 36,\n\t\t\"108\": 37,\n\t\t\"109\": 38,\n\t\t\"110\": 39,\n\t\t\"111\": 40,\n\t\t\"112\": 41,\n\t\t\"113\": 42,\n\t\t\"114\": 43,\n\t\t\"115\": 44,\n\t\t\"116\": 45,\n\t\t\"117\": 46,\n\t\t\"118\": 47,\n\t\t\"119\": 48,\n\t\t\"120\": 49,\n\t\t\"121\": 50,\n\t\t\"122\": 51\n\t};\n\n\t/**\n\t * Get the byte length of the data.\n\t * @param base64 The base64 string.\n\t * @returns The byte length of the data.\n\t */\n\tpublic static byteLength(base64: string): number {\n\t\tconst lens = Base64.getLengths(base64);\n\t\treturn Base64.calcByteLength(lens[0], lens[1]);\n\t}\n\n\t/**\n\t * Convert the base 64 string to a byte array.\n\t * @param base64 The base64 string to convert.\n\t * @returns The byte array.\n\t */\n\tpublic static decode(base64: string): Uint8Array {\n\t\tGuards.string(Base64.CLASS_NAME, nameof(base64), base64);\n\n\t\tlet tmp;\n\t\tconst lens = Base64.getLengths(base64);\n\t\tconst validLen = lens[0];\n\t\tconst placeHoldersLen = lens[1];\n\n\t\tconst arr = new Uint8Array(Base64.calcByteLength(validLen, placeHoldersLen));\n\n\t\tlet curByte = 0;\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tconst len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n\n\t\tlet i;\n\t\tfor (i = 0; i < len; i += 4) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 18) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] << 12) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 2)] << 6) |\n\t\t\t\tBase64._REVERSE_LOOKUP[base64.charCodeAt(i + 3)];\n\t\t\tarr[curByte++] = (tmp >> 16) & 0xff;\n\t\t\tarr[curByte++] = (tmp >> 8) & 0xff;\n\t\t\tarr[curByte++] = tmp & 0xff;\n\t\t}\n\n\t\tif (placeHoldersLen === 2) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 2) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] >> 4);\n\t\t\tarr[curByte++] = tmp & 0xff;\n\t\t}\n\n\t\tif (placeHoldersLen === 1) {\n\t\t\ttmp =\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i)] << 10) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 1)] << 4) |\n\t\t\t\t(Base64._REVERSE_LOOKUP[base64.charCodeAt(i + 2)] >> 2);\n\t\t\tarr[curByte++] = (tmp >> 8) & 0xff;\n\t\t\tarr[curByte] = tmp & 0xff;\n\t\t}\n\n\t\treturn arr;\n\t}\n\n\t/**\n\t * Convert a byte array to base 64.\n\t * @param bytes The byte array to convert.\n\t * @returns The data as base64 string.\n\t */\n\tpublic static encode(bytes: Uint8Array): string {\n\t\tGuards.uint8Array(Base64.CLASS_NAME, nameof(bytes), bytes);\n\n\t\tlet tmp;\n\t\tconst len = bytes.length;\n\t\tconst extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\n\t\tconst parts = [];\n\t\tconst maxChunkLength = 16383; // must be multiple of 3\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (let i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n\t\t\tparts.push(Base64.encodeChunk(bytes, i, Math.min(i + maxChunkLength, len2)));\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tif (extraBytes === 1) {\n\t\t\ttmp = bytes[len - 1];\n\t\t\tparts.push(`${Base64._LOOKUP[tmp >> 2] + Base64._LOOKUP[(tmp << 4) & 0x3f]}==`);\n\t\t} else if (extraBytes === 2) {\n\t\t\ttmp = (bytes[len - 2] << 8) + bytes[len - 1];\n\t\t\tparts.push(\n\t\t\t\t`${Base64._LOOKUP[tmp >> 10] + Base64._LOOKUP[(tmp >> 4) & 0x3f] + Base64._LOOKUP[(tmp << 2) & 0x3f]}=`\n\t\t\t);\n\t\t}\n\n\t\treturn parts.join(\"\");\n\t}\n\n\t/**\n\t * Calculate the byte length.\n\t * @param validLen The valid length.\n\t * @param placeHoldersLen The placeholder length.\n\t * @returns The length.\n\t * @internal\n\t */\n\tprivate static calcByteLength(validLen: number, placeHoldersLen: number): number {\n\t\treturn ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen;\n\t}\n\n\t/**\n\t * Get the valid and placeholder lengths from a bas64 string.\n\t * @param base64 The base64 string.\n\t * @returns The lengths.\n\t * @internal\n\t */\n\tprivate static getLengths(base64: string): number[] {\n\t\tconst len = base64.length;\n\n\t\tif (len % 4 > 0) {\n\t\t\tthrow new GeneralError(Base64.CLASS_NAME, \"length4Multiple\", { value: len });\n\t\t}\n\n\t\t// Trim off extra bytes after placeholder bytes are found\n\t\t// See: https://github.com/beatgammit/base64-js/issues/42\n\t\tlet validLen = base64.indexOf(\"=\");\n\t\tif (validLen === -1) {\n\t\t\tvalidLen = len;\n\t\t}\n\n\t\tconst placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4);\n\n\t\treturn [validLen, placeHoldersLen];\n\t}\n\n\t/**\n\t * Convert the triplet to base 64.\n\t * @param num The number to convert.\n\t * @returns The base64 encoding.\n\t * @internal\n\t */\n\tprivate static tripletToBase64(num: number): string {\n\t\treturn (\n\t\t\tBase64._LOOKUP[(num >> 18) & 0x3f] +\n\t\t\tBase64._LOOKUP[(num >> 12) & 0x3f] +\n\t\t\tBase64._LOOKUP[(num >> 6) & 0x3f] +\n\t\t\tBase64._LOOKUP[num & 0x3f]\n\t\t);\n\t}\n\n\t/**\n\t * Encode a chunk.\n\t * @param bytes The byte array.\n\t * @param start The start index in the buffer.\n\t * @param end The end index in the buffer.\n\t * @returns The encoded chunk.\n\t * @internal\n\t */\n\tprivate static encodeChunk(bytes: Uint8Array, start: number, end: number): string {\n\t\tlet tmp;\n\t\tconst output = [];\n\t\tfor (let i = start; i < end; i += 3) {\n\t\t\ttmp = ((bytes[i] << 16) & 0xff0000) + ((bytes[i + 1] << 8) & 0xff00) + (bytes[i + 2] & 0xff);\n\t\t\toutput.push(Base64.tripletToBase64(tmp));\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n}\n"]}
@@ -1,3 +1,5 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
1
3
  import { Is } from "../utils/is.js";
2
4
  /**
3
5
  * Class to help with arrays.
@@ -1 +1 @@
1
- {"version":3,"file":"arrayHelper.js","sourceRoot":"","sources":["../../../src/helpers/arrayHelper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC;;GAEG;AACH,MAAM,OAAO,WAAW;IACvB;;;;;OAKG;IACI,MAAM,CAAC,OAAO,CAAC,IAAa,EAAE,IAAa;QACjD,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACd,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAeD;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAC9B,KAAmC;QAEnC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,CAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ObjectOrArray } from \"../types/objectOrArray.js\";\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with arrays.\n */\nexport class ArrayHelper {\n\t/**\n\t * Do the two arrays match.\n\t * @param arr1 The first array.\n\t * @param arr2 The second array.\n\t * @returns True if both arrays are empty of have the same values.\n\t */\n\tpublic static matches(arr1: unknown, arr2: unknown): boolean {\n\t\tif (Is.empty(arr1) && Is.empty(arr2)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!((Is.array(arr1) && Is.array(arr2)) || (Is.typedArray(arr1) && Is.typedArray(arr2)))) {\n\t\t\treturn false;\n\t\t}\n\t\tif (arr1.length !== arr2.length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (let i = 0; i < arr1.length; i++) {\n\t\t\tif (arr1[i] !== arr2[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert an object or array to an array.\n\t * @param value The object or array to convert.\n\t * @returns The array.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tpublic static fromObjectOrArray<T = unknown>(value: undefined): undefined;\n\t/**\n\t * Convert an object or array to an array.\n\t * @param value The object or array to convert.\n\t * @returns The array.\n\t */\n\tpublic static fromObjectOrArray<T = unknown>(value: ObjectOrArray<T>): T[];\n\t/**\n\t * Convert an object or array to an array.\n\t * @param value The object or array to convert.\n\t * @returns The array.\n\t */\n\tpublic static fromObjectOrArray<T = unknown>(\n\t\tvalue: ObjectOrArray<T> | undefined\n\t): T[] | undefined {\n\t\tif (Is.empty(value)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (Is.array<T>(value)) {\n\t\t\treturn value;\n\t\t}\n\t\treturn [value];\n\t}\n}\n"]}
1
+ {"version":3,"file":"arrayHelper.js","sourceRoot":"","sources":["../../../src/helpers/arrayHelper.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC;;GAEG;AACH,MAAM,OAAO,WAAW;IACvB;;;;;OAKG;IACI,MAAM,CAAC,OAAO,CAAC,IAAa,EAAE,IAAa;QACjD,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACd,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAC9B,KAA0B;QAE1B,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,SAAkD,CAAC;QAC3D,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,CAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAA8C,CAAC;QACvD,CAAC;QACD,OAAO,CAAC,KAAK,CAA0C,CAAC;IACzD,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with arrays.\n */\nexport class ArrayHelper {\n\t/**\n\t * Do the two arrays match.\n\t * @param arr1 The first array.\n\t * @param arr2 The second array.\n\t * @returns True if both arrays are empty of have the same values.\n\t */\n\tpublic static matches(arr1: unknown, arr2: unknown): boolean {\n\t\tif (Is.empty(arr1) && Is.empty(arr2)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!((Is.array(arr1) && Is.array(arr2)) || (Is.typedArray(arr1) && Is.typedArray(arr2)))) {\n\t\t\treturn false;\n\t\t}\n\t\tif (arr1.length !== arr2.length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (let i = 0; i < arr1.length; i++) {\n\t\t\tif (arr1[i] !== arr2[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert an object or array to an array.\n\t * @param value The object or array to convert.\n\t * @returns The array.\n\t */\n\tpublic static fromObjectOrArray<T = unknown>(\n\t\tvalue: T | T[] | undefined\n\t): T extends undefined ? undefined : T[] {\n\t\tif (Is.empty(value)) {\n\t\t\treturn undefined as T extends undefined ? undefined : T[];\n\t\t}\n\t\tif (Is.array<T>(value)) {\n\t\t\treturn value as T extends undefined ? undefined : T[];\n\t\t}\n\t\treturn [value] as T extends undefined ? undefined : T[];\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"jsonHelper.js","sourceRoot":"","sources":["../../../src/helpers/jsonHelper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC;;GAEG;AACH,MAAM,OAAO,UAAU;IACtB;;OAEG;IACI,MAAM,CAAU,UAAU,gBAAgC;IAEjE;;;;;OAKG;IACI,MAAM,CAAC,YAAY,CAAC,MAAe;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IACC,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EACjD,CAAC;YACF,sBAAsB;YACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,+BAA+B;YAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACP,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9C,CAAC;YACF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACP,yBAAyB;YACzB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,MAAmC,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzE,CAAC;YACF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,IAAI,CAAc,OAAU,EAAE,OAAU;QACrD,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,UAA+B,CAAC;IACxC,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAc,MAAS,EAAE,OAA0B;QACrE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,OAAsB,CAAC,CAAC;QAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,8DAA8D;IACvD,MAAM,CAAC,WAAW,CAAC,MAAW,EAAE,KAAuB;QAC7D,qDAAqD;QACrD,6DAA6D;QAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,8DAA8D;IACvD,MAAM,CAAC,OAAO,CAAC,IAAY;QACjC,oDAAoD;QACpD,6DAA6D;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,8DAA8D;IACvD,MAAM,CAAC,mBAAmB,CAAY,GAAW,EAAE,KAAc;QACvE,oDAAoD;QACpD,gDAAgD;QAChD,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3B,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE;aAC1B,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE;aACzB,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO;gBACN,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;aACxC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,8DAA8D;IACvD,MAAM,CAAC,cAAc,CAAY,GAAW,EAAE,KAAc;QAClE,IAAI,EAAE,CAAC,MAAM,CAAoC,KAAK,CAAC,EAAE,CAAC;YACzD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;gBACrC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,YAAY,EAAE,CAAC;gBAC3C,OAAO,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { nameof } from \"@twin.org/nameof\";\nimport { applyPatch, createPatch, type Operation } from \"rfc6902\";\nimport { ObjectHelper } from \"./objectHelper.js\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport type { IPatchOperation } from \"../models/IPatchOperation.js\";\nimport { Converter } from \"../utils/converter.js\";\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Helpers methods for JSON objects.\n */\nexport class JsonHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<JsonHelper>();\n\n\t/**\n\t * Serializes in canonical format.\n\t * Based on https://www.rfc-editor.org/rfc/rfc8785.\n\t * @param object The object to be serialized.\n\t * @returns The serialized object.\n\t */\n\tpublic static canonicalize(object: unknown): string {\n\t\tconst buffer: string[] = [];\n\n\t\tif (\n\t\t\tobject === null ||\n\t\t\ttypeof object !== \"object\" ||\n\t\t\t(\"toJSON\" in object && Is.function(object.toJSON))\n\t\t) {\n\t\t\t// Primitive data type\n\t\t\tbuffer.push(JSON.stringify(object));\n\t\t} else if (Array.isArray(object)) {\n\t\t\t// Array maintain element order\n\t\t\tconst parts: string[] = [];\n\t\t\tfor (const element of object) {\n\t\t\t\tif (element === undefined) {\n\t\t\t\t\tparts.push(\"null\");\n\t\t\t\t} else {\n\t\t\t\t\tparts.push(JsonHelper.canonicalize(element));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer.push(`[${parts.join(\",\")}]`);\n\t\t} else {\n\t\t\t// Object sort properties\n\t\t\tconst props: string[] = [];\n\t\t\tconst keys = Object.keys(object).sort();\n\t\t\tconst o = object as { [id: string]: unknown };\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (o[key] !== undefined) {\n\t\t\t\t\tprops.push(`${JSON.stringify(key)}:${JsonHelper.canonicalize(o[key])}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer.push(`{${props.join(\",\")}}`);\n\t\t}\n\n\t\treturn buffer.join(\"\");\n\t}\n\n\t/**\n\t * Creates a RFC 6902 diff set.\n\t * Based on https://www.rfc-editor.org/rfc/rfc6902.\n\t * @param object1 The first object.\n\t * @param object2 The second object.\n\t * @returns The list of patches.\n\t */\n\tpublic static diff<T = unknown>(object1: T, object2: T): IPatchOperation[] {\n\t\tconst operations = createPatch(object1, object2);\n\t\treturn operations as IPatchOperation[];\n\t}\n\n\t/**\n\t * Applies a RFC 6902 diff set to an object.\n\t * Based on https://www.rfc-editor.org/rfc/rfc6902.\n\t * @param object The object to patch.\n\t * @param patches The second object.\n\t * @returns The updated object.\n\t * @throws GeneralError if the patch fails.\n\t */\n\tpublic static patch<T = unknown>(object: T, patches: IPatchOperation[]): T {\n\t\tconst clone = ObjectHelper.clone(object);\n\t\tconst result = applyPatch(clone, patches as Operation[]);\n\n\t\tfor (let i = 0; i < result.length; i++) {\n\t\t\tif (!Is.empty(result[i])) {\n\t\t\t\tthrow new GeneralError(JsonHelper.CLASS_NAME, \"failedPatch\", { index: i }, result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn clone;\n\t}\n\n\t/**\n\t * Stringify the JSON with support for extended data types date/bigint/uint8array.\n\t * @param object The object to stringify.\n\t * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n\t * @returns The stringified object.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static stringifyEx(object: any, space?: string | number): string {\n\t\t// We want to keep the 'this' intact for the replacer\n\t\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\t\treturn JSON.stringify(object, JsonHelper.stringifyExReplacer, space);\n\t}\n\n\t/**\n\t * Parse the JSON string with support for extended data types date/bigint/uint8array.\n\t * @param json The object to pause.\n\t * @returns The object.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static parseEx(json: string): any {\n\t\t// We want to keep the 'this' intact for the reviver\n\t\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\t\treturn JSON.parse(json, JsonHelper.parseExReviver);\n\t}\n\n\t/**\n\t * Replacer function to handle extended data types.\n\t * @param this The object.\n\t * @param key The key.\n\t * @param value The value.\n\t * @returns The value.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static stringifyExReplacer(this: any, key: string, value: unknown): unknown {\n\t\t// The this in the replacer is the containing object\n\t\t// so we need to get the actual value from there\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst rawValue = this[key];\n\n\t\tif (Is.bigint(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"bigint\",\n\t\t\t\tvalue: rawValue.toString()\n\t\t\t};\n\t\t} else if (Is.date(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"date\",\n\t\t\t\tvalue: rawValue.getTime()\n\t\t\t};\n\t\t} else if (Is.uint8Array(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"uint8array\",\n\t\t\t\tvalue: Converter.bytesToBase64(rawValue)\n\t\t\t};\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Reviver function to handle extended data types.\n\t * @param this The object.\n\t * @param key The key.\n\t * @param value The value.\n\t * @returns The value.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static parseExReviver(this: any, key: string, value: unknown): unknown {\n\t\tif (Is.object<{ \"@ext\": string; value: string }>(value)) {\n\t\t\tif (value[\"@ext\"] === \"bigint\") {\n\t\t\t\treturn BigInt(value.value);\n\t\t\t} else if (value[\"@ext\"] === \"date\") {\n\t\t\t\treturn new Date(value.value);\n\t\t\t} else if (value[\"@ext\"] === \"uint8array\") {\n\t\t\t\treturn Converter.base64ToBytes(value.value);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"]}
1
+ {"version":3,"file":"jsonHelper.js","sourceRoot":"","sources":["../../../src/helpers/jsonHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { nameof } from \"@twin.org/nameof\";\nimport { applyPatch, createPatch, type Operation } from \"rfc6902\";\nimport { ObjectHelper } from \"./objectHelper.js\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport type { IPatchOperation } from \"../models/IPatchOperation.js\";\nimport { Converter } from \"../utils/converter.js\";\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Helpers methods for JSON objects.\n */\nexport class JsonHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<JsonHelper>();\n\n\t/**\n\t * Serializes in canonical format.\n\t * Based on https://www.rfc-editor.org/rfc/rfc8785.\n\t * @param object The object to be serialized.\n\t * @returns The serialized object.\n\t */\n\tpublic static canonicalize(object: unknown): string {\n\t\tconst buffer: string[] = [];\n\n\t\tif (\n\t\t\tobject === null ||\n\t\t\ttypeof object !== \"object\" ||\n\t\t\t(\"toJSON\" in object && Is.function(object.toJSON))\n\t\t) {\n\t\t\t// Primitive data type\n\t\t\tbuffer.push(JSON.stringify(object));\n\t\t} else if (Array.isArray(object)) {\n\t\t\t// Array maintain element order\n\t\t\tconst parts: string[] = [];\n\t\t\tfor (const element of object) {\n\t\t\t\tif (element === undefined) {\n\t\t\t\t\tparts.push(\"null\");\n\t\t\t\t} else {\n\t\t\t\t\tparts.push(JsonHelper.canonicalize(element));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer.push(`[${parts.join(\",\")}]`);\n\t\t} else {\n\t\t\t// Object sort properties\n\t\t\tconst props: string[] = [];\n\t\t\tconst keys = Object.keys(object).sort();\n\t\t\tconst o = object as { [id: string]: unknown };\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (o[key] !== undefined) {\n\t\t\t\t\tprops.push(`${JSON.stringify(key)}:${JsonHelper.canonicalize(o[key])}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer.push(`{${props.join(\",\")}}`);\n\t\t}\n\n\t\treturn buffer.join(\"\");\n\t}\n\n\t/**\n\t * Creates a RFC 6902 diff set.\n\t * Based on https://www.rfc-editor.org/rfc/rfc6902.\n\t * @param object1 The first object.\n\t * @param object2 The second object.\n\t * @returns The list of patches.\n\t */\n\tpublic static diff<T = unknown>(object1: T, object2: T): IPatchOperation[] {\n\t\tconst operations = createPatch(object1, object2);\n\t\treturn operations;\n\t}\n\n\t/**\n\t * Applies a RFC 6902 diff set to an object.\n\t * Based on https://www.rfc-editor.org/rfc/rfc6902.\n\t * @param object The object to patch.\n\t * @param patches The second object.\n\t * @returns The updated object.\n\t * @throws GeneralError if the patch fails.\n\t */\n\tpublic static patch<T = unknown>(object: T, patches: IPatchOperation[]): T {\n\t\tconst clone = ObjectHelper.clone(object);\n\t\tconst result = applyPatch(clone, patches as Operation[]);\n\n\t\tfor (let i = 0; i < result.length; i++) {\n\t\t\tif (!Is.empty(result[i])) {\n\t\t\t\tthrow new GeneralError(JsonHelper.CLASS_NAME, \"failedPatch\", { index: i }, result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn clone;\n\t}\n\n\t/**\n\t * Stringify the JSON with support for extended data types date/bigint/uint8array.\n\t * @param object The object to stringify.\n\t * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n\t * @returns The stringified object.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static stringifyEx(object: any, space?: string | number): string {\n\t\t// We want to keep the 'this' intact for the replacer\n\t\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\t\treturn JSON.stringify(object, JsonHelper.stringifyExReplacer, space);\n\t}\n\n\t/**\n\t * Parse the JSON string with support for extended data types date/bigint/uint8array.\n\t * @param json The object to pause.\n\t * @returns The object.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static parseEx(json: string): any {\n\t\t// We want to keep the 'this' intact for the reviver\n\t\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\t\treturn JSON.parse(json, JsonHelper.parseExReviver);\n\t}\n\n\t/**\n\t * Replacer function to handle extended data types.\n\t * @param this The object.\n\t * @param key The key.\n\t * @param value The value.\n\t * @returns The value.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static stringifyExReplacer(this: any, key: string, value: unknown): unknown {\n\t\t// The this in the replacer is the containing object\n\t\t// so we need to get the actual value from there\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tconst rawValue = this[key];\n\n\t\tif (Is.bigint(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"bigint\",\n\t\t\t\tvalue: rawValue.toString()\n\t\t\t};\n\t\t} else if (Is.date(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"date\",\n\t\t\t\tvalue: rawValue.getTime()\n\t\t\t};\n\t\t} else if (Is.uint8Array(rawValue)) {\n\t\t\treturn {\n\t\t\t\t\"@ext\": \"uint8array\",\n\t\t\t\tvalue: Converter.bytesToBase64(rawValue)\n\t\t\t};\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Reviver function to handle extended data types.\n\t * @param this The object.\n\t * @param key The key.\n\t * @param value The value.\n\t * @returns The value.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static parseExReviver(this: any, key: string, value: unknown): unknown {\n\t\tif (Is.object<{ \"@ext\": string; value: string }>(value)) {\n\t\t\tif (value[\"@ext\"] === \"bigint\") {\n\t\t\t\treturn BigInt(value.value);\n\t\t\t} else if (value[\"@ext\"] === \"date\") {\n\t\t\t\treturn new Date(value.value);\n\t\t\t} else if (value[\"@ext\"] === \"uint8array\") {\n\t\t\t\treturn Converter.base64ToBytes(value.value);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n}\n"]}
@@ -44,7 +44,7 @@ export class ObjectHelper {
44
44
  /**
45
45
  * Make a deep clone of an object.
46
46
  * @param obj The object to clone.
47
- * @returns The objects clone.
47
+ * @returns The objects clone, or undefined if the input was undefined.
48
48
  */
49
49
  static clone(obj) {
50
50
  if (Is.undefined(obj)) {
@@ -193,8 +193,8 @@ export class ObjectHelper {
193
193
  }
194
194
  /**
195
195
  * Delete the property of an unknown object.
196
- * @param obj The object to set the property from.
197
- * @param property The property to set
196
+ * @param obj The object to delete the property from.
197
+ * @param property The property to delete.
198
198
  */
199
199
  static propertyDelete(obj, property) {
200
200
  if (Is.object(obj)) {
@@ -225,27 +225,27 @@ export class ObjectHelper {
225
225
  * Pick a subset of properties from an object.
226
226
  * @param obj The object to pick the properties from.
227
227
  * @param keys The property keys to pick.
228
- * @returns The partial object.
228
+ * @returns The picked object, or undefined if the input was undefined.
229
229
  */
230
230
  static pick(obj, keys) {
231
- if (Is.object(obj) && Is.arrayValue(keys)) {
231
+ if (Is.object(obj)) {
232
232
  const result = {};
233
233
  for (const key of keys) {
234
234
  result[key] = obj[key];
235
235
  }
236
236
  return result;
237
237
  }
238
- return obj;
238
+ return undefined;
239
239
  }
240
240
  /**
241
241
  * Omit a subset of properties from an object.
242
242
  * @param obj The object to omit the properties from.
243
243
  * @param keys The property keys to omit.
244
- * @returns The partial object.
244
+ * @returns The object without the omitted keys, or undefined if the input was undefined.
245
245
  */
246
246
  static omit(obj, keys) {
247
247
  if (Is.object(obj) && Is.arrayValue(keys)) {
248
- const result = { ...obj };
248
+ const result = ObjectHelper.clone(obj);
249
249
  for (const key of keys) {
250
250
  delete result[key];
251
251
  }
@@ -253,32 +253,6 @@ export class ObjectHelper {
253
253
  }
254
254
  return obj;
255
255
  }
256
- /**
257
- * Split an object into two with the specified keys.
258
- * @param obj The object to split.
259
- * @param keys The property keys to split.
260
- * @returns The two partial objects.
261
- */
262
- static split(obj, keys) {
263
- if (Is.object(obj) && Is.array(keys)) {
264
- const picked = {};
265
- const omitted = {};
266
- const allKeys = Object.keys(obj);
267
- for (const key of allKeys) {
268
- if (keys.includes(key)) {
269
- picked[key] = obj[key];
270
- }
271
- else {
272
- omitted[key] = obj[key];
273
- }
274
- }
275
- return {
276
- picked: Object.keys(picked).length > 0 ? picked : undefined,
277
- omitted: Object.keys(omitted).length > 0 ? omitted : undefined
278
- };
279
- }
280
- return { picked: obj, omitted: undefined };
281
- }
282
256
  /**
283
257
  * Converter the non JSON primitives to extended types.
284
258
  * @param obj The object to convert.
@@ -1 +1 @@
1
- {"version":3,"file":"objectHelper.js","sourceRoot":"","sources":["../../../src/helpers/objectHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { nameof } from \"@twin.org/nameof\";\nimport { JsonHelper } from \"./jsonHelper.js\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport { Converter } from \"../utils/converter.js\";\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with objects.\n */\nexport class ObjectHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<ObjectHelper>();\n\n\t/**\n\t * Convert an object to bytes.\n\t * @param obj The object to convert.\n\t * @param format Format the JSON content.\n\t * @returns The object as bytes.\n\t */\n\tpublic static toBytes<T>(obj: T | undefined, format: boolean = false): Uint8Array {\n\t\tif (Is.undefined(obj)) {\n\t\t\treturn new Uint8Array();\n\t\t}\n\t\tconst json = format ? JSON.stringify(obj, undefined, \"\\t\") : JSON.stringify(obj);\n\n\t\treturn Converter.utf8ToBytes(json);\n\t}\n\n\t/**\n\t * Convert a bytes to an object.\n\t * @param bytes The bytes to convert to an object.\n\t * @returns The object.\n\t * @throws GeneralError if there was an error parsing the JSON.\n\t */\n\tpublic static fromBytes<T>(bytes: Uint8Array | undefined | null): T {\n\t\tif (Is.empty(bytes) || bytes.length === 0) {\n\t\t\treturn undefined as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\tconst utf8 = Converter.bytesToUtf8(bytes);\n\t\t\treturn JSON.parse(utf8) as T;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"failedBytesToJSON\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Make a deep clone of an object.\n\t * @param obj The object to clone.\n\t * @returns The objects clone.\n\t */\n\tpublic static clone<T>(obj: T): T {\n\t\tif (Is.undefined(obj)) {\n\t\t\treturn undefined as T;\n\t\t}\n\t\treturn structuredClone(obj);\n\t}\n\n\t/**\n\t * Deep merge objects.\n\t * @param obj1 The first object to merge.\n\t * @param obj2 The second object to merge.\n\t * @returns The combined deep merge of the objects.\n\t */\n\tpublic static merge<T = unknown, U = unknown>(obj1: T, obj2: U): T & U {\n\t\tif (Is.empty(obj1)) {\n\t\t\treturn ObjectHelper.clone(obj2) as T & U;\n\t\t}\n\t\tif (Is.empty(obj2)) {\n\t\t\treturn ObjectHelper.clone(obj1) as T & U;\n\t\t}\n\n\t\tconst obj1Clone = ObjectHelper.clone(obj1);\n\n\t\tif (Is.object(obj1Clone) && Is.object(obj2)) {\n\t\t\tconst keys = Object.keys(obj2);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (Is.object(obj1Clone[key]) && Is.object(obj2[key])) {\n\t\t\t\t\tObjectHelper.propertySet(obj1Clone, key, ObjectHelper.merge(obj1Clone[key], obj2[key]));\n\t\t\t\t} else {\n\t\t\t\t\tObjectHelper.propertySet(obj1Clone, key, obj2[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj1Clone as T & U;\n\t}\n\n\t/**\n\t * Does one object equal another.\n\t * @param obj1 The first object to compare.\n\t * @param obj2 The second object to compare.\n\t * @param strictPropertyOrder Should the properties be in the same order, defaults to true.\n\t * @returns True is the objects are equal.\n\t */\n\tpublic static equal<T>(obj1: T, obj2: T, strictPropertyOrder?: boolean): boolean {\n\t\tif (strictPropertyOrder ?? true) {\n\t\t\treturn JSON.stringify(obj1) === JSON.stringify(obj2);\n\t\t}\n\t\treturn JsonHelper.canonicalize(obj1) === JsonHelper.canonicalize(obj2);\n\t}\n\n\t/**\n\t * Get the property of an unknown object.\n\t * @param obj The object to get the property from.\n\t * @param property The property to get, can be separated by dots for nested path.\n\t * @returns The property.\n\t */\n\tpublic static propertyGet<T = unknown>(obj: unknown, property: string): T | undefined {\n\t\tconst pathParts = property.split(\".\");\n\n\t\tlet pathValue: unknown = obj;\n\t\tfor (const pathPart of pathParts) {\n\t\t\t// Is the path part numeric i.e. an array index.\n\t\t\tconst arrayMatch = /^(\\d+)$/.exec(pathPart);\n\n\t\t\tif (arrayMatch) {\n\t\t\t\tconst arrayIndex = Number.parseInt(arrayMatch[1], 10);\n\n\t\t\t\tif (Is.arrayValue(pathValue) && arrayIndex < pathValue.length) {\n\t\t\t\t\t// There is no prop name so this is a direct array index on the current object\n\t\t\t\t\tpathValue = pathValue[arrayIndex];\n\t\t\t\t} else {\n\t\t\t\t\t// Array index for non array object so return\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t// No array part in path so assume object sub property\n\t\t\t\tpathValue = pathValue[pathPart];\n\t\t\t} else {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\treturn pathValue as T;\n\t}\n\n\t/**\n\t * Set the property of an unknown object.\n\t * @param obj The object to set the property from.\n\t * @param property The property to set.\n\t * @param value The value to set.\n\t * @throws GeneralError if the property target is not an object.\n\t */\n\tpublic static propertySet(obj: unknown, property: string, value: unknown): void {\n\t\tconst pathParts = property.split(\".\");\n\n\t\tlet pathValue: unknown = obj;\n\t\tlet parentObj: unknown;\n\t\tfor (let i = 0; i < pathParts.length; i++) {\n\t\t\tconst pathPart = pathParts[i];\n\n\t\t\t// Is the path part numeric i.e. an array index.\n\t\t\tconst arrayMatch = /^(\\d+)$/.exec(pathPart);\n\t\t\tconst arrayIndex = arrayMatch ? Number.parseInt(arrayMatch[1], 10) : -1;\n\n\t\t\tif (i === pathParts.length - 1) {\n\t\t\t\t// Last part of path so set the value\n\t\t\t\tif (arrayIndex >= 0) {\n\t\t\t\t\tif (Is.array(pathValue)) {\n\t\t\t\t\t\tpathValue[arrayIndex] = value;\n\t\t\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t\t\tpathValue[arrayIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"cannotSetArrayIndex\", {\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tindex: arrayIndex\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t\tpathValue[pathPart] = value;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"cannotSetProperty\", { property });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparentObj = pathValue;\n\t\t\t\tif (Is.object(pathValue)) {\n\t\t\t\t\tpathValue = pathValue[pathPart];\n\t\t\t\t} else if (Is.array(pathValue)) {\n\t\t\t\t\tpathValue = pathValue[arrayIndex];\n\t\t\t\t}\n\n\t\t\t\tif (Is.empty(pathValue)) {\n\t\t\t\t\tconst nextArrayMatch = /^(\\d+)$/.exec(pathParts[i + 1]);\n\t\t\t\t\tconst nextArrayIndex = nextArrayMatch ? Number.parseInt(nextArrayMatch[1], 10) : -1;\n\n\t\t\t\t\tif (nextArrayIndex >= 0) {\n\t\t\t\t\t\tpathValue = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpathValue = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Is.object(parentObj)) {\n\t\t\t\t\t\tparentObj[pathPart] = pathValue;\n\t\t\t\t\t} else if (Is.array(parentObj)) {\n\t\t\t\t\t\tparentObj[arrayIndex] = pathValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Delete the property of an unknown object.\n\t * @param obj The object to set the property from.\n\t * @param property The property to set\n\t */\n\tpublic static propertyDelete(obj: unknown, property: string): void {\n\t\tif (Is.object(obj)) {\n\t\t\tdelete obj[property];\n\t\t}\n\t}\n\n\t/**\n\t * Extract a property from the object, providing alternative names.\n\t * @param obj The object to extract from.\n\t * @param propertyNames The possible names for the property.\n\t * @param removeProperties Remove the properties from the object, defaults to true.\n\t * @returns The property if available.\n\t */\n\tpublic static extractProperty<T>(\n\t\tobj: unknown,\n\t\tpropertyNames: string | string[],\n\t\tremoveProperties: boolean = true\n\t): T | undefined {\n\t\tlet retVal: T | undefined;\n\n\t\tif (Is.object(obj)) {\n\t\t\tconst names = Is.string(propertyNames) ? [propertyNames] : propertyNames;\n\n\t\t\tfor (const prop of names) {\n\t\t\t\tretVal ??= ObjectHelper.propertyGet<T>(obj, prop);\n\t\t\t\tif (removeProperties) {\n\t\t\t\t\tObjectHelper.propertyDelete(obj, prop);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn retVal;\n\t}\n\n\t/**\n\t * Pick a subset of properties from an object.\n\t * @param obj The object to pick the properties from.\n\t * @param keys The property keys to pick.\n\t * @returns The partial object.\n\t */\n\tpublic static pick<T>(obj: T | undefined, keys?: (keyof T)[]): Partial<T> {\n\t\tif (Is.object(obj) && Is.arrayValue(keys)) {\n\t\t\tconst result: Partial<T> = {};\n\t\t\tfor (const key of keys) {\n\t\t\t\tresult[key] = obj[key];\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\treturn obj as Partial<T>;\n\t}\n\n\t/**\n\t * Omit a subset of properties from an object.\n\t * @param obj The object to omit the properties from.\n\t * @param keys The property keys to omit.\n\t * @returns The partial object.\n\t */\n\tpublic static omit<T>(obj: T | undefined, keys?: (keyof T)[]): Partial<T> {\n\t\tif (Is.object(obj) && Is.arrayValue(keys)) {\n\t\t\tconst result = { ...obj };\n\t\t\tfor (const key of keys) {\n\t\t\t\tdelete result[key];\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\treturn obj as Partial<T>;\n\t}\n\n\t/**\n\t * Split an object into two with the specified keys.\n\t * @param obj The object to split.\n\t * @param keys The property keys to split.\n\t * @returns The two partial objects.\n\t */\n\tpublic static split<T>(\n\t\tobj: T | undefined,\n\t\tkeys?: (keyof T)[]\n\t): { picked: Partial<T> | undefined; omitted: Partial<T> | undefined } {\n\t\tif (Is.object(obj) && Is.array(keys)) {\n\t\t\tconst picked: Partial<T> = {};\n\t\t\tconst omitted: Partial<T> = {};\n\n\t\t\tconst allKeys = Object.keys(obj) as (keyof T)[];\n\t\t\tfor (const key of allKeys) {\n\t\t\t\tif (keys.includes(key)) {\n\t\t\t\t\tpicked[key] = obj[key];\n\t\t\t\t} else {\n\t\t\t\t\tomitted[key] = obj[key];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpicked: Object.keys(picked).length > 0 ? picked : undefined,\n\t\t\t\tomitted: Object.keys(omitted).length > 0 ? omitted : undefined\n\t\t\t};\n\t\t}\n\n\t\treturn { picked: obj as Partial<T>, omitted: undefined };\n\t}\n\n\t/**\n\t * Converter the non JSON primitives to extended types.\n\t * @param obj The object to convert.\n\t * @returns The object with extended properties.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static toExtended(obj: any): any {\n\t\tconst jsonExtended = JsonHelper.stringifyEx(obj);\n\t\treturn JSON.parse(jsonExtended);\n\t}\n\n\t/**\n\t * Converter the extended types to non JSON primitives.\n\t * @param obj The object to convert.\n\t * @returns The object with regular properties.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static fromExtended(obj: any): any {\n\t\tconst jsonExtended = JsonHelper.stringifyEx(obj);\n\t\treturn JsonHelper.parseEx(jsonExtended);\n\t}\n\n\t/**\n\t * Remove empty properties from an object.\n\t * @param obj The object to remove the empty properties from.\n\t * @param options The options for the removal.\n\t * @param options.removeUndefined Remove undefined properties, defaults to true.\n\t * @param options.removeNull Remove null properties, defaults to false.\n\t * @returns The object with empty properties removed.\n\t */\n\tpublic static removeEmptyProperties<T = unknown>(\n\t\tobj: T,\n\t\toptions?: { removeUndefined?: boolean; removeNull?: boolean }\n\t): T {\n\t\tif (Is.object(obj)) {\n\t\t\tconst removeUndefined = options?.removeUndefined ?? true;\n\t\t\tconst removeNull = options?.removeNull ?? false;\n\t\t\tconst newObj: { [id: string]: unknown } = {};\n\t\t\tconst keys = Object.keys(obj);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (!((removeUndefined && Is.undefined(obj[key])) || (removeNull && Is.null(obj[key])))) {\n\t\t\t\t\tnewObj[key] = ObjectHelper.removeEmptyProperties(obj[key], options);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newObj as T;\n\t\t} else if (Is.array(obj)) {\n\t\t\tconst arr = [];\n\t\t\tfor (const element of obj) {\n\t\t\t\tarr.push(ObjectHelper.removeEmptyProperties(element, options));\n\t\t\t}\n\t\t\treturn arr as T;\n\t\t}\n\t\treturn obj;\n\t}\n}\n"]}
1
+ {"version":3,"file":"objectHelper.js","sourceRoot":"","sources":["../../../src/helpers/objectHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { nameof } from \"@twin.org/nameof\";\nimport { JsonHelper } from \"./jsonHelper.js\";\nimport { GeneralError } from \"../errors/generalError.js\";\nimport { Converter } from \"../utils/converter.js\";\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with objects.\n */\nexport class ObjectHelper {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<ObjectHelper>();\n\n\t/**\n\t * Convert an object to bytes.\n\t * @param obj The object to convert.\n\t * @param format Format the JSON content.\n\t * @returns The object as bytes.\n\t */\n\tpublic static toBytes<T>(obj: T | undefined, format: boolean = false): Uint8Array {\n\t\tif (Is.undefined(obj)) {\n\t\t\treturn new Uint8Array();\n\t\t}\n\t\tconst json = format ? JSON.stringify(obj, undefined, \"\\t\") : JSON.stringify(obj);\n\n\t\treturn Converter.utf8ToBytes(json);\n\t}\n\n\t/**\n\t * Convert a bytes to an object.\n\t * @param bytes The bytes to convert to an object.\n\t * @returns The object.\n\t * @throws GeneralError if there was an error parsing the JSON.\n\t */\n\tpublic static fromBytes<T>(bytes: Uint8Array | undefined | null): T {\n\t\tif (Is.empty(bytes) || bytes.length === 0) {\n\t\t\treturn undefined as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\tconst utf8 = Converter.bytesToUtf8(bytes);\n\t\t\treturn JSON.parse(utf8) as T;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"failedBytesToJSON\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Make a deep clone of an object.\n\t * @param obj The object to clone.\n\t * @returns The objects clone.\n\t */\n\tpublic static clone<T>(obj: T): T;\n\t/**\n\t * Make a deep clone of an object.\n\t * @param obj The object to clone.\n\t * @returns The objects clone, or undefined if the input was undefined.\n\t */\n\tpublic static clone<T>(obj: T | undefined): T | undefined {\n\t\tif (Is.undefined(obj)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn structuredClone(obj);\n\t}\n\n\t/**\n\t * Deep merge objects.\n\t * @param obj1 The first object to merge.\n\t * @param obj2 The second object to merge.\n\t * @returns The combined deep merge of the objects.\n\t */\n\tpublic static merge<T = unknown, U = unknown>(obj1: T, obj2: U): T & U {\n\t\tif (Is.empty(obj1)) {\n\t\t\treturn ObjectHelper.clone(obj2) as T & U;\n\t\t}\n\t\tif (Is.empty(obj2)) {\n\t\t\treturn ObjectHelper.clone(obj1) as T & U;\n\t\t}\n\n\t\tconst obj1Clone = ObjectHelper.clone(obj1);\n\n\t\tif (Is.object(obj1Clone) && Is.object(obj2)) {\n\t\t\tconst keys = Object.keys(obj2);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (Is.object(obj1Clone[key]) && Is.object(obj2[key])) {\n\t\t\t\t\tObjectHelper.propertySet(obj1Clone, key, ObjectHelper.merge(obj1Clone[key], obj2[key]));\n\t\t\t\t} else {\n\t\t\t\t\tObjectHelper.propertySet(obj1Clone, key, obj2[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj1Clone as T & U;\n\t}\n\n\t/**\n\t * Does one object equal another.\n\t * @param obj1 The first object to compare.\n\t * @param obj2 The second object to compare.\n\t * @param strictPropertyOrder Should the properties be in the same order, defaults to true.\n\t * @returns True is the objects are equal.\n\t */\n\tpublic static equal<T>(obj1: T, obj2: T, strictPropertyOrder?: boolean): boolean {\n\t\tif (strictPropertyOrder ?? true) {\n\t\t\treturn JSON.stringify(obj1) === JSON.stringify(obj2);\n\t\t}\n\t\treturn JsonHelper.canonicalize(obj1) === JsonHelper.canonicalize(obj2);\n\t}\n\n\t/**\n\t * Get the property of an unknown object.\n\t * @param obj The object to get the property from.\n\t * @param property The property to get, can be separated by dots for nested path.\n\t * @returns The property.\n\t */\n\tpublic static propertyGet<T = unknown>(obj: unknown, property: string): T | undefined {\n\t\tconst pathParts = property.split(\".\");\n\n\t\tlet pathValue: unknown = obj;\n\t\tfor (const pathPart of pathParts) {\n\t\t\t// Is the path part numeric i.e. an array index.\n\t\t\tconst arrayMatch = /^(\\d+)$/.exec(pathPart);\n\n\t\t\tif (arrayMatch) {\n\t\t\t\tconst arrayIndex = Number.parseInt(arrayMatch[1], 10);\n\n\t\t\t\tif (Is.arrayValue(pathValue) && arrayIndex < pathValue.length) {\n\t\t\t\t\t// There is no prop name so this is a direct array index on the current object\n\t\t\t\t\tpathValue = pathValue[arrayIndex];\n\t\t\t\t} else {\n\t\t\t\t\t// Array index for non array object so return\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t// No array part in path so assume object sub property\n\t\t\t\tpathValue = pathValue[pathPart];\n\t\t\t} else {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\treturn pathValue as T;\n\t}\n\n\t/**\n\t * Set the property of an unknown object.\n\t * @param obj The object to set the property from.\n\t * @param property The property to set.\n\t * @param value The value to set.\n\t * @throws GeneralError if the property target is not an object.\n\t */\n\tpublic static propertySet(obj: unknown, property: string, value: unknown): void {\n\t\tconst pathParts = property.split(\".\");\n\n\t\tlet pathValue: unknown = obj;\n\t\tlet parentObj: unknown;\n\t\tfor (let i = 0; i < pathParts.length; i++) {\n\t\t\tconst pathPart = pathParts[i];\n\n\t\t\t// Is the path part numeric i.e. an array index.\n\t\t\tconst arrayMatch = /^(\\d+)$/.exec(pathPart);\n\t\t\tconst arrayIndex = arrayMatch ? Number.parseInt(arrayMatch[1], 10) : -1;\n\n\t\t\tif (i === pathParts.length - 1) {\n\t\t\t\t// Last part of path so set the value\n\t\t\t\tif (arrayIndex >= 0) {\n\t\t\t\t\tif (Is.array(pathValue)) {\n\t\t\t\t\t\tpathValue[arrayIndex] = value;\n\t\t\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t\t\tpathValue[arrayIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"cannotSetArrayIndex\", {\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tindex: arrayIndex\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (Is.object(pathValue)) {\n\t\t\t\t\tpathValue[pathPart] = value;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new GeneralError(ObjectHelper.CLASS_NAME, \"cannotSetProperty\", { property });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparentObj = pathValue;\n\t\t\t\tif (Is.object(pathValue)) {\n\t\t\t\t\tpathValue = pathValue[pathPart];\n\t\t\t\t} else if (Is.array(pathValue)) {\n\t\t\t\t\tpathValue = pathValue[arrayIndex];\n\t\t\t\t}\n\n\t\t\t\tif (Is.empty(pathValue)) {\n\t\t\t\t\tconst nextArrayMatch = /^(\\d+)$/.exec(pathParts[i + 1]);\n\t\t\t\t\tconst nextArrayIndex = nextArrayMatch ? Number.parseInt(nextArrayMatch[1], 10) : -1;\n\n\t\t\t\t\tif (nextArrayIndex >= 0) {\n\t\t\t\t\t\tpathValue = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpathValue = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Is.object(parentObj)) {\n\t\t\t\t\t\tparentObj[pathPart] = pathValue;\n\t\t\t\t\t} else if (Is.array(parentObj)) {\n\t\t\t\t\t\tparentObj[arrayIndex] = pathValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Delete the property of an unknown object.\n\t * @param obj The object to delete the property from.\n\t * @param property The property to delete.\n\t */\n\tpublic static propertyDelete(obj: unknown, property: string): void {\n\t\tif (Is.object(obj)) {\n\t\t\tdelete obj[property];\n\t\t}\n\t}\n\n\t/**\n\t * Extract a property from the object, providing alternative names.\n\t * @param obj The object to extract from.\n\t * @param propertyNames The possible names for the property.\n\t * @param removeProperties Remove the properties from the object, defaults to true.\n\t * @returns The property if available.\n\t */\n\tpublic static extractProperty<T>(\n\t\tobj: unknown,\n\t\tpropertyNames: string | string[],\n\t\tremoveProperties: boolean = true\n\t): T | undefined {\n\t\tlet retVal: T | undefined;\n\n\t\tif (Is.object(obj)) {\n\t\t\tconst names = Is.string(propertyNames) ? [propertyNames] : propertyNames;\n\n\t\t\tfor (const prop of names) {\n\t\t\t\tretVal ??= ObjectHelper.propertyGet<T>(obj, prop);\n\t\t\t\tif (removeProperties) {\n\t\t\t\t\tObjectHelper.propertyDelete(obj, prop);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn retVal;\n\t}\n\n\t/**\n\t * Pick a subset of properties from an object.\n\t * @param obj The object to pick the properties from.\n\t * @param keys The property keys to pick.\n\t * @returns The picked object, or undefined if the input was undefined.\n\t */\n\tpublic static pick<T extends object, K extends keyof T>(\n\t\tobj: T | undefined,\n\t\tkeys: readonly K[]\n\t): T extends undefined ? undefined : Pick<T, K> {\n\t\tif (Is.object(obj)) {\n\t\t\tconst result = {} as Pick<T, K>;\n\t\t\tfor (const key of keys) {\n\t\t\t\tresult[key] = obj[key];\n\t\t\t}\n\t\t\treturn result as T extends undefined ? undefined : Pick<T, K>;\n\t\t}\n\n\t\treturn undefined as T extends undefined ? undefined : Pick<T, K>;\n\t}\n\n\t/**\n\t * Omit a subset of properties from an object.\n\t * @param obj The object to omit the properties from.\n\t * @param keys The property keys to omit.\n\t * @returns The object without the omitted keys, or undefined if the input was undefined.\n\t */\n\tpublic static omit<T, K extends keyof T>(\n\t\tobj: T | undefined,\n\t\tkeys: readonly K[]\n\t): T extends undefined ? undefined : Omit<T, K> {\n\t\tif (Is.object(obj) && Is.arrayValue(keys)) {\n\t\t\tconst result = ObjectHelper.clone(obj);\n\t\t\tfor (const key of keys) {\n\t\t\t\tdelete result[key];\n\t\t\t}\n\t\t\treturn result as T extends undefined ? undefined : Omit<T, K>;\n\t\t}\n\n\t\treturn obj as T extends undefined ? undefined : Omit<T, K>;\n\t}\n\n\t/**\n\t * Converter the non JSON primitives to extended types.\n\t * @param obj The object to convert.\n\t * @returns The object with extended properties.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static toExtended(obj: any): any {\n\t\tconst jsonExtended = JsonHelper.stringifyEx(obj);\n\t\treturn JSON.parse(jsonExtended);\n\t}\n\n\t/**\n\t * Converter the extended types to non JSON primitives.\n\t * @param obj The object to convert.\n\t * @returns The object with regular properties.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpublic static fromExtended(obj: any): any {\n\t\tconst jsonExtended = JsonHelper.stringifyEx(obj);\n\t\treturn JsonHelper.parseEx(jsonExtended);\n\t}\n\n\t/**\n\t * Remove empty properties from an object.\n\t * @param obj The object to remove the empty properties from.\n\t * @param options The options for the removal.\n\t * @param options.removeUndefined Remove undefined properties, defaults to true.\n\t * @param options.removeNull Remove null properties, defaults to false.\n\t * @returns The object with empty properties removed.\n\t */\n\tpublic static removeEmptyProperties<T = unknown>(\n\t\tobj: T,\n\t\toptions?: { removeUndefined?: boolean; removeNull?: boolean }\n\t): T {\n\t\tif (Is.object(obj)) {\n\t\t\tconst removeUndefined = options?.removeUndefined ?? true;\n\t\t\tconst removeNull = options?.removeNull ?? false;\n\t\t\tconst newObj: { [id: string]: unknown } = {};\n\t\t\tconst keys = Object.keys(obj);\n\t\t\tfor (const key of keys) {\n\t\t\t\tif (!((removeUndefined && Is.undefined(obj[key])) || (removeNull && Is.null(obj[key])))) {\n\t\t\t\t\tnewObj[key] = ObjectHelper.removeEmptyProperties(obj[key], options);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newObj as T;\n\t\t} else if (Is.array(obj)) {\n\t\t\tconst arr = [];\n\t\t\tfor (const element of obj) {\n\t\t\t\tarr.push(ObjectHelper.removeEmptyProperties(element, options));\n\t\t\t}\n\t\t\treturn arr as T;\n\t\t}\n\t\treturn obj;\n\t}\n}\n"]}
@@ -29,6 +29,17 @@ export class StringHelper {
29
29
  }
30
30
  return value;
31
31
  }
32
+ /**
33
+ * Trim both leading and trailing slashes from a string.
34
+ * @param value The value to trim.
35
+ * @returns The trimmed string or the original.
36
+ */
37
+ static trimLeadingAndTrailingSlashes(value) {
38
+ if (Is.string(value)) {
39
+ return value.replace(/^\/+|\/+$/g, "");
40
+ }
41
+ return value;
42
+ }
32
43
  /**
33
44
  * Convert the input string to kebab case.
34
45
  * @param input The input to convert.
@@ -1 +1 @@
1
- {"version":3,"file":"stringHelper.js","sourceRoot":"","sources":["../../../src/helpers/stringHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-continue */\n/* eslint-disable no-bitwise */\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with string.\n */\nexport class StringHelper {\n\t/**\n\t * Implementation signature for trimTrailingSlashes.\n\t * @param value The value to trim.\n\t * @returns The trimmed string or the original.\n\t */\n\tpublic static trimTrailingSlashes(value: string): string {\n\t\tif (Is.string(value)) {\n\t\t\treturn value.replace(/\\/+$/, \"\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Implementation signature for trimLeadingSlashes.\n\t * @param value The value to trim.\n\t * @returns The trimmed string or the original.\n\t */\n\tpublic static trimLeadingSlashes(value: string): string {\n\t\tif (Is.string(value)) {\n\t\t\treturn value.replace(/^\\/+/, \"\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Convert the input string to kebab case.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The kebab case version of the input.\n\t */\n\tpublic static kebabCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output).join(\"-\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Convert the input string to snake case.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The snake case version of the input.\n\t */\n\tpublic static snakeCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output).join(\"_\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Title case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The title case version of the input.\n\t */\n\tpublic static titleCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output)\n\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t.join(\" \");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Pascal case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The pascal case version of the input.\n\t */\n\tpublic static pascalCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output)\n\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Camel case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The camel case version of the input.\n\t */\n\tpublic static camelCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\tconst words = StringHelper.words(output);\n\t\t\treturn words.length === 0\n\t\t\t\t? \"\"\n\t\t\t\t: `${words[0].toLowerCase()}${words\n\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t\t\t.join(\"\")}`;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Convert the words to a path.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The path version of the input.\n\t */\n\tpublic static wordPath(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\tconst words = StringHelper.words(output);\n\t\t\treturn words.join(\"/\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Strip interface prefix if there is one.\n\t * @param input The input to strip.\n\t * @returns The input with any interface prefix stripped.\n\t */\n\tpublic static stripPrefix(input: string): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (/^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn output;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Split a string into words.\n\t * @param input The input to split.\n\t * @returns The string split into words.\n\t */\n\tpublic static words(input: string): string[] {\n\t\tif (!Is.stringValue(input)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn (\n\t\t\tinput\n\t\t\t\t.replace(/([A-Z])/g, \" $1\")\n\t\t\t\t.trim()\n\t\t\t\t.match(/[^\\u0000-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007F]+/g) ?? []\n\t\t);\n\t}\n\n\t/**\n\t * Check if a Node.js Buffer or Uint8Array is UTF-8.\n\t * Url https://tools.ietf.org/html/rfc3629\n\t * Source https://github.com/hcodes/isutf8\n\t * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4.\n\t * UTF8-1 = %x00-7F.\n\t * UTF8-2 = %xC2-DF UTF8-tail.\n\t * UTF8-3 = %xE0 %xA0-BF UTF8-tail.\n\t * - %xE1-EC 2( UTF8-tail ).\n\t * - %xED %x80-9F UTF8-tail.\n\t * - %xEE-EF 2( UTF8-tail ).\n\t * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ).\n\t * - %xF1-F3 3( UTF8-tail ).\n\t * - %xF4 %x80-8F 2( UTF8-tail ).\n\t * UTF8-tail = %x80-BF.\n\t * @param data The data to check.\n\t * @returns True if the data is utf8.\n\t */\n\tpublic static isUtf8(data: Uint8Array): boolean {\n\t\tif (!Is.uint8Array(data)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet i = 0;\n\t\tconst len = data.length;\n\n\t\twhile (i < len) {\n\t\t\t// UTF8-1 = %x00-7F\n\t\t\tif (data[i] <= 0x7f) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-2 = %xC2-DF UTF8-tail\n\t\t\tif (data[i] >= 0xc2 && data[i] <= 0xdf) {\n\t\t\t\t// if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n\t\t\t\tif (data[i + 1] >> 6 === 2) {\n\t\t\t\t\ti += 2;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// UTF8-3 = %xE0 %xA0-BF UTF8-tail\n\t\t\t// UTF8-3 = %xED %x80-9F UTF8-tail\n\t\t\tif (\n\t\t\t\t((data[i] === 0xe0 && data[i + 1] >= 0xa0 && data[i + 1] <= 0xbf) ||\n\t\t\t\t\t(data[i] === 0xed && data[i + 1] >= 0x80 && data[i + 1] <= 0x9f)) &&\n\t\t\t\tdata[i + 2] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 3;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-3 = %xE1-EC 2( UTF8-tail )\n\t\t\t// UTF8-3 = %xEE-EF 2( UTF8-tail )\n\t\t\tif (\n\t\t\t\t((data[i] >= 0xe1 && data[i] <= 0xec) || (data[i] >= 0xee && data[i] <= 0xef)) &&\n\t\t\t\tdata[i + 1] >> 6 === 2 &&\n\t\t\t\tdata[i + 2] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 3;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n\t\t\t// %xF1-F3 3( UTF8-tail )\n\t\t\t// %xF4 %x80-8F 2( UTF8-tail )\n\t\t\tif (\n\t\t\t\t((data[i] === 0xf0 && data[i + 1] >= 0x90 && data[i + 1] <= 0xbf) ||\n\t\t\t\t\t(data[i] >= 0xf1 && data[i] <= 0xf3 && data[i + 1] >> 6 === 2) ||\n\t\t\t\t\t(data[i] === 0xf4 && data[i + 1] >= 0x80 && data[i + 1] <= 0x8f)) &&\n\t\t\t\tdata[i + 2] >> 6 === 2 &&\n\t\t\t\tdata[i + 3] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 4;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"stringHelper.js","sourceRoot":"","sources":["../../../src/helpers/stringHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable no-continue */\n/* eslint-disable no-bitwise */\nimport { Is } from \"../utils/is.js\";\n\n/**\n * Class to help with string.\n */\nexport class StringHelper {\n\t/**\n\t * Implementation signature for trimTrailingSlashes.\n\t * @param value The value to trim.\n\t * @returns The trimmed string or the original.\n\t */\n\tpublic static trimTrailingSlashes(value: string): string {\n\t\tif (Is.string(value)) {\n\t\t\treturn value.replace(/\\/+$/, \"\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Implementation signature for trimLeadingSlashes.\n\t * @param value The value to trim.\n\t * @returns The trimmed string or the original.\n\t */\n\tpublic static trimLeadingSlashes(value: string): string {\n\t\tif (Is.string(value)) {\n\t\t\treturn value.replace(/^\\/+/, \"\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Trim both leading and trailing slashes from a string.\n\t * @param value The value to trim.\n\t * @returns The trimmed string or the original.\n\t */\n\tpublic static trimLeadingAndTrailingSlashes(value: string): string {\n\t\tif (Is.string(value)) {\n\t\t\treturn value.replace(/^\\/+|\\/+$/g, \"\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Convert the input string to kebab case.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The kebab case version of the input.\n\t */\n\tpublic static kebabCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output).join(\"-\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Convert the input string to snake case.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The snake case version of the input.\n\t */\n\tpublic static snakeCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output).join(\"_\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Title case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The title case version of the input.\n\t */\n\tpublic static titleCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output)\n\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t.join(\" \");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Pascal case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The pascal case version of the input.\n\t */\n\tpublic static pascalCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn StringHelper.words(output)\n\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Camel case all the words.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The camel case version of the input.\n\t */\n\tpublic static camelCase(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\tconst words = StringHelper.words(output);\n\t\t\treturn words.length === 0\n\t\t\t\t? \"\"\n\t\t\t\t: `${words[0].toLowerCase()}${words\n\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t.map(w => `${w[0].toUpperCase()}${w.slice(1).toLowerCase()}`)\n\t\t\t\t\t\t.join(\"\")}`;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Convert the words to a path.\n\t * @param input The input to convert.\n\t * @param stripInterfacePrefix Strip interface prefixes.\n\t * @returns The path version of the input.\n\t */\n\tpublic static wordPath(input: string, stripInterfacePrefix: boolean = true): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (stripInterfacePrefix && /^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\tconst words = StringHelper.words(output);\n\t\t\treturn words.join(\"/\").toLowerCase();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Strip interface prefix if there is one.\n\t * @param input The input to strip.\n\t * @returns The input with any interface prefix stripped.\n\t */\n\tpublic static stripPrefix(input: string): string {\n\t\tif (Is.stringValue(input)) {\n\t\t\tlet output = input;\n\t\t\tif (/^I[A-Z]/.test(output)) {\n\t\t\t\toutput = output.slice(1);\n\t\t\t}\n\t\t\treturn output;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Split a string into words.\n\t * @param input The input to split.\n\t * @returns The string split into words.\n\t */\n\tpublic static words(input: string): string[] {\n\t\tif (!Is.stringValue(input)) {\n\t\t\treturn [];\n\t\t}\n\t\treturn (\n\t\t\tinput\n\t\t\t\t.replace(/([A-Z])/g, \" $1\")\n\t\t\t\t.trim()\n\t\t\t\t.match(/[^\\u0000-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007F]+/g) ?? []\n\t\t);\n\t}\n\n\t/**\n\t * Check if a Node.js Buffer or Uint8Array is UTF-8.\n\t * Url https://tools.ietf.org/html/rfc3629\n\t * Source https://github.com/hcodes/isutf8\n\t * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4.\n\t * UTF8-1 = %x00-7F.\n\t * UTF8-2 = %xC2-DF UTF8-tail.\n\t * UTF8-3 = %xE0 %xA0-BF UTF8-tail.\n\t * - %xE1-EC 2( UTF8-tail ).\n\t * - %xED %x80-9F UTF8-tail.\n\t * - %xEE-EF 2( UTF8-tail ).\n\t * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ).\n\t * - %xF1-F3 3( UTF8-tail ).\n\t * - %xF4 %x80-8F 2( UTF8-tail ).\n\t * UTF8-tail = %x80-BF.\n\t * @param data The data to check.\n\t * @returns True if the data is utf8.\n\t */\n\tpublic static isUtf8(data: Uint8Array): boolean {\n\t\tif (!Is.uint8Array(data)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet i = 0;\n\t\tconst len = data.length;\n\n\t\twhile (i < len) {\n\t\t\t// UTF8-1 = %x00-7F\n\t\t\tif (data[i] <= 0x7f) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-2 = %xC2-DF UTF8-tail\n\t\t\tif (data[i] >= 0xc2 && data[i] <= 0xdf) {\n\t\t\t\t// if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n\t\t\t\tif (data[i + 1] >> 6 === 2) {\n\t\t\t\t\ti += 2;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// UTF8-3 = %xE0 %xA0-BF UTF8-tail\n\t\t\t// UTF8-3 = %xED %x80-9F UTF8-tail\n\t\t\tif (\n\t\t\t\t((data[i] === 0xe0 && data[i + 1] >= 0xa0 && data[i + 1] <= 0xbf) ||\n\t\t\t\t\t(data[i] === 0xed && data[i + 1] >= 0x80 && data[i + 1] <= 0x9f)) &&\n\t\t\t\tdata[i + 2] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 3;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-3 = %xE1-EC 2( UTF8-tail )\n\t\t\t// UTF8-3 = %xEE-EF 2( UTF8-tail )\n\t\t\tif (\n\t\t\t\t((data[i] >= 0xe1 && data[i] <= 0xec) || (data[i] >= 0xee && data[i] <= 0xef)) &&\n\t\t\t\tdata[i + 1] >> 6 === 2 &&\n\t\t\t\tdata[i + 2] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 3;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n\t\t\t// %xF1-F3 3( UTF8-tail )\n\t\t\t// %xF4 %x80-8F 2( UTF8-tail )\n\t\t\tif (\n\t\t\t\t((data[i] === 0xf0 && data[i + 1] >= 0x90 && data[i + 1] <= 0xbf) ||\n\t\t\t\t\t(data[i] >= 0xf1 && data[i] <= 0xf3 && data[i + 1] >> 6 === 2) ||\n\t\t\t\t\t(data[i] === 0xf4 && data[i + 1] >= 0x80 && data[i + 1] <= 0x8f)) &&\n\t\t\t\tdata[i + 2] >> 6 === 2 &&\n\t\t\t\tdata[i + 3] >> 6 === 2\n\t\t\t) {\n\t\t\t\ti += 4;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/utils/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { IntlMessageFormat } from \"intl-messageformat\";\nimport { Is } from \"./is.js\";\nimport { SharedStore } from \"./sharedStore.js\";\nimport type { II18nShared } from \"../models/II18nShared.js\";\nimport type { ILocaleDictionary } from \"../models/ILocaleDictionary.js\";\n\n/**\n * Class to perform internationalization.\n */\nexport class I18n {\n\t/**\n\t * The default translation.\n\t */\n\tpublic static DEFAULT_LOCALE: string = \"en\";\n\n\t/**\n\t * Set the locale.\n\t * @param locale The new locale.\n\t */\n\tpublic static setLocale(locale: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\ti18nShared.currentLocale = locale;\n\n\t\tfor (const callback in i18nShared.localeChangedHandlers) {\n\t\t\ti18nShared.localeChangedHandlers[callback](i18nShared.currentLocale);\n\t\t}\n\t}\n\n\t/**\n\t * Get the locale.\n\t * @returns The current locale.\n\t */\n\tpublic static getLocale(): string {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.currentLocale;\n\t}\n\n\t/**\n\t * Add a locale dictionary.\n\t * @param locale The locale.\n\t * @param dictionary The dictionary to add.\n\t */\n\tpublic static addDictionary(locale: string, dictionary: ILocaleDictionary): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\tconst mergedKeys: { [key: string]: string } = {};\n\t\tI18n.flattenTranslationKeys(dictionary, \"\", mergedKeys);\n\t\ti18nShared.localeDictionaries[locale] = mergedKeys;\n\n\t\tfor (const callback in i18nShared.dictionaryChangedHandlers) {\n\t\t\ti18nShared.dictionaryChangedHandlers[callback](i18nShared.currentLocale);\n\t\t}\n\t}\n\n\t/**\n\t * Get a locale dictionary.\n\t * @param locale The locale.\n\t * @returns The dictionary of undefined if it does not exist.\n\t */\n\tpublic static getDictionary(locale: string): { [key: string]: string } | undefined {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.localeDictionaries[locale];\n\t}\n\n\t/**\n\t * Get all the locale dictionaries.\n\t * @returns The dictionaries.\n\t */\n\tpublic static getAllDictionaries(): {\n\t\t[locale: string]: { [key: string]: string };\n\t} {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.localeDictionaries;\n\t}\n\n\t/**\n\t * Add a locale changed handler.\n\t * @param id The id of the handler.\n\t * @param handler The handler to add.\n\t */\n\tpublic static addLocaleHandler(id: string, handler: (locale: string) => void): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\ti18nShared.localeChangedHandlers[id] = handler;\n\t}\n\n\t/**\n\t * Remove a locale changed handler.\n\t * @param id The id of the handler.\n\t */\n\tpublic static removeLocaleHandler(id: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\tdelete i18nShared.localeChangedHandlers[id];\n\t}\n\n\t/**\n\t * Add a dictionary changed handler.\n\t * @param id The id of the handler.\n\t * @param handler The handler to add.\n\t */\n\tpublic static addDictionaryHandler(id: string, handler: (locale: string) => void): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\ti18nShared.dictionaryChangedHandlers[id] = handler;\n\t}\n\n\t/**\n\t * Remove a dictionary changed handler.\n\t * @param id The id of the handler.\n\t */\n\tpublic static removeDictionaryHandler(id: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\tdelete i18nShared.dictionaryChangedHandlers[id];\n\t}\n\n\t/**\n\t * Format a message.\n\t * @param key The key of the message to format.\n\t * @param values The values to substitute into the message.\n\t * @param overrideLocale Override the locale.\n\t * @returns The formatted string.\n\t */\n\tpublic static formatMessage(\n\t\tkey: string,\n\t\tvalues?: { [key: string]: unknown },\n\t\toverrideLocale?: string\n\t): string {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\tlet cl = overrideLocale ?? i18nShared.currentLocale;\n\t\tif (cl.startsWith(\"debug-\")) {\n\t\t\tcl = I18n.DEFAULT_LOCALE;\n\t\t}\n\n\t\tif (!i18nShared.localeDictionaries[cl]) {\n\t\t\treturn `!!Missing ${cl}`;\n\t\t}\n\t\tif (!i18nShared.localeDictionaries[cl][key]) {\n\t\t\treturn `!!Missing ${cl}.${key}`;\n\t\t}\n\n\t\tif (i18nShared.currentLocale === \"debug-k\") {\n\t\t\treturn key;\n\t\t}\n\n\t\ttry {\n\t\t\tlet ret = new IntlMessageFormat(i18nShared.localeDictionaries[cl][key], cl).format(\n\t\t\t\tvalues\n\t\t\t) as string;\n\n\t\t\tif (i18nShared.currentLocale === \"debug-x\") {\n\t\t\t\tret = ret.replace(/[a-z]/g, \"x\").replace(/[A-Z]/g, \"x\").replace(/\\d/g, \"n\");\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t} catch {\n\t\t\t// if there is an error the assumption is that one of the properties\n\t\t\t// is undefined, which the formatting library does not like\n\t\t\t// in this case we get all the property names and ensure they are defined\n\t\t\tconst propertyNames = I18n.getPropertyNames(i18nShared.localeDictionaries[cl][key]);\n\t\t\tconst safeValues: { [key: string]: unknown } = values ?? {};\n\n\t\t\tfor (const propertyName of propertyNames) {\n\t\t\t\tsafeValues[propertyName] ??= \"\";\n\t\t\t}\n\n\t\t\t// Format again with the safe values, if it still fails we let the error\n\t\t\t// propagate up as there is nothing more we can do\n\t\t\treturn new IntlMessageFormat(i18nShared.localeDictionaries[cl][key], cl).format(\n\t\t\t\tsafeValues\n\t\t\t) as string;\n\t\t}\n\t}\n\n\t/**\n\t * Check if the dictionaries have a message for the given key.\n\t * @param key The key to check for existence.\n\t * @returns True if the key exists.\n\t */\n\tpublic static hasMessage(key: string): boolean {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn Is.string(i18nShared.localeDictionaries[i18nShared.currentLocale]?.[key]);\n\t}\n\n\t/**\n\t * Flatten the translation property paths for faster lookup.\n\t * @param translation The translation to merge.\n\t * @param propertyPath The current root path.\n\t * @param mergedKeys The merged keys dictionary to populate.\n\t */\n\tpublic static flattenTranslationKeys(\n\t\ttranslation: ILocaleDictionary,\n\t\tpropertyPath: string,\n\t\tmergedKeys: { [key: string]: string }\n\t): void {\n\t\tfor (const key in translation) {\n\t\t\tconst val = translation[key];\n\t\t\tconst mergedPath = propertyPath.length > 0 ? `${propertyPath}.${key}` : key;\n\t\t\tif (Is.string(val)) {\n\t\t\t\tmergedKeys[mergedPath] = val;\n\t\t\t} else if (Is.object<ILocaleDictionary>(val)) {\n\t\t\t\tI18n.flattenTranslationKeys(val, mergedPath, mergedKeys);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of the property names from the message.\n\t * @param message The message to extract the property names from.\n\t * @returns The list of property names.\n\t */\n\tpublic static getPropertyNames(message: string): string[] {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\ttry {\n\t\t\tconst ast = new IntlMessageFormat(message, i18nShared.currentLocale).getAst();\n\t\t\tconst properties = new Set<string>();\n\n\t\t\tI18n.extractPropertiesFromAst(ast, properties);\n\n\t\t\treturn Array.from(properties);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Recursively extract property names from the AST.\n\t * @param node The AST node to process.\n\t * @param properties The set to collect property names.\n\t * @internal\n\t */\n\tprivate static extractPropertiesFromAst(node: unknown, properties: Set<string>): void {\n\t\tif (Is.array(node)) {\n\t\t\tfor (const item of node) {\n\t\t\t\tI18n.extractPropertiesFromAst(item, properties);\n\t\t\t}\n\t\t} else if (Is.object(node)) {\n\t\t\tconst obj = node as { [key: string]: unknown };\n\n\t\t\t// Check for elements that have property names\n\t\t\t// Type 1 = ArgumentElement (simple placeholder like {name})\n\t\t\t// Type 2 = NumberElement ({count, number})\n\t\t\t// Type 3 = DateElement ({date, date, short})\n\t\t\t// Type 4 = TimeElement ({time, time, medium})\n\t\t\t// Type 5 = SelectElement ({gender, select, ...})\n\t\t\t// Type 6 = PluralElement ({count, plural, ...})\n\t\t\tif (\n\t\t\t\t(obj.type === 1 ||\n\t\t\t\t\tobj.type === 2 ||\n\t\t\t\t\tobj.type === 3 ||\n\t\t\t\t\tobj.type === 4 ||\n\t\t\t\t\tobj.type === 5 ||\n\t\t\t\t\tobj.type === 6) &&\n\t\t\t\tIs.string(obj.value)\n\t\t\t) {\n\t\t\t\tproperties.add(obj.value);\n\t\t\t}\n\n\t\t\t// Recursively process all object properties\n\t\t\tfor (const key in obj) {\n\t\t\t\tconst value = obj[key];\n\t\t\t\tif (Is.object(value) || Is.array(value)) {\n\t\t\t\t\tI18n.extractPropertiesFromAst(value, properties);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the I18n shared data.\n\t * @returns The I18n shared data.\n\t * @internal\n\t */\n\tprivate static getI18nShared(): II18nShared {\n\t\tlet i18nShared = SharedStore.get<II18nShared>(\"i18n\");\n\n\t\tif (Is.undefined(i18nShared)) {\n\t\t\ti18nShared = {\n\t\t\t\tlocaleDictionaries: {},\n\t\t\t\tcurrentLocale: I18n.DEFAULT_LOCALE,\n\t\t\t\tlocaleChangedHandlers: {},\n\t\t\t\tdictionaryChangedHandlers: {}\n\t\t\t};\n\t\t\tSharedStore.set<II18nShared>(\"i18n\", i18nShared);\n\t\t}\n\n\t\treturn i18nShared;\n\t}\n}\n"]}
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/utils/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { IntlMessageFormat } from \"intl-messageformat\";\nimport { Is } from \"./is.js\";\nimport { SharedStore } from \"./sharedStore.js\";\nimport type { II18nShared } from \"../models/II18nShared.js\";\nimport type { ILocaleDictionary } from \"../models/ILocaleDictionary.js\";\n\n/**\n * Class to perform internationalization.\n */\nexport class I18n {\n\t/**\n\t * The default translation.\n\t */\n\tpublic static DEFAULT_LOCALE: string = \"en\";\n\n\t/**\n\t * Set the locale.\n\t * @param locale The new locale.\n\t */\n\tpublic static setLocale(locale: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\ti18nShared.currentLocale = locale;\n\n\t\tfor (const callback in i18nShared.localeChangedHandlers) {\n\t\t\ti18nShared.localeChangedHandlers[callback](i18nShared.currentLocale);\n\t\t}\n\t}\n\n\t/**\n\t * Get the locale.\n\t * @returns The current locale.\n\t */\n\tpublic static getLocale(): string {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.currentLocale;\n\t}\n\n\t/**\n\t * Add a locale dictionary.\n\t * @param locale The locale.\n\t * @param dictionary The dictionary to add.\n\t */\n\tpublic static addDictionary(locale: string, dictionary: ILocaleDictionary): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\tconst mergedKeys: { [key: string]: string } = {};\n\t\tI18n.flattenTranslationKeys(dictionary, \"\", mergedKeys);\n\t\ti18nShared.localeDictionaries[locale] = mergedKeys;\n\n\t\tfor (const callback in i18nShared.dictionaryChangedHandlers) {\n\t\t\ti18nShared.dictionaryChangedHandlers[callback](i18nShared.currentLocale);\n\t\t}\n\t}\n\n\t/**\n\t * Get a locale dictionary.\n\t * @param locale The locale.\n\t * @returns The dictionary of undefined if it does not exist.\n\t */\n\tpublic static getDictionary(locale: string): { [key: string]: string } | undefined {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.localeDictionaries[locale];\n\t}\n\n\t/**\n\t * Get all the locale dictionaries.\n\t * @returns The dictionaries.\n\t */\n\tpublic static getAllDictionaries(): {\n\t\t[locale: string]: { [key: string]: string };\n\t} {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn i18nShared.localeDictionaries;\n\t}\n\n\t/**\n\t * Add a locale changed handler.\n\t * @param id The id of the handler.\n\t * @param handler The handler to add.\n\t */\n\tpublic static addLocaleHandler(id: string, handler: (locale: string) => void): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\ti18nShared.localeChangedHandlers[id] = handler;\n\t}\n\n\t/**\n\t * Remove a locale changed handler.\n\t * @param id The id of the handler.\n\t */\n\tpublic static removeLocaleHandler(id: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\tdelete i18nShared.localeChangedHandlers[id];\n\t}\n\n\t/**\n\t * Add a dictionary changed handler.\n\t * @param id The id of the handler.\n\t * @param handler The handler to add.\n\t */\n\tpublic static addDictionaryHandler(id: string, handler: (locale: string) => void): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\ti18nShared.dictionaryChangedHandlers[id] = handler;\n\t}\n\n\t/**\n\t * Remove a dictionary changed handler.\n\t * @param id The id of the handler.\n\t */\n\tpublic static removeDictionaryHandler(id: string): void {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\tdelete i18nShared.dictionaryChangedHandlers[id];\n\t}\n\n\t/**\n\t * Format a message.\n\t * @param key The key of the message to format.\n\t * @param values The values to substitute into the message.\n\t * @param overrideLocale Override the locale.\n\t * @returns The formatted string.\n\t */\n\tpublic static formatMessage(\n\t\tkey: string,\n\t\tvalues?: { [key: string]: unknown },\n\t\toverrideLocale?: string\n\t): string {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\tlet cl = overrideLocale ?? i18nShared.currentLocale;\n\t\tif (cl.startsWith(\"debug-\")) {\n\t\t\tcl = I18n.DEFAULT_LOCALE;\n\t\t}\n\n\t\tif (!i18nShared.localeDictionaries[cl]) {\n\t\t\treturn `!!Missing ${cl}`;\n\t\t}\n\t\tif (!i18nShared.localeDictionaries[cl][key]) {\n\t\t\treturn `!!Missing ${cl}.${key}`;\n\t\t}\n\n\t\tif (i18nShared.currentLocale === \"debug-k\") {\n\t\t\treturn key;\n\t\t}\n\n\t\ttry {\n\t\t\tlet ret = new IntlMessageFormat(i18nShared.localeDictionaries[cl][key], cl).format(\n\t\t\t\tvalues\n\t\t\t) as string;\n\n\t\t\tif (i18nShared.currentLocale === \"debug-x\") {\n\t\t\t\tret = ret.replace(/[a-z]/g, \"x\").replace(/[A-Z]/g, \"x\").replace(/\\d/g, \"n\");\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t} catch {\n\t\t\t// if there is an error the assumption is that one of the properties\n\t\t\t// is undefined, which the formatting library does not like\n\t\t\t// in this case we get all the property names and ensure they are defined\n\t\t\tconst propertyNames = I18n.getPropertyNames(i18nShared.localeDictionaries[cl][key]);\n\t\t\tconst safeValues: { [key: string]: unknown } = values ?? {};\n\n\t\t\tfor (const propertyName of propertyNames) {\n\t\t\t\tsafeValues[propertyName] ??= \"\";\n\t\t\t}\n\n\t\t\t// Format again with the safe values, if it still fails we let the error\n\t\t\t// propagate up as there is nothing more we can do\n\t\t\treturn new IntlMessageFormat(i18nShared.localeDictionaries[cl][key], cl).format(\n\t\t\t\tsafeValues\n\t\t\t) as string;\n\t\t}\n\t}\n\n\t/**\n\t * Check if the dictionaries have a message for the given key.\n\t * @param key The key to check for existence.\n\t * @returns True if the key exists.\n\t */\n\tpublic static hasMessage(key: string): boolean {\n\t\tconst i18nShared = I18n.getI18nShared();\n\t\treturn Is.string(i18nShared.localeDictionaries[i18nShared.currentLocale]?.[key]);\n\t}\n\n\t/**\n\t * Flatten the translation property paths for faster lookup.\n\t * @param translation The translation to merge.\n\t * @param propertyPath The current root path.\n\t * @param mergedKeys The merged keys dictionary to populate.\n\t */\n\tpublic static flattenTranslationKeys(\n\t\ttranslation: ILocaleDictionary,\n\t\tpropertyPath: string,\n\t\tmergedKeys: { [key: string]: string }\n\t): void {\n\t\tfor (const key in translation) {\n\t\t\tconst val = translation[key];\n\t\t\tconst mergedPath = propertyPath.length > 0 ? `${propertyPath}.${key}` : key;\n\t\t\tif (Is.string(val)) {\n\t\t\t\tmergedKeys[mergedPath] = val;\n\t\t\t} else if (Is.object<ILocaleDictionary>(val)) {\n\t\t\t\tI18n.flattenTranslationKeys(val, mergedPath, mergedKeys);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of the property names from the message.\n\t * @param message The message to extract the property names from.\n\t * @returns The list of property names.\n\t */\n\tpublic static getPropertyNames(message: string): string[] {\n\t\tconst i18nShared = I18n.getI18nShared();\n\n\t\ttry {\n\t\t\tconst ast = new IntlMessageFormat(message, i18nShared.currentLocale).getAst();\n\t\t\tconst properties = new Set<string>();\n\n\t\t\tI18n.extractPropertiesFromAst(ast, properties);\n\n\t\t\treturn Array.from(properties);\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Recursively extract property names from the AST.\n\t * @param node The AST node to process.\n\t * @param properties The set to collect property names.\n\t * @internal\n\t */\n\tprivate static extractPropertiesFromAst(node: unknown, properties: Set<string>): void {\n\t\tif (Is.array(node)) {\n\t\t\tfor (const item of node) {\n\t\t\t\tI18n.extractPropertiesFromAst(item, properties);\n\t\t\t}\n\t\t} else if (Is.object(node)) {\n\t\t\tconst obj = node;\n\n\t\t\t// Check for elements that have property names\n\t\t\t// Type 1 = ArgumentElement (simple placeholder like {name})\n\t\t\t// Type 2 = NumberElement ({count, number})\n\t\t\t// Type 3 = DateElement ({date, date, short})\n\t\t\t// Type 4 = TimeElement ({time, time, medium})\n\t\t\t// Type 5 = SelectElement ({gender, select, ...})\n\t\t\t// Type 6 = PluralElement ({count, plural, ...})\n\t\t\tif (\n\t\t\t\t(obj.type === 1 ||\n\t\t\t\t\tobj.type === 2 ||\n\t\t\t\t\tobj.type === 3 ||\n\t\t\t\t\tobj.type === 4 ||\n\t\t\t\t\tobj.type === 5 ||\n\t\t\t\t\tobj.type === 6) &&\n\t\t\t\tIs.string(obj.value)\n\t\t\t) {\n\t\t\t\tproperties.add(obj.value);\n\t\t\t}\n\n\t\t\t// Recursively process all object properties\n\t\t\tfor (const key in obj) {\n\t\t\t\tconst value = obj[key];\n\t\t\t\tif (Is.object(value) || Is.array(value)) {\n\t\t\t\t\tI18n.extractPropertiesFromAst(value, properties);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the I18n shared data.\n\t * @returns The I18n shared data.\n\t * @internal\n\t */\n\tprivate static getI18nShared(): II18nShared {\n\t\tlet i18nShared = SharedStore.get<II18nShared>(\"i18n\");\n\n\t\tif (Is.undefined(i18nShared)) {\n\t\t\ti18nShared = {\n\t\t\t\tlocaleDictionaries: {},\n\t\t\t\tcurrentLocale: I18n.DEFAULT_LOCALE,\n\t\t\t\tlocaleChangedHandlers: {},\n\t\t\t\tdictionaryChangedHandlers: {}\n\t\t\t};\n\t\t\tSharedStore.set<II18nShared>(\"i18n\", i18nShared);\n\t\t}\n\n\t\treturn i18nShared;\n\t}\n}\n"]}
@@ -1,4 +1,3 @@
1
- import type { ObjectOrArray } from "../types/objectOrArray.js";
2
1
  /**
3
2
  * Class to help with arrays.
4
3
  */
@@ -15,11 +14,5 @@ export declare class ArrayHelper {
15
14
  * @param value The object or array to convert.
16
15
  * @returns The array.
17
16
  */
18
- static fromObjectOrArray<T = unknown>(value: undefined): undefined;
19
- /**
20
- * Convert an object or array to an array.
21
- * @param value The object or array to convert.
22
- * @returns The array.
23
- */
24
- static fromObjectOrArray<T = unknown>(value: ObjectOrArray<T>): T[];
17
+ static fromObjectOrArray<T = unknown>(value: T | T[] | undefined): T extends undefined ? undefined : T[];
25
18
  }
@@ -58,8 +58,8 @@ export declare class ObjectHelper {
58
58
  static propertySet(obj: unknown, property: string, value: unknown): void;
59
59
  /**
60
60
  * Delete the property of an unknown object.
61
- * @param obj The object to set the property from.
62
- * @param property The property to set
61
+ * @param obj The object to delete the property from.
62
+ * @param property The property to delete.
63
63
  */
64
64
  static propertyDelete(obj: unknown, property: string): void;
65
65
  /**
@@ -74,26 +74,16 @@ export declare class ObjectHelper {
74
74
  * Pick a subset of properties from an object.
75
75
  * @param obj The object to pick the properties from.
76
76
  * @param keys The property keys to pick.
77
- * @returns The partial object.
77
+ * @returns The picked object, or undefined if the input was undefined.
78
78
  */
79
- static pick<T>(obj: T | undefined, keys?: (keyof T)[]): Partial<T>;
79
+ static pick<T extends object, K extends keyof T>(obj: T | undefined, keys: readonly K[]): T extends undefined ? undefined : Pick<T, K>;
80
80
  /**
81
81
  * Omit a subset of properties from an object.
82
82
  * @param obj The object to omit the properties from.
83
83
  * @param keys The property keys to omit.
84
- * @returns The partial object.
85
- */
86
- static omit<T>(obj: T | undefined, keys?: (keyof T)[]): Partial<T>;
87
- /**
88
- * Split an object into two with the specified keys.
89
- * @param obj The object to split.
90
- * @param keys The property keys to split.
91
- * @returns The two partial objects.
84
+ * @returns The object without the omitted keys, or undefined if the input was undefined.
92
85
  */
93
- static split<T>(obj: T | undefined, keys?: (keyof T)[]): {
94
- picked: Partial<T> | undefined;
95
- omitted: Partial<T> | undefined;
96
- };
86
+ static omit<T, K extends keyof T>(obj: T | undefined, keys: readonly K[]): T extends undefined ? undefined : Omit<T, K>;
97
87
  /**
98
88
  * Converter the non JSON primitives to extended types.
99
89
  * @param obj The object to convert.
@@ -14,6 +14,12 @@ export declare class StringHelper {
14
14
  * @returns The trimmed string or the original.
15
15
  */
16
16
  static trimLeadingSlashes(value: string): string;
17
+ /**
18
+ * Trim both leading and trailing slashes from a string.
19
+ * @param value The value to trim.
20
+ * @returns The trimmed string or the original.
21
+ */
22
+ static trimLeadingAndTrailingSlashes(value: string): string;
17
23
  /**
18
24
  * Convert the input string to kebab case.
19
25
  * @param input The input to convert.
package/docs/changelog.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.39](https://github.com/iotaledger/twin-framework/compare/core-v0.0.3-next.38...core-v0.0.3-next.39) (2026-05-13)
4
+
5
+
6
+ ### Features
7
+
8
+ * improve signatures ([cdd24be](https://github.com/iotaledger/twin-framework/commit/cdd24be6fb898d33955b6f2f93c3ddbd73582269))
9
+ * improve signatures ([2041ae2](https://github.com/iotaledger/twin-framework/commit/2041ae214cbd8d472d5e8be8d3403cd06a114040))
10
+ * improve signatures ([d8a0ee1](https://github.com/iotaledger/twin-framework/commit/d8a0ee16542134a3f8b0653065239f42045125b4))
11
+ * improve signatures ([1d084c5](https://github.com/iotaledger/twin-framework/commit/1d084c58c7eb41ae50b0ce80ce57e48a22dd3102))
12
+ * improve signatures ([#287](https://github.com/iotaledger/twin-framework/issues/287)) ([c9f38f0](https://github.com/iotaledger/twin-framework/commit/c9f38f00e1cea8759e1105b41872a650c66c00f4))
13
+
14
+
15
+ ### Dependencies
16
+
17
+ * The following workspace dependencies were updated
18
+ * dependencies
19
+ * @twin.org/nameof bumped from 0.0.3-next.38 to 0.0.3-next.39
20
+ * devDependencies
21
+ * @twin.org/nameof-transformer bumped from 0.0.3-next.38 to 0.0.3-next.39
22
+ * @twin.org/nameof-vitest-plugin bumped from 0.0.3-next.38 to 0.0.3-next.39
23
+
24
+ ## [0.0.3-next.38](https://github.com/iotaledger/twin-framework/compare/core-v0.0.3-next.37...core-v0.0.3-next.38) (2026-05-11)
25
+
26
+
27
+ ### Features
28
+
29
+ * typescript 6 update ([1d10f31](https://github.com/iotaledger/twin-framework/commit/1d10f31e6516ec622773f45e88af82fe749b384a))
30
+
31
+
32
+ ### Dependencies
33
+
34
+ * The following workspace dependencies were updated
35
+ * dependencies
36
+ * @twin.org/nameof bumped from 0.0.3-next.37 to 0.0.3-next.38
37
+ * devDependencies
38
+ * @twin.org/nameof-transformer bumped from 0.0.3-next.37 to 0.0.3-next.38
39
+ * @twin.org/nameof-vitest-plugin bumped from 0.0.3-next.37 to 0.0.3-next.38
40
+
3
41
  ## [0.0.3-next.37](https://github.com/iotaledger/twin-framework/compare/core-v0.0.3-next.36...core-v0.0.3-next.37) (2026-05-07)
4
42
 
5
43
 
@@ -44,60 +44,26 @@ True if both arrays are empty of have the same values.
44
44
 
45
45
  ### fromObjectOrArray() {#fromobjectorarray}
46
46
 
47
- Convert an object or array to an array.
48
-
49
- #### Param
50
-
51
- The object or array to convert.
52
-
53
- #### Call Signature
54
-
55
- > `static` **fromObjectOrArray**\<`T`\>(`value`): `undefined`
47
+ > `static` **fromObjectOrArray**\<`T`\>(`value`): `T` *extends* `undefined` ? `undefined` : `T`[]
56
48
 
57
49
  Convert an object or array to an array.
58
50
 
59
- ##### Type Parameters
51
+ #### Type Parameters
60
52
 
61
- ###### T
53
+ ##### T
62
54
 
63
55
  `T` = `unknown`
64
56
 
65
- ##### Parameters
66
-
67
- ###### value
68
-
69
- `undefined`
70
-
71
- The object or array to convert.
72
-
73
- ##### Returns
74
-
75
- `undefined`
76
-
77
- The array.
78
-
79
- #### Call Signature
80
-
81
- > `static` **fromObjectOrArray**\<`T`\>(`value`): `T`[]
82
-
83
- Convert an object or array to an array.
84
-
85
- ##### Type Parameters
86
-
87
- ###### T
88
-
89
- `T` = `unknown`
90
-
91
- ##### Parameters
57
+ #### Parameters
92
58
 
93
- ###### value
59
+ ##### value
94
60
 
95
- [`ObjectOrArray`](../type-aliases/ObjectOrArray.md)\<`T`\>
61
+ `T` \| `T`[] \| `undefined`
96
62
 
97
63
  The object or array to convert.
98
64
 
99
- ##### Returns
65
+ #### Returns
100
66
 
101
- `T`[]
67
+ `T` *extends* `undefined` ? `undefined` : `T`[]
102
68
 
103
69
  The array.
@@ -276,13 +276,13 @@ Delete the property of an unknown object.
276
276
 
277
277
  `unknown`
278
278
 
279
- The object to set the property from.
279
+ The object to delete the property from.
280
280
 
281
281
  ##### property
282
282
 
283
283
  `string`
284
284
 
285
- The property to set
285
+ The property to delete.
286
286
 
287
287
  #### Returns
288
288
 
@@ -332,7 +332,7 @@ The property if available.
332
332
 
333
333
  ### pick() {#pick}
334
334
 
335
- > `static` **pick**\<`T`\>(`obj`, `keys?`): `Partial`\<`T`\>
335
+ > `static` **pick**\<`T`, `K`\>(`obj`, `keys`): `T` *extends* `undefined` ? `undefined` : `Pick`\<`T`, `K`\>
336
336
 
337
337
  Pick a subset of properties from an object.
338
338
 
@@ -340,7 +340,11 @@ Pick a subset of properties from an object.
340
340
 
341
341
  ##### T
342
342
 
343
- `T`
343
+ `T` *extends* `object`
344
+
345
+ ##### K
346
+
347
+ `K` *extends* `string` \| `number` \| `symbol`
344
348
 
345
349
  #### Parameters
346
350
 
@@ -350,23 +354,23 @@ Pick a subset of properties from an object.
350
354
 
351
355
  The object to pick the properties from.
352
356
 
353
- ##### keys?
357
+ ##### keys
354
358
 
355
- keyof `T`[]
359
+ readonly `K`[]
356
360
 
357
361
  The property keys to pick.
358
362
 
359
363
  #### Returns
360
364
 
361
- `Partial`\<`T`\>
365
+ `T` *extends* `undefined` ? `undefined` : `Pick`\<`T`, `K`\>
362
366
 
363
- The partial object.
367
+ The picked object, or undefined if the input was undefined.
364
368
 
365
369
  ***
366
370
 
367
371
  ### omit() {#omit}
368
372
 
369
- > `static` **omit**\<`T`\>(`obj`, `keys?`): `Partial`\<`T`\>
373
+ > `static` **omit**\<`T`, `K`\>(`obj`, `keys`): `T` *extends* `undefined` ? `undefined` : `Omit`\<`T`, `K`\>
370
374
 
371
375
  Omit a subset of properties from an object.
372
376
 
@@ -376,39 +380,9 @@ Omit a subset of properties from an object.
376
380
 
377
381
  `T`
378
382
 
379
- #### Parameters
380
-
381
- ##### obj
382
-
383
- `T` \| `undefined`
384
-
385
- The object to omit the properties from.
386
-
387
- ##### keys?
388
-
389
- keyof `T`[]
390
-
391
- The property keys to omit.
392
-
393
- #### Returns
394
-
395
- `Partial`\<`T`\>
383
+ ##### K
396
384
 
397
- The partial object.
398
-
399
- ***
400
-
401
- ### split() {#split}
402
-
403
- > `static` **split**\<`T`\>(`obj`, `keys?`): `object`
404
-
405
- Split an object into two with the specified keys.
406
-
407
- #### Type Parameters
408
-
409
- ##### T
410
-
411
- `T`
385
+ `K` *extends* `string` \| `number` \| `symbol`
412
386
 
413
387
  #### Parameters
414
388
 
@@ -416,27 +390,19 @@ Split an object into two with the specified keys.
416
390
 
417
391
  `T` \| `undefined`
418
392
 
419
- The object to split.
393
+ The object to omit the properties from.
420
394
 
421
- ##### keys?
395
+ ##### keys
422
396
 
423
- keyof `T`[]
397
+ readonly `K`[]
424
398
 
425
- The property keys to split.
399
+ The property keys to omit.
426
400
 
427
401
  #### Returns
428
402
 
429
- `object`
430
-
431
- The two partial objects.
432
-
433
- ##### picked
434
-
435
- > **picked**: `Partial`\<`T`\> \| `undefined`
436
-
437
- ##### omitted
403
+ `T` *extends* `undefined` ? `undefined` : `Omit`\<`T`, `K`\>
438
404
 
439
- > **omitted**: `Partial`\<`T`\> \| `undefined`
405
+ The object without the omitted keys, or undefined if the input was undefined.
440
406
 
441
407
  ***
442
408
 
@@ -58,6 +58,28 @@ The trimmed string or the original.
58
58
 
59
59
  ***
60
60
 
61
+ ### trimLeadingAndTrailingSlashes() {#trimleadingandtrailingslashes}
62
+
63
+ > `static` **trimLeadingAndTrailingSlashes**(`value`): `string`
64
+
65
+ Trim both leading and trailing slashes from a string.
66
+
67
+ #### Parameters
68
+
69
+ ##### value
70
+
71
+ `string`
72
+
73
+ The value to trim.
74
+
75
+ #### Returns
76
+
77
+ `string`
78
+
79
+ The trimmed string or the original.
80
+
81
+ ***
82
+
61
83
  ### kebabCase() {#kebabcase}
62
84
 
63
85
  > `static` **kebabCase**(`input`, `stripInterfacePrefix?`): `string`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/core",
3
- "version": "0.0.3-next.37",
3
+ "version": "0.0.3-next.39",
4
4
  "description": "Helper methods/classes for data type checking/validation/guarding/error handling",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,8 +14,8 @@
14
14
  "node": ">=20.0.0"
15
15
  },
16
16
  "dependencies": {
17
- "@twin.org/nameof": "0.0.3-next.37",
18
- "intl-messageformat": "11.2.0",
17
+ "@twin.org/nameof": "0.0.3-next.39",
18
+ "intl-messageformat": "11.2.4",
19
19
  "rfc6902": "5.2.0"
20
20
  },
21
21
  "main": "./dist/es/index.js",