ts-packages 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/cache/README.md +105 -9
- package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.js +75 -281
- package/packages/cache/dist/cjs/adapters/memory/MemoryCache.js +76 -22
- package/packages/cache/dist/cjs/adapters/redis/RedisCache.js +84 -26
- package/packages/cache/dist/cjs/core/BaseCache.js +13 -4
- package/packages/cache/dist/cjs/core/factory.js +26 -4
- package/packages/cache/dist/cjs/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/cjs/errors/CacheError.js +6 -11
- package/packages/cache/dist/cjs/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/dist/cjs/errors/cacheErrorCodes.js +24 -0
- package/packages/cache/dist/cjs/errors/index.js +3 -0
- package/packages/cache/dist/cjs/middleware/express/cacheMiddleware.js +8 -8
- package/packages/cache/dist/cjs/session/SessionStore.js +84 -28
- package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.js +75 -281
- package/packages/cache/dist/esm/adapters/memory/MemoryCache.js +76 -22
- package/packages/cache/dist/esm/adapters/redis/RedisCache.js +84 -26
- package/packages/cache/dist/esm/core/BaseCache.js +13 -4
- package/packages/cache/dist/esm/core/factory.js +26 -4
- package/packages/cache/dist/esm/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/esm/errors/CacheError.js +6 -11
- package/packages/cache/dist/esm/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/dist/esm/errors/cacheErrorCodes.js +21 -0
- package/packages/cache/dist/esm/errors/index.js +3 -0
- package/packages/cache/dist/esm/middleware/express/cacheMiddleware.js +8 -8
- package/packages/cache/dist/esm/session/SessionStore.js +84 -28
- package/packages/cache/dist/types/adapters/memcache/MemcacheCache.d.ts +1 -54
- package/packages/cache/dist/types/errors/CacheError.d.ts +10 -7
- package/packages/cache/dist/types/errors/cacheErrorCodes.d.ts +22 -0
- package/packages/cache/package.json +8 -6
- package/packages/cache/src/adapters/memcache/MemcacheCache.ts +79 -352
- package/packages/cache/src/adapters/memory/MemoryCache.ts +76 -77
- package/packages/cache/src/adapters/redis/RedisCache.ts +84 -86
- package/packages/cache/src/core/BaseCache.ts +13 -14
- package/packages/cache/src/core/factory.ts +27 -16
- package/packages/cache/src/errors/CacheError.ts +16 -17
- package/packages/cache/src/errors/cacheErrorCodes.ts +24 -0
- package/packages/cache/src/errors/index.ts +5 -0
- package/packages/cache/src/middleware/express/cacheMiddleware.ts +8 -8
- package/packages/cache/src/session/SessionStore.ts +84 -84
- package/packages/errors-utils/README.md +54 -57
- package/packages/errors-utils/dist/cjs/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/cjs/constants/errorCodes.js +57 -22
- package/packages/errors-utils/dist/cjs/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/cjs/constants/errorMessages.js +72 -29
- package/packages/errors-utils/dist/cjs/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/AppError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.js +11 -0
- package/packages/errors-utils/dist/cjs/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenExpiredError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/error/TokenMalformedError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/cjs/error/UnauthorizedError.js +2 -2
- package/packages/errors-utils/dist/cjs/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/cjs/error/index.js +39 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.js +63 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/cjs/errorRegistry/index.js +6 -0
- package/packages/errors-utils/dist/cjs/index.d.ts +3 -9
- package/packages/errors-utils/dist/cjs/index.js +12 -9
- package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.js → errorHandler.middleware.js} +4 -4
- package/packages/errors-utils/dist/cjs/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/dist/cjs/middleware/express/index.js +2 -2
- package/packages/errors-utils/dist/esm/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/esm/constants/errorCodes.js +57 -22
- package/packages/errors-utils/dist/esm/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/esm/constants/errorMessages.js +72 -29
- package/packages/errors-utils/dist/esm/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/AppError.js +2 -2
- package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.js +7 -0
- package/packages/errors-utils/dist/esm/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/TokenExpiredError.js +2 -2
- package/packages/errors-utils/dist/esm/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/esm/error/TokenMalformedError.js +2 -2
- package/packages/errors-utils/dist/esm/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/esm/error/UnauthorizedError.js +2 -2
- package/packages/errors-utils/dist/esm/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/esm/error/index.js +23 -0
- package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.js +59 -0
- package/packages/errors-utils/dist/esm/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/esm/errorRegistry/index.js +3 -0
- package/packages/errors-utils/dist/esm/index.d.ts +3 -9
- package/packages/errors-utils/dist/esm/index.js +12 -9
- package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.js → errorHandler.middleware.js} +5 -5
- package/packages/errors-utils/dist/esm/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/dist/esm/middleware/express/index.js +2 -2
- package/packages/errors-utils/dist/types/constants/errorCodes.d.ts +28 -23
- package/packages/errors-utils/dist/types/constants/errorMessages.d.ts +8 -1
- package/packages/errors-utils/dist/types/error/AppError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/ServiceUnavailableError.d.ts +4 -0
- package/packages/errors-utils/dist/types/error/TokenExpiredError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/TokenMalformedError.d.ts +2 -2
- package/packages/errors-utils/dist/types/error/UnauthorizedError.d.ts +1 -2
- package/packages/errors-utils/dist/types/error/index.d.ts +14 -0
- package/packages/errors-utils/dist/types/errorRegistry/errorRegistry.d.ts +19 -0
- package/packages/errors-utils/dist/types/errorRegistry/index.d.ts +3 -0
- package/packages/errors-utils/dist/types/index.d.ts +3 -9
- package/packages/errors-utils/dist/types/middleware/express/index.d.ts +2 -2
- package/packages/errors-utils/package.json +4 -4
- package/packages/errors-utils/src/constants/errorCodes.ts +64 -23
- package/packages/errors-utils/src/constants/errorMessages.ts +91 -34
- package/packages/errors-utils/src/error/AppError.ts +3 -2
- package/packages/errors-utils/src/error/ServiceUnavailableError.ts +8 -0
- package/packages/errors-utils/src/error/TokenExpiredError.ts +2 -2
- package/packages/errors-utils/src/error/TokenMalformedError.ts +2 -2
- package/packages/errors-utils/src/error/UnauthorizedError.ts +8 -8
- package/packages/errors-utils/src/error/index.ts +26 -0
- package/packages/errors-utils/src/errorRegistry/errorRegistry.ts +74 -0
- package/packages/errors-utils/src/errorRegistry/index.ts +4 -0
- package/packages/errors-utils/src/index.ts +12 -10
- package/packages/errors-utils/src/middleware/express/{errorHandler.ts → errorHandler.middleware.ts} +5 -5
- package/packages/errors-utils/src/middleware/express/index.ts +2 -2
- package/packages/js-extensions/README.md +174 -425
- package/packages/js-extensions/dist/cjs/array/array-extensions.js +84 -50
- package/packages/js-extensions/dist/cjs/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/core/performance.js +6 -0
- package/packages/js-extensions/dist/cjs/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/core/version.js +9 -0
- package/packages/js-extensions/dist/cjs/index.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/index.js +1 -0
- package/packages/js-extensions/dist/cjs/number/number-extensions.js +85 -97
- package/packages/js-extensions/dist/cjs/object/object-extensions.js +102 -103
- package/packages/js-extensions/dist/cjs/string/string-extensions.js +66 -43
- package/packages/js-extensions/dist/cjs/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/defineExtension.js +13 -0
- package/packages/js-extensions/dist/cjs/utils/index.d.ts +1 -0
- package/packages/js-extensions/dist/cjs/utils/index.js +1 -0
- package/packages/js-extensions/dist/esm/array/array-extensions.js +84 -50
- package/packages/js-extensions/dist/esm/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/esm/core/performance.js +5 -0
- package/packages/js-extensions/dist/esm/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/esm/core/version.js +5 -0
- package/packages/js-extensions/dist/esm/index.d.ts +1 -0
- package/packages/js-extensions/dist/esm/index.js +1 -0
- package/packages/js-extensions/dist/esm/number/number-extensions.js +86 -98
- package/packages/js-extensions/dist/esm/object/object-extensions.js +102 -103
- package/packages/js-extensions/dist/esm/string/string-extensions.js +66 -43
- package/packages/js-extensions/dist/esm/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/defineExtension.js +10 -0
- package/packages/js-extensions/dist/esm/utils/index.d.ts +1 -0
- package/packages/js-extensions/dist/esm/utils/index.js +1 -0
- package/packages/js-extensions/dist/types/core/performance.d.ts +1 -0
- package/packages/js-extensions/dist/types/core/version.d.ts +1 -0
- package/packages/js-extensions/dist/types/index.d.ts +1 -0
- package/packages/js-extensions/dist/types/types/global-augmentations.d.ts +1 -0
- package/packages/js-extensions/dist/types/utils/defineExtension.d.ts +1 -0
- package/packages/js-extensions/dist/types/utils/index.d.ts +1 -0
- package/packages/js-extensions/package.json +8 -4
- package/packages/js-extensions/src/array/array-extensions.ts +268 -150
- package/packages/js-extensions/src/core/performance.ts +11 -0
- package/packages/js-extensions/src/core/version.ts +7 -0
- package/packages/js-extensions/src/index.ts +2 -0
- package/packages/js-extensions/src/number/number-extensions.ts +90 -123
- package/packages/js-extensions/src/object/object-extensions.ts +102 -130
- package/packages/js-extensions/src/string/string-extensions.ts +80 -76
- package/packages/js-extensions/src/types/global-augmentations.ts +2 -1
- package/packages/js-extensions/src/utils/defineExtension.ts +14 -0
- package/packages/js-extensions/src/utils/index.ts +1 -0
- package/packages/response-utils/README.md +156 -198
- package/packages/response-utils/dist/cjs/core/BaseResponder.js +20 -4
- package/packages/response-utils/dist/cjs/index.d.ts +0 -1
- package/packages/response-utils/dist/cjs/index.js +1 -25
- package/packages/response-utils/dist/esm/core/BaseResponder.js +20 -4
- package/packages/response-utils/dist/esm/index.d.ts +0 -1
- package/packages/response-utils/dist/esm/index.js +0 -2
- package/packages/response-utils/dist/types/index.d.ts +0 -1
- package/packages/response-utils/package.json +1 -1
- package/packages/response-utils/src/core/BaseResponder.ts +25 -4
- package/packages/response-utils/src/index.ts +0 -3
- package/packages/response-utils/src/middleware/express/expressMiddleware.ts +1 -1
- package/packages/security/README.md +153 -355
- package/packages/security/dist/cjs/core/crypto/cryptoManager.js +34 -17
- package/packages/security/dist/cjs/core/jwt/decode.js +4 -1
- package/packages/security/dist/cjs/core/jwt/generateTokens.js +4 -1
- package/packages/security/dist/cjs/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/cjs/core/jwt/jwtManager.js +84 -199
- package/packages/security/dist/cjs/core/jwt/parseDuration.js +3 -2
- package/packages/security/dist/cjs/core/jwt/signToken.js +2 -1
- package/packages/security/dist/cjs/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/cjs/core/jwt/validateToken.js +19 -10
- package/packages/security/dist/cjs/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/cjs/core/jwt/verify.js +59 -14
- package/packages/security/dist/cjs/core/password/hash.js +4 -4
- package/packages/security/dist/cjs/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/cjs/core/password/passwordManager.js +36 -80
- package/packages/security/dist/cjs/core/password/strength.js +12 -6
- package/packages/security/dist/cjs/core/password/utils.d.ts +12 -0
- package/packages/security/dist/cjs/core/password/utils.js +16 -1
- package/packages/security/dist/cjs/core/password/verify.js +4 -4
- package/packages/security/dist/cjs/index.d.ts +2 -7
- package/packages/security/dist/esm/core/crypto/cryptoManager.js +34 -17
- package/packages/security/dist/esm/core/jwt/decode.js +4 -1
- package/packages/security/dist/esm/core/jwt/generateTokens.js +4 -1
- package/packages/security/dist/esm/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/esm/core/jwt/jwtManager.js +85 -200
- package/packages/security/dist/esm/core/jwt/parseDuration.js +3 -2
- package/packages/security/dist/esm/core/jwt/signToken.js +2 -1
- package/packages/security/dist/esm/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/esm/core/jwt/validateToken.js +19 -10
- package/packages/security/dist/esm/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/esm/core/jwt/verify.js +58 -13
- package/packages/security/dist/esm/core/password/hash.js +4 -4
- package/packages/security/dist/esm/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/esm/core/password/passwordManager.js +36 -80
- package/packages/security/dist/esm/core/password/strength.js +12 -6
- package/packages/security/dist/esm/core/password/utils.d.ts +12 -0
- package/packages/security/dist/esm/core/password/utils.js +16 -1
- package/packages/security/dist/esm/core/password/verify.js +4 -4
- package/packages/security/dist/esm/index.d.ts +2 -7
- package/packages/security/dist/types/core/jwt/jwtManager.d.ts +19 -43
- package/packages/security/dist/types/core/jwt/validateToken.d.ts +10 -7
- package/packages/security/dist/types/core/jwt/verify.d.ts +8 -9
- package/packages/security/dist/types/core/password/passwordManager.d.ts +1 -1
- package/packages/security/dist/types/core/password/utils.d.ts +12 -0
- package/packages/security/dist/types/index.d.ts +2 -7
- package/packages/security/package.json +3 -3
- package/packages/security/src/core/crypto/cryptoManager.ts +53 -21
- package/packages/security/src/core/jwt/decode.ts +4 -1
- package/packages/security/src/core/jwt/generateTokens.ts +4 -1
- package/packages/security/src/core/jwt/jwtManager.ts +105 -257
- package/packages/security/src/core/jwt/parseDuration.ts +4 -2
- package/packages/security/src/core/jwt/signToken.ts +2 -1
- package/packages/security/src/core/jwt/validateToken.ts +21 -13
- package/packages/security/src/core/jwt/verify.ts +82 -20
- package/packages/security/src/core/password/hash.ts +10 -4
- package/packages/security/src/core/password/passwordManager.ts +38 -108
- package/packages/security/src/core/password/strength.ts +13 -8
- package/packages/security/src/core/password/utils.ts +19 -3
- package/packages/security/src/core/password/verify.ts +6 -4
- package/packages/server-utils/README.md +1 -1
- package/packages/server-utils/dist/cjs/core/server.js +6 -6
- package/packages/server-utils/dist/cjs/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/cjs/middleware/auth.middleware.js +17 -14
- package/packages/server-utils/dist/cjs/middleware/cache.middleware.js +2 -2
- package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.js +34 -17
- package/packages/server-utils/dist/cjs/middleware/session.middleware.js +8 -8
- package/packages/server-utils/dist/cjs/middleware/validation.middleware.js +2 -2
- package/packages/server-utils/dist/esm/core/server.js +6 -6
- package/packages/server-utils/dist/esm/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/esm/middleware/auth.middleware.js +18 -15
- package/packages/server-utils/dist/esm/middleware/cache.middleware.js +2 -2
- package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.js +34 -17
- package/packages/server-utils/dist/esm/middleware/session.middleware.js +8 -8
- package/packages/server-utils/dist/esm/middleware/validation.middleware.js +2 -2
- package/packages/server-utils/dist/types/middleware/auth.middleware.d.ts +1 -2
- package/packages/server-utils/dist/types/middleware/errorHandler.middleware.d.ts +1 -1
- package/packages/server-utils/package.json +4 -4
- package/packages/server-utils/src/core/server.ts +6 -6
- package/packages/server-utils/src/middleware/auth.middleware.ts +40 -27
- package/packages/server-utils/src/middleware/cache.middleware.ts +2 -2
- package/packages/server-utils/src/middleware/errorHandler.middleware.ts +39 -24
- package/packages/server-utils/src/middleware/session.middleware.ts +11 -8
- package/packages/server-utils/src/middleware/validation.middleware.ts +2 -3
- package/packages/errors-utils/dist/cjs/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/cjs/error/RateLimitError.js +0 -11
- package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.js +0 -27
- package/packages/errors-utils/dist/esm/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/esm/error/RateLimitError.js +0 -7
- package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.js +0 -24
- package/packages/errors-utils/dist/types/error/RateLimitError.d.ts +0 -4
- package/packages/errors-utils/dist/types/utils/mapAppErrorToResponder.d.ts +0 -3
- package/packages/errors-utils/src/error/RateLimitError.ts +0 -8
- package/packages/errors-utils/src/utils/mapAppErrorToResponder.ts +0 -38
- package/packages/response-utils/src/legacy.ts +0 -30
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
- /package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
- /package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/types/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
- /package/packages/errors-utils/dist/types/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
- /package/packages/errors-utils/src/middleware/express/{errorConverter.ts → errorConverter.middleware.ts} +0 -0
|
@@ -1,99 +1,70 @@
|
|
|
1
|
-
|
|
2
|
-
import { withCache } from '../core/performance'
|
|
1
|
+
import { defineExtension } from 'src/utils'
|
|
2
|
+
import { makeInternalCacheKey, withCache } from '../core/performance'
|
|
3
|
+
|
|
4
|
+
let numberExtended = false
|
|
3
5
|
|
|
4
6
|
export function extendNumber() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
locale = 'en-US',
|
|
12
|
-
): string {
|
|
13
|
-
return new Intl.NumberFormat(locale, {
|
|
14
|
-
style: 'currency',
|
|
15
|
-
currency,
|
|
16
|
-
}).format(this.valueOf())
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
Number.prototype.clamp = function (min: number, max: number): number {
|
|
20
|
-
if (min > max) {
|
|
21
|
-
throw new RangeError(
|
|
22
|
-
`clamp: min (${min}) cannot be greater than max (${max})`,
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
return Math.min(Math.max(this.valueOf(), min), max)
|
|
26
|
-
}
|
|
7
|
+
if (numberExtended) return
|
|
8
|
+
numberExtended = true
|
|
9
|
+
|
|
10
|
+
defineExtension(Number.prototype, 'toPercent', function (this: number, decimals = 2): string {
|
|
11
|
+
return `${(this * 100).toFixed(decimals)}%`
|
|
12
|
+
})
|
|
27
13
|
|
|
28
|
-
Number.prototype
|
|
29
|
-
return
|
|
30
|
-
}
|
|
14
|
+
defineExtension(Number.prototype, 'toCurrency', function (this: number, currency = 'USD', locale = 'en-US'): string {
|
|
15
|
+
return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(this)
|
|
16
|
+
})
|
|
31
17
|
|
|
32
|
-
Number.prototype
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
defineExtension(Number.prototype, 'clamp', function (this: number, min: number, max: number): number {
|
|
19
|
+
if (min > max) throw new RangeError(`clamp: min (${min}) cannot be greater than max (${max})`)
|
|
20
|
+
return Math.min(Math.max(this, min), max)
|
|
21
|
+
})
|
|
35
22
|
|
|
36
|
-
Number.prototype
|
|
37
|
-
|
|
38
|
-
|
|
23
|
+
defineExtension(Number.prototype, 'isEven', function (this: number): boolean {
|
|
24
|
+
return this % 2 === 0
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
defineExtension(Number.prototype, 'isOdd', function (this: number): boolean {
|
|
28
|
+
return this % 2 !== 0
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
defineExtension(Number.prototype, 'isPrime', function (this: number): boolean {
|
|
32
|
+
const num = this
|
|
33
|
+
return withCache(makeInternalCacheKey('prime', num), () => {
|
|
39
34
|
if (num < 2) return false
|
|
40
|
-
for (let i = 2; i <= Math.sqrt(num); i++)
|
|
41
|
-
if (num % i === 0) return false
|
|
42
|
-
}
|
|
35
|
+
for (let i = 2; i <= Math.sqrt(num); i++) if (num % i === 0) return false
|
|
43
36
|
return true
|
|
44
37
|
})
|
|
45
|
-
}
|
|
38
|
+
})
|
|
46
39
|
|
|
47
|
-
Number.prototype
|
|
48
|
-
const num = Math.floor(this
|
|
49
|
-
return withCache(
|
|
50
|
-
if (num < 0) return
|
|
51
|
-
if (num
|
|
40
|
+
defineExtension(Number.prototype, 'factorial', function (this: number): number {
|
|
41
|
+
const num = Math.floor(this)
|
|
42
|
+
return withCache(makeInternalCacheKey('factorial', num), () => {
|
|
43
|
+
if (num < 0) return NaN
|
|
44
|
+
if (num <= 1) return 1
|
|
52
45
|
let result = 1
|
|
53
|
-
for (let i = 2; i <= num; i++)
|
|
54
|
-
result *= i
|
|
55
|
-
}
|
|
46
|
+
for (let i = 2; i <= num; i++) result *= i
|
|
56
47
|
return result
|
|
57
48
|
})
|
|
58
|
-
}
|
|
49
|
+
})
|
|
59
50
|
|
|
60
|
-
Number.prototype
|
|
61
|
-
const num = Math.floor(this
|
|
51
|
+
defineExtension(Number.prototype, 'toOrdinal', function (this: number): string {
|
|
52
|
+
const num = Math.floor(this)
|
|
62
53
|
const suffix = ['th', 'st', 'nd', 'rd']
|
|
63
54
|
const v = num % 100
|
|
64
55
|
return num + (suffix[(v - 20) % 10] || suffix[v] || suffix[0])
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
Number.prototype.toRoman = function (): string {
|
|
68
|
-
const num = Math.floor(this.valueOf())
|
|
56
|
+
})
|
|
69
57
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (num >= 4000) {
|
|
75
|
-
throw new RangeError('toRoman: number must be less than 4000')
|
|
76
|
-
}
|
|
58
|
+
defineExtension(Number.prototype, 'toRoman', function (this: number): string {
|
|
59
|
+
const num = Math.floor(this)
|
|
60
|
+
if (num <= 0) throw new RangeError('toRoman: number must be positive')
|
|
61
|
+
if (num >= 4000) throw new RangeError('toRoman: number must be less than 4000')
|
|
77
62
|
|
|
78
|
-
return withCache(
|
|
63
|
+
return withCache(makeInternalCacheKey('roman', num), () => {
|
|
79
64
|
const values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
|
|
80
|
-
const symbols = [
|
|
81
|
-
'M',
|
|
82
|
-
'CM',
|
|
83
|
-
'D',
|
|
84
|
-
'CD',
|
|
85
|
-
'C',
|
|
86
|
-
'XC',
|
|
87
|
-
'L',
|
|
88
|
-
'XL',
|
|
89
|
-
'X',
|
|
90
|
-
'IX',
|
|
91
|
-
'V',
|
|
92
|
-
'IV',
|
|
93
|
-
'I',
|
|
94
|
-
]
|
|
95
|
-
let result = ''
|
|
65
|
+
const symbols = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
|
|
96
66
|
let n = num
|
|
67
|
+
let result = ''
|
|
97
68
|
for (let i = 0; i < values.length; i++) {
|
|
98
69
|
while (n >= values[i]) {
|
|
99
70
|
result += symbols[i]
|
|
@@ -102,61 +73,57 @@ export function extendNumber() {
|
|
|
102
73
|
}
|
|
103
74
|
return result
|
|
104
75
|
})
|
|
105
|
-
}
|
|
76
|
+
})
|
|
106
77
|
|
|
107
|
-
Number.prototype
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
78
|
+
defineExtension(Number.prototype, 'inRange', function (this: number, min: number, max: number): boolean {
|
|
79
|
+
return this >= min && this <= max
|
|
80
|
+
})
|
|
111
81
|
|
|
112
|
-
Number.prototype
|
|
113
|
-
if (!Number.isInteger(decimals) || decimals < 0)
|
|
114
|
-
throw new TypeError(
|
|
115
|
-
`round: decimals must be a non-negative integer, got ${decimals}`,
|
|
116
|
-
)
|
|
117
|
-
}
|
|
82
|
+
defineExtension(Number.prototype, 'round', function (this: number, decimals = 0): number {
|
|
83
|
+
if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('round: decimals must be non-negative integer')
|
|
118
84
|
const factor = Math.pow(10, decimals)
|
|
119
|
-
return Math.round(this
|
|
120
|
-
}
|
|
85
|
+
return Math.round(this * factor) / factor
|
|
86
|
+
})
|
|
121
87
|
|
|
122
|
-
Number.prototype
|
|
123
|
-
if (!Number.isInteger(decimals) || decimals < 0)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
88
|
+
defineExtension(Number.prototype, 'ceil', function (this: number, decimals = 0): number {
|
|
89
|
+
if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('ceil: decimals must be non-negative integer')
|
|
90
|
+
const factor = Math.pow(10, decimals)
|
|
91
|
+
return Math.ceil(this * factor) / factor
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
defineExtension(Number.prototype, 'floor', function (this: number, decimals = 0): number {
|
|
95
|
+
if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('floor: decimals must be non-negative integer')
|
|
128
96
|
const factor = Math.pow(10, decimals)
|
|
129
|
-
return Math.
|
|
130
|
-
}
|
|
97
|
+
return Math.floor(this * factor) / factor
|
|
98
|
+
})
|
|
131
99
|
|
|
132
|
-
Number.prototype
|
|
100
|
+
defineExtension(Number.prototype, 'abs', function (this: number): number {
|
|
101
|
+
return Math.abs(this)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
defineExtension(Number.prototype, 'sign', function (this: number): number {
|
|
105
|
+
return Math.sign(this)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
defineExtension(Number.prototype, 'times', function (this: number, callback: (index: number) => void): void {
|
|
109
|
+
if (typeof callback !== 'function') throw new TypeError('times: callback must be a function')
|
|
110
|
+
for (let i = 0; i < Math.floor(this); i++) callback(i)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
defineExtension(Number.prototype, 'toFixedNumber', function (this: number, decimals = 0): number {
|
|
133
114
|
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
134
|
-
throw new TypeError(
|
|
135
|
-
`floor: decimals must be a non-negative integer, got ${decimals}`,
|
|
136
|
-
)
|
|
115
|
+
throw new TypeError(`toFixedNumber: decimals must be a non-negative integer, got ${decimals}`);
|
|
137
116
|
}
|
|
138
|
-
const factor = Math.pow(10, decimals)
|
|
139
|
-
return Math.
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
Number.prototype
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
Number.prototype.sign = function (): number {
|
|
147
|
-
return Math.sign(this.valueOf())
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
Number.prototype.times = function (callback: (index: number) => void): void {
|
|
151
|
-
if (typeof callback !== 'function') {
|
|
152
|
-
throw new TypeError(
|
|
153
|
-
`times: callback must be a function, got ${typeof callback}`,
|
|
154
|
-
)
|
|
117
|
+
const factor = Math.pow(10, decimals);
|
|
118
|
+
return Math.round(this.valueOf() * factor) / factor;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
defineExtension(Number.prototype, 'randomUpTo', function (this: number): number {
|
|
122
|
+
const max = this.valueOf();
|
|
123
|
+
if (!Number.isFinite(max)) {
|
|
124
|
+
throw new TypeError(`randomUpTo: number must be finite, got ${max}`);
|
|
155
125
|
}
|
|
126
|
+
return Math.random() * max;
|
|
127
|
+
});
|
|
156
128
|
|
|
157
|
-
const num = Math.floor(this.valueOf())
|
|
158
|
-
for (let i = 0; i < num; i++) {
|
|
159
|
-
callback(i)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
129
|
}
|
|
@@ -1,171 +1,143 @@
|
|
|
1
|
-
|
|
1
|
+
import { defineExtension } from "src/utils"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
let objectExtended = false
|
|
2
5
|
|
|
3
6
|
export function extendObject() {
|
|
4
|
-
|
|
7
|
+
if (objectExtended) return
|
|
8
|
+
objectExtended = true
|
|
9
|
+
|
|
10
|
+
defineExtension(Object.prototype, 'isEmpty', function (this: object): boolean {
|
|
5
11
|
return Object.keys(this).length === 0
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
Object.prototype.pick = function <
|
|
9
|
-
T extends Record<string, any>,
|
|
10
|
-
K extends keyof T,
|
|
11
|
-
>(keys: K[]): Pick<T, K> {
|
|
12
|
-
if (this === null || this === undefined) {
|
|
13
|
-
throw new TypeError('pick: cannot be called on null or undefined')
|
|
14
|
-
}
|
|
15
|
-
if (!Array.isArray(keys)) {
|
|
16
|
-
throw new TypeError(`pick: keys must be an array, got ${typeof keys}`)
|
|
17
|
-
}
|
|
18
|
-
if (keys.length === 0) {
|
|
19
|
-
throw new TypeError('pick: keys array cannot be empty')
|
|
20
|
-
}
|
|
12
|
+
})
|
|
21
13
|
|
|
14
|
+
defineExtension(Object.prototype, 'pick', function <T extends Record<string, any>, K extends keyof T>(this: T, keys: K[]): Pick<T, K> {
|
|
15
|
+
if (!Array.isArray(keys)) throw new TypeError('pick: keys must be an array')
|
|
16
|
+
if (!keys.length) throw new TypeError('pick: keys array cannot be empty')
|
|
22
17
|
const result = {} as Pick<T, K>
|
|
23
|
-
const obj = this as T
|
|
24
18
|
keys.forEach((key) => {
|
|
25
|
-
if (key in
|
|
26
|
-
result[key] = obj[key]
|
|
27
|
-
}
|
|
19
|
+
if (key in this) result[key] = this[key]
|
|
28
20
|
})
|
|
29
21
|
return result
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
Object.prototype.omit = function <
|
|
33
|
-
T extends Record<string, any>,
|
|
34
|
-
K extends keyof T,
|
|
35
|
-
>(keys: K[]): Omit<T, K> {
|
|
36
|
-
if (this === null || this === undefined) {
|
|
37
|
-
throw new TypeError('omit: cannot be called on null or undefined')
|
|
38
|
-
}
|
|
39
|
-
if (!Array.isArray(keys)) {
|
|
40
|
-
throw new TypeError(`omit: keys must be an array, got ${typeof keys}`)
|
|
41
|
-
}
|
|
42
|
-
if (keys.length === 0) {
|
|
43
|
-
throw new TypeError('omit: keys array cannot be empty')
|
|
44
|
-
}
|
|
22
|
+
})
|
|
45
23
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
Object.prototype.deepClone = function <T>(): T {
|
|
54
|
-
// Simple cycle detection without caching key generation
|
|
55
|
-
if (this === null || typeof this !== 'object') return this
|
|
56
|
-
|
|
57
|
-
// Handle Date objects
|
|
58
|
-
if (this instanceof Date) return new Date(this.getTime()) as unknown as T
|
|
59
|
-
|
|
60
|
-
// Handle Array objects
|
|
61
|
-
if (Array.isArray(this)) {
|
|
62
|
-
return this.map((item) => {
|
|
63
|
-
if (
|
|
64
|
-
item &&
|
|
65
|
-
typeof item === 'object' &&
|
|
66
|
-
typeof (item as any).deepClone === 'function'
|
|
67
|
-
) {
|
|
68
|
-
return (item as any).deepClone()
|
|
69
|
-
}
|
|
70
|
-
return item
|
|
71
|
-
}) as unknown as T
|
|
72
|
-
}
|
|
24
|
+
defineExtension(Object.prototype, 'omit', function <T extends Record<string, any>, K extends keyof T>(this: T, keys: K[]): Omit<T, K> {
|
|
25
|
+
if (!Array.isArray(keys)) throw new TypeError('omit: keys must be an array')
|
|
26
|
+
if (!keys.length) throw new TypeError('omit: keys array cannot be empty')
|
|
27
|
+
const result = { ...this }
|
|
28
|
+
keys.forEach((key) => delete result[key])
|
|
29
|
+
return result
|
|
30
|
+
})
|
|
73
31
|
|
|
74
|
-
|
|
32
|
+
defineExtension(Object.prototype, 'deepClone', function <T>(this: T): T {
|
|
75
33
|
const visited = new WeakSet()
|
|
76
|
-
|
|
77
34
|
function deepCloneSafe(obj: any): any {
|
|
78
35
|
if (obj === null || typeof obj !== 'object') return obj
|
|
79
|
-
|
|
80
|
-
if (visited.has(obj)) {
|
|
81
|
-
throw new Error('Circular reference detected in deepClone')
|
|
82
|
-
}
|
|
83
|
-
|
|
36
|
+
if (visited.has(obj)) throw new Error('Circular reference detected in deepClone')
|
|
84
37
|
visited.add(obj)
|
|
85
|
-
|
|
86
38
|
if (obj instanceof Date) return new Date(obj.getTime())
|
|
87
39
|
if (Array.isArray(obj)) return obj.map((item) => deepCloneSafe(item))
|
|
88
|
-
|
|
89
|
-
const cloned = {} as Record<string, unknown>
|
|
40
|
+
const cloned: Record<string, unknown> = {}
|
|
90
41
|
Object.keys(obj).forEach((key) => {
|
|
91
42
|
cloned[key] = deepCloneSafe(obj[key])
|
|
92
43
|
})
|
|
93
|
-
|
|
94
44
|
return cloned
|
|
95
45
|
}
|
|
46
|
+
return deepCloneSafe(this)
|
|
47
|
+
})
|
|
96
48
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
Object.prototype.merge = function <T extends Record<string, unknown>>(
|
|
101
|
-
other: Partial<T>,
|
|
102
|
-
): T {
|
|
103
|
-
return { ...this, ...other } as T
|
|
104
|
-
}
|
|
49
|
+
defineExtension(Object.prototype, 'merge', function <T extends object>(this: T, other: Partial<T>): T {
|
|
50
|
+
return { ...this, ...other }
|
|
51
|
+
})
|
|
105
52
|
|
|
106
|
-
Object.prototype
|
|
107
|
-
|
|
108
|
-
for (const name of propNames) {
|
|
53
|
+
defineExtension(Object.prototype, 'deepFreeze', function <T>(this: T): T {
|
|
54
|
+
Object.getOwnPropertyNames(this).forEach((name) => {
|
|
109
55
|
const value = (this as any)[name]
|
|
110
|
-
if (value && typeof value === 'object')
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
56
|
+
if (value && typeof value === 'object') value.deepFreeze?.()
|
|
57
|
+
})
|
|
58
|
+
return Object.freeze(this)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
defineExtension(Object.prototype, 'hasPath', function (this: object, path: string): boolean {
|
|
62
|
+
if (!path.trim()) throw new TypeError('hasPath: path cannot be empty')
|
|
63
|
+
return path.split('.').every((key) => {
|
|
64
|
+
if (this == null || !(key in this)) return false
|
|
65
|
+
// @ts-ignore
|
|
66
|
+
this = this[key]
|
|
67
|
+
return true
|
|
68
|
+
})
|
|
69
|
+
})
|
|
116
70
|
|
|
117
|
-
Object.prototype
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (path.trim() === '') {
|
|
122
|
-
throw new TypeError('hasPath: path cannot be empty or whitespace')
|
|
123
|
-
}
|
|
71
|
+
defineExtension(Object.prototype, 'getPath', function (this: object, path: string, defaultValue?: any): any {
|
|
72
|
+
if (!path.trim()) throw new TypeError('getPath: path cannot be empty')
|
|
73
|
+
return path.split('.').reduce((acc: any, key) => (acc && key in acc ? acc[key] : defaultValue), this as any)
|
|
74
|
+
})
|
|
124
75
|
|
|
76
|
+
defineExtension(Object.prototype, 'setPath', function (this: object, path: string, value: any): any {
|
|
77
|
+
if (!path.trim()) throw new TypeError('setPath: path cannot be empty')
|
|
125
78
|
const keys = path.split('.')
|
|
126
79
|
let current: any = this
|
|
127
|
-
for (
|
|
128
|
-
if (
|
|
129
|
-
current = current[
|
|
80
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
81
|
+
if (!(keys[i] in current) || typeof current[keys[i]] !== 'object') current[keys[i]] = {}
|
|
82
|
+
current = current[keys[i]]
|
|
130
83
|
}
|
|
131
|
-
|
|
132
|
-
|
|
84
|
+
current[keys[keys.length - 1]] = value
|
|
85
|
+
return this
|
|
86
|
+
})
|
|
133
87
|
|
|
134
|
-
Object.prototype
|
|
135
|
-
if (typeof
|
|
136
|
-
throw new TypeError(`
|
|
88
|
+
defineExtension(Object.prototype, 'mapValues', function <T extends Record<string, any>>(this: T, fn: (value: T[keyof T], key: keyof T) => any): Record<string, any> {
|
|
89
|
+
if (typeof fn !== 'function') {
|
|
90
|
+
throw new TypeError(`mapValues: fn must be a function, got ${typeof fn}`);
|
|
137
91
|
}
|
|
138
|
-
|
|
139
|
-
|
|
92
|
+
const result: Record<string, any> = {};
|
|
93
|
+
for (const key in this) {
|
|
94
|
+
if (Object.prototype.hasOwnProperty.call(this, key)) {
|
|
95
|
+
result[key] = fn((this as any)[key], key);
|
|
96
|
+
}
|
|
140
97
|
}
|
|
98
|
+
return result;
|
|
99
|
+
});
|
|
141
100
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (current == null || !(key in current)) return defaultValue
|
|
146
|
-
current = current[key]
|
|
101
|
+
defineExtension(Object.prototype, 'mapKeys', function <T extends Record<string, any>>(this: T, fn: (key: keyof T) => string | number | symbol): Record<string, any> {
|
|
102
|
+
if (typeof fn !== 'function') {
|
|
103
|
+
throw new TypeError(`mapKeys: fn must be a function, got ${typeof fn}`);
|
|
147
104
|
}
|
|
148
|
-
|
|
149
|
-
|
|
105
|
+
const result: Record<string, any> = {};
|
|
106
|
+
for (const key in this) {
|
|
107
|
+
if (Object.prototype.hasOwnProperty.call(this, key)) {
|
|
108
|
+
const newKey = fn(key);
|
|
109
|
+
result[newKey as string] = (this as any)[key];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
});
|
|
150
114
|
|
|
151
|
-
Object.prototype
|
|
152
|
-
if (
|
|
153
|
-
throw new TypeError(`
|
|
115
|
+
defineExtension(Object.prototype, 'filterKeys', function <T extends Record<string, any>>(this: T, keys: (keyof T)[]): Partial<T> {
|
|
116
|
+
if (!Array.isArray(keys)) {
|
|
117
|
+
throw new TypeError(`filterKeys: keys must be an array, got ${typeof keys}`);
|
|
154
118
|
}
|
|
155
|
-
|
|
156
|
-
|
|
119
|
+
const result: Partial<T> = {};
|
|
120
|
+
for (const key of keys) {
|
|
121
|
+
if (key in this) {
|
|
122
|
+
result[key] = (this as any)[key];
|
|
123
|
+
}
|
|
157
124
|
}
|
|
125
|
+
return result;
|
|
126
|
+
});
|
|
158
127
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
128
|
+
defineExtension(Object.prototype, 'filterValues', function <T extends Record<string, any>>(this: T, fn: (value: T[keyof T], key: keyof T) => boolean): Partial<T> {
|
|
129
|
+
if (typeof fn !== 'function') {
|
|
130
|
+
throw new TypeError(`filterValues: fn must be a function, got ${typeof fn}`);
|
|
131
|
+
}
|
|
132
|
+
const result: Partial<T> = {};
|
|
133
|
+
for (const key in this) {
|
|
134
|
+
if (Object.prototype.hasOwnProperty.call(this, key)) {
|
|
135
|
+
const val = (this as any)[key];
|
|
136
|
+
if (fn(val, key)) {
|
|
137
|
+
result[key] = val;
|
|
138
|
+
}
|
|
165
139
|
}
|
|
166
|
-
current = current[key]
|
|
167
140
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
141
|
+
return result;
|
|
142
|
+
});
|
|
171
143
|
}
|