ioredis-toolkit 0.0.9 → 0.5.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/CHANGELOG.md +67 -0
- package/LICENSE +1 -1
- package/README.md +68 -1058
- package/dist/cache/cache.d.ts +30 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +59 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/config.d.ts +12 -0
- package/dist/cache/config.d.ts.map +1 -0
- package/dist/cache/config.js +13 -0
- package/dist/cache/config.js.map +1 -0
- package/dist/cache/types.d.ts +32 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +5 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/index.d.ts +43 -51
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -44
- package/dist/index.js.map +1 -0
- package/dist/lock/config.d.ts +12 -0
- package/dist/lock/config.d.ts.map +1 -0
- package/dist/lock/config.js +8 -0
- package/dist/lock/config.js.map +1 -0
- package/dist/lock/lock.d.ts +20 -0
- package/dist/lock/lock.d.ts.map +1 -0
- package/dist/lock/lock.js +44 -0
- package/dist/lock/lock.js.map +1 -0
- package/dist/lock/types.d.ts +19 -0
- package/dist/lock/types.d.ts.map +1 -0
- package/dist/lock/types.js +2 -0
- package/dist/lock/types.js.map +1 -0
- package/dist/modules-config.d.ts +3 -0
- package/dist/modules-config.d.ts.map +1 -0
- package/dist/modules-config.js +2 -0
- package/dist/modules-config.js.map +1 -0
- package/dist/pubsub/config.d.ts +11 -0
- package/dist/pubsub/config.d.ts.map +1 -0
- package/dist/pubsub/config.js +6 -0
- package/dist/pubsub/config.js.map +1 -0
- package/dist/pubsub/pubsub.d.ts +20 -0
- package/dist/pubsub/pubsub.d.ts.map +1 -0
- package/dist/pubsub/pubsub.js +54 -0
- package/dist/pubsub/pubsub.js.map +1 -0
- package/dist/pubsub/types.d.ts +24 -0
- package/dist/pubsub/types.d.ts.map +1 -0
- package/dist/pubsub/types.js +2 -0
- package/dist/pubsub/types.js.map +1 -0
- package/dist/rate-limit/config.d.ts +12 -0
- package/dist/rate-limit/config.d.ts.map +1 -0
- package/dist/rate-limit/config.js +6 -0
- package/dist/rate-limit/config.js.map +1 -0
- package/dist/rate-limit/rate-limiter.d.ts +18 -0
- package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limit/rate-limiter.js +37 -0
- package/dist/rate-limit/rate-limiter.js.map +1 -0
- package/dist/rate-limit/types.d.ts +27 -0
- package/dist/rate-limit/types.d.ts.map +1 -0
- package/dist/rate-limit/types.js +2 -0
- package/dist/rate-limit/types.js.map +1 -0
- package/dist/redis/client-facade.d.ts +77 -0
- package/dist/redis/client-facade.d.ts.map +1 -0
- package/dist/redis/client-facade.js +102 -0
- package/dist/redis/client-facade.js.map +1 -0
- package/dist/redis/client.d.ts +10 -0
- package/dist/redis/client.d.ts.map +1 -0
- package/dist/redis/client.js +29 -0
- package/dist/redis/client.js.map +1 -0
- package/dist/redis/cluster.d.ts +7 -0
- package/dist/redis/cluster.d.ts.map +1 -0
- package/dist/redis/cluster.js +47 -0
- package/dist/redis/cluster.js.map +1 -0
- package/dist/redis/config.d.ts +39 -0
- package/dist/redis/config.d.ts.map +1 -0
- package/dist/redis/config.js +52 -0
- package/dist/redis/config.js.map +1 -0
- package/dist/redis/errors.d.ts +5 -0
- package/dist/redis/errors.d.ts.map +1 -0
- package/dist/redis/errors.js +5 -0
- package/dist/redis/errors.js.map +1 -0
- package/dist/redis/types.d.ts +135 -0
- package/dist/redis/types.d.ts.map +1 -0
- package/dist/redis/types.js +2 -0
- package/dist/redis/types.js.map +1 -0
- package/dist/redis/wrapper.d.ts +88 -0
- package/dist/redis/wrapper.d.ts.map +1 -0
- package/dist/redis/wrapper.js +206 -0
- package/dist/redis/wrapper.js.map +1 -0
- package/dist/session/config.d.ts +47 -0
- package/dist/session/config.d.ts.map +1 -0
- package/dist/session/config.js +101 -0
- package/dist/session/config.js.map +1 -0
- package/dist/session/cookie.d.ts +16 -0
- package/dist/session/cookie.d.ts.map +1 -0
- package/dist/session/cookie.js +28 -0
- package/dist/session/cookie.js.map +1 -0
- package/dist/session/errors.d.ts +56 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +58 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/factory.d.ts +21 -0
- package/dist/session/factory.d.ts.map +1 -0
- package/dist/session/factory.js +30 -0
- package/dist/session/factory.js.map +1 -0
- package/dist/session/health.d.ts +12 -0
- package/dist/session/health.d.ts.map +1 -0
- package/dist/session/health.js +23 -0
- package/dist/session/health.js.map +1 -0
- package/dist/session/keys.d.ts +23 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +27 -0
- package/dist/session/keys.js.map +1 -0
- package/dist/session/manager.d.ts +34 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +31 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/metrics.d.ts +11 -0
- package/dist/session/metrics.d.ts.map +1 -0
- package/dist/session/metrics.js +10 -0
- package/dist/session/metrics.js.map +1 -0
- package/dist/session/repository.d.ts +49 -0
- package/dist/session/repository.d.ts.map +1 -0
- package/dist/session/repository.js +203 -0
- package/dist/session/repository.js.map +1 -0
- package/dist/session/revocation.d.ts +22 -0
- package/dist/session/revocation.d.ts.map +1 -0
- package/dist/session/revocation.js +41 -0
- package/dist/session/revocation.js.map +1 -0
- package/dist/session/script-sources.d.ts +11 -0
- package/dist/session/script-sources.d.ts.map +1 -0
- package/dist/session/script-sources.js +140 -0
- package/dist/session/script-sources.js.map +1 -0
- package/dist/session/scripts.d.ts +15 -0
- package/dist/session/scripts.d.ts.map +1 -0
- package/dist/session/scripts.js +41 -0
- package/dist/session/scripts.js.map +1 -0
- package/dist/session/serializer.d.ts +12 -0
- package/dist/session/serializer.d.ts.map +1 -0
- package/dist/session/serializer.js +77 -0
- package/dist/session/serializer.js.map +1 -0
- package/dist/session/service.d.ts +48 -0
- package/dist/session/service.d.ts.map +1 -0
- package/dist/session/service.js +235 -0
- package/dist/session/service.js.map +1 -0
- package/dist/session/token.d.ts +16 -0
- package/dist/session/token.d.ts.map +1 -0
- package/dist/session/token.js +32 -0
- package/dist/session/token.js.map +1 -0
- package/dist/session/types.d.ts +134 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/streams/config.d.ts +12 -0
- package/dist/streams/config.d.ts.map +1 -0
- package/dist/streams/config.js +6 -0
- package/dist/streams/config.js.map +1 -0
- package/dist/streams/streams.d.ts +24 -0
- package/dist/streams/streams.d.ts.map +1 -0
- package/dist/streams/streams.js +55 -0
- package/dist/streams/streams.js.map +1 -0
- package/dist/streams/types.d.ts +32 -0
- package/dist/streams/types.d.ts.map +1 -0
- package/dist/streams/types.js +2 -0
- package/dist/streams/types.js.map +1 -0
- package/docs/ACCEPTANCE-REPORT.md +70 -0
- package/docs/ARCHITECTURE.md +61 -0
- package/docs/CAPACITY.md +33 -0
- package/docs/DEPLOYMENT.md +22 -0
- package/docs/README-API.md +15 -0
- package/docs/STATE-MACHINE.md +38 -0
- package/docs/TESTING.md +37 -0
- package/docs/THREAT-MODEL.md +23 -0
- package/docs/TYPE-SAFETY.md +34 -0
- package/docs/modules/cache/README.md +7 -0
- package/docs/modules/cache/usage.md +156 -0
- package/docs/modules/lock/README.md +7 -0
- package/docs/modules/lock/usage.md +105 -0
- package/docs/modules/pubsub/README.md +7 -0
- package/docs/modules/pubsub/usage.md +106 -0
- package/docs/modules/rate-limit/README.md +7 -0
- package/docs/modules/rate-limit/usage.md +100 -0
- package/docs/modules/sessions/README.md +7 -0
- package/docs/modules/sessions/usage.md +262 -0
- package/docs/modules/streams/README.md +7 -0
- package/docs/modules/streams/usage.md +141 -0
- package/package.json +50 -60
- package/src/scripts/cleanup-index.lua +4 -0
- package/src/scripts/conditional-update.lua +21 -0
- package/src/scripts/consume-session.lua +21 -0
- package/src/scripts/create-session.lua +28 -0
- package/src/scripts/delete.lua +2 -0
- package/src/scripts/destroy-user.lua +13 -0
- package/src/scripts/enforce-limit.lua +17 -0
- package/src/scripts/revoke-session.lua +13 -0
- package/src/scripts/rotate.lua +24 -0
- package/src/scripts/touch-session.lua +28 -0
- package/src/scripts/update-session.lua +18 -0
- package/dist/cache.d.ts +0 -796
- package/dist/cache.js +0 -1120
- package/dist/client.d.ts +0 -284
- package/dist/client.js +0 -1114
- package/dist/cluster-slot.d.ts +0 -4
- package/dist/cluster-slot.js +0 -31
- package/dist/cluster.d.ts +0 -79
- package/dist/cluster.js +0 -156
- package/dist/errors.d.ts +0 -30
- package/dist/errors.js +0 -63
- package/dist/health.d.ts +0 -180
- package/dist/health.js +0 -239
- package/dist/lock.d.ts +0 -248
- package/dist/lock.js +0 -397
- package/dist/logger.d.ts +0 -12
- package/dist/logger.js +0 -40
- package/dist/pubsub.d.ts +0 -423
- package/dist/pubsub.js +0 -537
- package/dist/ratelimiter.d.ts +0 -441
- package/dist/ratelimiter.js +0 -539
- package/dist/session/index.d.ts +0 -23
- package/dist/session/index.js +0 -16
- package/dist/session/revocation-store.d.ts +0 -176
- package/dist/session/revocation-store.js +0 -318
- package/dist/session/scripts/cleanup-index.lua +0 -21
- package/dist/session/scripts/conditional-update-encrypted.lua +0 -60
- package/dist/session/scripts/conditional-update.lua +0 -63
- package/dist/session/scripts/create.lua +0 -83
- package/dist/session/scripts/delete-by-user.lua +0 -29
- package/dist/session/scripts/delete.lua +0 -15
- package/dist/session/scripts/enforce-limit.lua +0 -38
- package/dist/session/scripts/revoke.lua +0 -61
- package/dist/session/scripts/rotate-encrypted.lua +0 -110
- package/dist/session/scripts/rotate.lua +0 -122
- package/dist/session/scripts/touch-encrypted.lua +0 -89
- package/dist/session/scripts/touch.lua +0 -72
- package/dist/session/scripts/validate.lua +0 -90
- package/dist/session/session-circuit-breaker.d.ts +0 -42
- package/dist/session/session-circuit-breaker.js +0 -129
- package/dist/session/session-config.d.ts +0 -335
- package/dist/session/session-config.js +0 -162
- package/dist/session/session-cookie.d.ts +0 -72
- package/dist/session/session-cookie.js +0 -101
- package/dist/session/session-encryption.d.ts +0 -87
- package/dist/session/session-encryption.js +0 -139
- package/dist/session/session-errors.d.ts +0 -85
- package/dist/session/session-errors.js +0 -145
- package/dist/session/session-health.d.ts +0 -38
- package/dist/session/session-health.js +0 -60
- package/dist/session/session-keys.d.ts +0 -51
- package/dist/session/session-keys.js +0 -113
- package/dist/session/session-manager.d.ts +0 -73
- package/dist/session/session-manager.js +0 -94
- package/dist/session/session-metrics.d.ts +0 -33
- package/dist/session/session-metrics.js +0 -112
- package/dist/session/session-repository.d.ts +0 -161
- package/dist/session/session-repository.js +0 -683
- package/dist/session/session-scripts.d.ts +0 -36
- package/dist/session/session-scripts.js +0 -130
- package/dist/session/session-serializer.d.ts +0 -42
- package/dist/session/session-serializer.js +0 -248
- package/dist/session/session-service.d.ts +0 -104
- package/dist/session/session-service.js +0 -611
- package/dist/session/session-token.d.ts +0 -38
- package/dist/session/session-token.js +0 -86
- package/dist/session/session-types.d.ts +0 -253
- package/dist/session/session-types.js +0 -16
- package/dist/types.d.ts +0 -924
- package/dist/types.js +0 -151
- package/dist/utils/deepmerge.d.ts +0 -9
- package/dist/utils/deepmerge.js +0 -61
package/dist/types.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export const DistributedLockOptionsSchema = z.object({
|
|
3
|
-
ttl: z.coerce.number().int().positive().default(30000),
|
|
4
|
-
retryCount: z.coerce.number().int().positive().default(3),
|
|
5
|
-
retryDelay: z.coerce.number().int().positive().default(200)
|
|
6
|
-
});
|
|
7
|
-
export const CacheOptionsSchema = z.object({
|
|
8
|
-
defaultTTL: z.number().int().min(0).default(3_600),
|
|
9
|
-
compressionThreshold: z.number().int().min(1).default(1_024),
|
|
10
|
-
namespace: z.string().min(1).default("cache"),
|
|
11
|
-
});
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// Rate Limiting
|
|
14
|
-
// ============================================================================
|
|
15
|
-
export const RateLimitAlgorithmSchema = z.enum(["fixed", "sliding"]);
|
|
16
|
-
export const RateLimitOptionsSchema = z.object({
|
|
17
|
-
limit: z.number().int().positive().default(100),
|
|
18
|
-
duration: z.number().int().positive().default(60),
|
|
19
|
-
algorithm: RateLimitAlgorithmSchema.default("sliding"),
|
|
20
|
-
namespace: z.string().min(1).default("ratelimit"),
|
|
21
|
-
});
|
|
22
|
-
// ============================================================================
|
|
23
|
-
// Redis Topology
|
|
24
|
-
// ============================================================================
|
|
25
|
-
export const RedisModeSchema = z.enum(["standalone", "sentinel", "cluster"]);
|
|
26
|
-
export const RedisNodeSchema = z
|
|
27
|
-
.object({
|
|
28
|
-
host: z.string().min(1),
|
|
29
|
-
port: z.number().int().min(1).max(65_535),
|
|
30
|
-
})
|
|
31
|
-
.strict();
|
|
32
|
-
// ============================================================================
|
|
33
|
-
// TLS
|
|
34
|
-
// ============================================================================
|
|
35
|
-
export const RedisTlsOptionsSchema = z
|
|
36
|
-
.object({
|
|
37
|
-
ca: z.string().optional(),
|
|
38
|
-
cert: z.string().optional(),
|
|
39
|
-
key: z.string().optional(),
|
|
40
|
-
rejectUnauthorized: z.boolean().default(true),
|
|
41
|
-
})
|
|
42
|
-
.strict();
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// Session
|
|
45
|
-
// ============================================================================
|
|
46
|
-
export const SessionOptionsSchema = z.custom();
|
|
47
|
-
// ============================================================================
|
|
48
|
-
// Common Redis Configuration
|
|
49
|
-
// ============================================================================
|
|
50
|
-
/**
|
|
51
|
-
* Configuration shared by all Redis topologies.
|
|
52
|
-
*
|
|
53
|
-
* IMPORTANT:
|
|
54
|
-
* - This schema describes the user-facing input.
|
|
55
|
-
* - `.default()` makes the property optional on input while guaranteeing
|
|
56
|
-
* the value exists on output.
|
|
57
|
-
*/
|
|
58
|
-
export const BaseRedisConfigSchema = z
|
|
59
|
-
.object({
|
|
60
|
-
password: z.string().optional(),
|
|
61
|
-
username: z.string().optional(),
|
|
62
|
-
database: z.number().int().min(0).max(15).default(0),
|
|
63
|
-
tls: z.boolean().default(false),
|
|
64
|
-
tlsOptions: RedisTlsOptionsSchema.optional(),
|
|
65
|
-
maxRetries: z.number().int().min(0).max(10).default(3),
|
|
66
|
-
retryDelay: z.number().int().min(50).max(5_000).default(250),
|
|
67
|
-
connectionTimeout: z.number().int().min(100).default(5_000),
|
|
68
|
-
maxFanOutConcurrency: z.number().int().min(1).max(128).default(8),
|
|
69
|
-
maxBatchSize: z.number().int().min(1).max(10_000).default(500),
|
|
70
|
-
lockOptions: DistributedLockOptionsSchema.optional(),
|
|
71
|
-
cacheOptions: CacheOptionsSchema.optional(),
|
|
72
|
-
slowCommandThreshold: z.number().int().min(0).default(1_000),
|
|
73
|
-
rateLimit: RateLimitOptionsSchema.optional(),
|
|
74
|
-
// rateLimit: RateLimitOptionsSchema.default({
|
|
75
|
-
// algorithm: "sliding",
|
|
76
|
-
// duration: 60,
|
|
77
|
-
// limit: 100,
|
|
78
|
-
// namespace: "ratelimit",
|
|
79
|
-
// }),
|
|
80
|
-
sessionOptions: z.custom().optional(),
|
|
81
|
-
})
|
|
82
|
-
.strict();
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Standalone Configuration
|
|
85
|
-
// ============================================================================
|
|
86
|
-
/**
|
|
87
|
-
* Standalone Redis configuration.
|
|
88
|
-
*
|
|
89
|
-
* `mode` is optional on input because standalone is the default topology.
|
|
90
|
-
*/
|
|
91
|
-
export const StandaloneRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
92
|
-
mode: z.literal("standalone").optional(),
|
|
93
|
-
host: z.string().min(1).default("localhost"),
|
|
94
|
-
port: z.number().int().min(1).max(65_535).default(6379),
|
|
95
|
-
url: z.url().optional(),
|
|
96
|
-
}).strict();
|
|
97
|
-
// ============================================================================
|
|
98
|
-
// Sentinel Configuration
|
|
99
|
-
// ============================================================================
|
|
100
|
-
export const SentinelRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
101
|
-
mode: z.literal("sentinel"),
|
|
102
|
-
sentinelNodes: z.array(RedisNodeSchema).min(1),
|
|
103
|
-
sentinelMasterName: z.string().min(1),
|
|
104
|
-
}).strict();
|
|
105
|
-
// ============================================================================
|
|
106
|
-
// Cluster Configuration
|
|
107
|
-
// ============================================================================
|
|
108
|
-
/**
|
|
109
|
-
* Redis Cluster only supports database 0.
|
|
110
|
-
*/
|
|
111
|
-
export const ClusterRedisConfigSchema = BaseRedisConfigSchema.extend({
|
|
112
|
-
mode: z.literal("cluster"),
|
|
113
|
-
clusterNodes: z.array(RedisNodeSchema).min(1),
|
|
114
|
-
database: z.literal(0).default(0),
|
|
115
|
-
}).strict();
|
|
116
|
-
// ============================================================================
|
|
117
|
-
// Public Redis Configuration
|
|
118
|
-
// ============================================================================
|
|
119
|
-
/**
|
|
120
|
-
* Raw configuration union.
|
|
121
|
-
*
|
|
122
|
-
* This is intentionally a normal union rather than a discriminated union
|
|
123
|
-
* because standalone allows `mode` to be omitted.
|
|
124
|
-
*/
|
|
125
|
-
export const RedisConfigInputSchema = z.union([
|
|
126
|
-
StandaloneRedisConfigSchema,
|
|
127
|
-
SentinelRedisConfigSchema,
|
|
128
|
-
ClusterRedisConfigSchema,
|
|
129
|
-
]);
|
|
130
|
-
/**
|
|
131
|
-
* Normalized configuration.
|
|
132
|
-
*
|
|
133
|
-
* After parsing:
|
|
134
|
-
*
|
|
135
|
-
* - standalone.mode === "standalone"
|
|
136
|
-
* - sentinel.mode === "sentinel"
|
|
137
|
-
* - cluster.mode === "cluster"
|
|
138
|
-
* - defaults have been materialized
|
|
139
|
-
*/
|
|
140
|
-
export const RedisConfigSchema = RedisConfigInputSchema.transform((config) => {
|
|
141
|
-
if (config.mode === "sentinel") {
|
|
142
|
-
return config;
|
|
143
|
-
}
|
|
144
|
-
if (config.mode === "cluster") {
|
|
145
|
-
return config;
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
...config,
|
|
149
|
-
mode: "standalone",
|
|
150
|
-
};
|
|
151
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type Builtin = Date | RegExp | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Promise<unknown> | Error;
|
|
2
|
-
type DeepMerge<T, U> = T extends Builtin ? U : U extends Builtin ? U : T extends readonly unknown[] ? U : U extends readonly unknown[] ? U : T extends object ? U extends object ? {
|
|
3
|
-
[K in keyof T | keyof U]: K extends keyof U ? K extends keyof T ? DeepMerge<T[K], U[K]> : U[K] : K extends keyof T ? T[K] : never;
|
|
4
|
-
} : U : U;
|
|
5
|
-
export declare function deepMerge<T extends object>(target: T): T;
|
|
6
|
-
export declare function deepMerge<T extends object, U extends object>(target: T, source: U): DeepMerge<T, U>;
|
|
7
|
-
export declare function deepMerge<T extends object, U extends object, V extends object>(target: T, source: U, source2: V): DeepMerge<DeepMerge<T, U>, V>;
|
|
8
|
-
export declare function deepMerge<T extends object, U extends object, V extends object, W extends object>(target: T, source: U, source2: V, source3: W): DeepMerge<DeepMerge<DeepMerge<T, U>, V>, W>;
|
|
9
|
-
export {};
|
package/dist/utils/deepmerge.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
const BLOCKED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
|
|
2
|
-
function isBlockedKey(key) {
|
|
3
|
-
return typeof key === "string" && BLOCKED_KEYS.has(key);
|
|
4
|
-
}
|
|
5
|
-
function isPlainObject(value) {
|
|
6
|
-
if (value === null || typeof value !== "object") {
|
|
7
|
-
return false;
|
|
8
|
-
}
|
|
9
|
-
const prototype = Object.getPrototypeOf(value);
|
|
10
|
-
return prototype === Object.prototype || prototype === null;
|
|
11
|
-
}
|
|
12
|
-
function deepMergeTwo(target, source) {
|
|
13
|
-
// Non-objects and special objects are replaced.
|
|
14
|
-
if (!isPlainObject(target) || !isPlainObject(source)) {
|
|
15
|
-
return source;
|
|
16
|
-
}
|
|
17
|
-
const result = Object.create(Object.getPrototypeOf(target));
|
|
18
|
-
// Copy target.
|
|
19
|
-
for (const key of Reflect.ownKeys(target)) {
|
|
20
|
-
if (isBlockedKey(key)) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
const descriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
24
|
-
if (descriptor) {
|
|
25
|
-
Object.defineProperty(result, key, descriptor);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// Merge source.
|
|
29
|
-
for (const key of Reflect.ownKeys(source)) {
|
|
30
|
-
if (isBlockedKey(key)) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
const sourceDescriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
34
|
-
if (!sourceDescriptor) {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const sourceValue = sourceDescriptor.value;
|
|
38
|
-
const targetDescriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
39
|
-
const targetValue = targetDescriptor?.value;
|
|
40
|
-
if (targetDescriptor &&
|
|
41
|
-
"value" in targetDescriptor &&
|
|
42
|
-
isPlainObject(targetValue) &&
|
|
43
|
-
isPlainObject(sourceValue)) {
|
|
44
|
-
Object.defineProperty(result, key, {
|
|
45
|
-
...sourceDescriptor,
|
|
46
|
-
value: deepMergeTwo(targetValue, sourceValue),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
Object.defineProperty(result, key, sourceDescriptor);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
export function deepMerge(target, ...sources) {
|
|
56
|
-
let result = target;
|
|
57
|
-
for (const source of sources) {
|
|
58
|
-
result = deepMergeTwo(result, source);
|
|
59
|
-
}
|
|
60
|
-
return result;
|
|
61
|
-
}
|