@configdirector/nextjs-sdk 1.6.1 → 1.8.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/README.md +41 -0
- package/dist/client/index.cjs +1 -5
- package/dist/client/index.d.cts +52 -216
- package/dist/client/index.d.cts.map +1 -1
- package/dist/client/index.d.mts +52 -216
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +1 -5
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/installedTestClient-CrHwnJTr.mjs +7 -0
- package/dist/client/installedTestClient-CrHwnJTr.mjs.map +1 -0
- package/dist/client/installedTestClient-LbS5fHdP.cjs +6 -0
- package/dist/client/testing.cjs +2 -0
- package/dist/client/testing.d.cts +159 -0
- package/dist/client/testing.d.cts.map +1 -0
- package/dist/client/testing.d.mts +159 -0
- package/dist/client/testing.d.mts.map +1 -0
- package/dist/client/testing.mjs +3 -0
- package/dist/client/testing.mjs.map +1 -0
- package/dist/client/types-DA2VZKNX.d.mts +220 -0
- package/dist/client/types-DA2VZKNX.d.mts.map +1 -0
- package/dist/client/types-fL7X5zwg.d.cts +220 -0
- package/dist/client/types-fL7X5zwg.d.cts.map +1 -0
- package/dist/server/DefaultConfigDirectorClient-BhyVJv6Z.mjs +6 -0
- package/dist/server/DefaultConfigDirectorClient-BhyVJv6Z.mjs.map +1 -0
- package/dist/server/DefaultConfigDirectorClient-BngKzHat.cjs +5 -0
- package/dist/server/{errors-B1AJJTZ-.mjs → errors-BGpFuqOO.mjs} +1 -1
- package/dist/server/{errors-B1AJJTZ-.mjs.map → errors-BGpFuqOO.mjs.map} +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +14 -288
- package/dist/server/index.d.cts.map +1 -1
- package/dist/server/index.d.mts +14 -288
- package/dist/server/index.d.mts.map +1 -1
- package/dist/server/index.mjs +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/testing.cjs +1 -0
- package/dist/server/testing.d.cts +119 -0
- package/dist/server/testing.d.cts.map +1 -0
- package/dist/server/testing.d.mts +119 -0
- package/dist/server/testing.d.mts.map +1 -0
- package/dist/server/testing.mjs +2 -0
- package/dist/server/testing.mjs.map +1 -0
- package/dist/server/types-DnzM2ukj.d.cts +292 -0
- package/dist/server/types-DnzM2ukj.d.cts.map +1 -0
- package/dist/server/types-qIeNbtNf.d.mts +292 -0
- package/dist/server/types-qIeNbtNf.d.mts.map +1 -0
- package/package.json +37 -2
- package/dist/server/DefaultConfigDirectorClient-CAMGE6h8.mjs +0 -6
- package/dist/server/DefaultConfigDirectorClient-CAMGE6h8.mjs.map +0 -1
- package/dist/server/DefaultConfigDirectorClient-DhSSj7ds.cjs +0 -5
- /package/dist/server/{errors-zhcEWVnY.cjs → errors-CCbuIqT8.cjs} +0 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
//#region ../shared/src/types.d.ts
|
|
2
|
+
declare const ConfigTypeList: readonly ["custom", "boolean", "string", "integer", "float", "enum", "url", "json"];
|
|
3
|
+
type ConfigType = (typeof ConfigTypeList)[number];
|
|
4
|
+
type ConfigEnumLikeType = {
|
|
5
|
+
[key: string]: string | number;
|
|
6
|
+
};
|
|
7
|
+
type ConfigValueType = string | number | boolean | object | ConfigEnumLikeType;
|
|
8
|
+
type ConfigState = {
|
|
9
|
+
id: string;
|
|
10
|
+
key: string;
|
|
11
|
+
type: ConfigType;
|
|
12
|
+
value: string | undefined | null;
|
|
13
|
+
valueId?: string | undefined | null;
|
|
14
|
+
};
|
|
15
|
+
type ConfigDirectorLoggingLevel = "debug" | "info" | "warn" | "error" | "off";
|
|
16
|
+
interface ConfigDirectorLogger {
|
|
17
|
+
debug(message: string, ...args: any): void;
|
|
18
|
+
info(message: string, ...args: any): void;
|
|
19
|
+
warn(message: string, ...args: any): void;
|
|
20
|
+
error(message: string, ...args: any): void;
|
|
21
|
+
}
|
|
22
|
+
interface ConfigDirectorLogMessageDecorator {
|
|
23
|
+
decorateMessage(message: string): string;
|
|
24
|
+
}
|
|
25
|
+
type EvaluationReason = "found-match" | "config-state-missing" | "client-not-ready" | "type-mismatch" | "value-missing" | "invalid-number" | "invalid-json" | "invalid-boolean";
|
|
26
|
+
type ConfigEvaluation = {
|
|
27
|
+
key: string;
|
|
28
|
+
value: ConfigValueType;
|
|
29
|
+
valueId?: string;
|
|
30
|
+
isDefaultValue: boolean;
|
|
31
|
+
reason: EvaluationReason;
|
|
32
|
+
context?: ConfigDirectorContext;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The user's context to be sent to ConfigDirector. This context will be used for targeting
|
|
36
|
+
* rules evaluation.
|
|
37
|
+
*/
|
|
38
|
+
type ConfigDirectorContext = {
|
|
39
|
+
/**
|
|
40
|
+
* The user's identifier. This should be a value that uniquely identifies an application
|
|
41
|
+
* user.
|
|
42
|
+
* In the case of anonymous users, you could generate a UUID or alternatively not provide
|
|
43
|
+
* the {@link id} and the SDK will generate a random UUID. However, keep in mind that this
|
|
44
|
+
* value is used for segmenting users in percentage rollouts, and changes to the {@link id}
|
|
45
|
+
* could result in the user being assigned to a different percentile.
|
|
46
|
+
*/
|
|
47
|
+
id?: string;
|
|
48
|
+
/**
|
|
49
|
+
* The user's display name. This will be shown in the ConfigDirector dashboard and may be
|
|
50
|
+
* used for targeting rules.
|
|
51
|
+
*/
|
|
52
|
+
name?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Any arbitrary traits for the current user. They will be shown in the ConfigDirector
|
|
55
|
+
* dashboard and may be used for targeting rules.
|
|
56
|
+
*/
|
|
57
|
+
traits?: {
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Whether or not to treat the context as anonymous during evaluation. When `true`, the
|
|
62
|
+
* context values will be used for targeting rules evaluation but the context will not be
|
|
63
|
+
* persisted and will not appear in the dashboard.
|
|
64
|
+
*
|
|
65
|
+
* @default false
|
|
66
|
+
*/
|
|
67
|
+
anonymous?: boolean;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Metadata about your application. It is recommended you include these values when configuring
|
|
71
|
+
* a ConfigDirector client so that you can use them in targeting rules.
|
|
72
|
+
*/
|
|
73
|
+
type ConfigDirectorMetaContext = {
|
|
74
|
+
appVersion?: string;
|
|
75
|
+
appName?: string;
|
|
76
|
+
};
|
|
77
|
+
type ConnectionMode = "streaming" | "polling";
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region ../js-server-sdk/src/types.d.ts
|
|
80
|
+
/**
|
|
81
|
+
* Configuration options for the {@link ConfigDirectorClient}
|
|
82
|
+
*/
|
|
83
|
+
type ConfigDirectorClientOptions = {
|
|
84
|
+
/**
|
|
85
|
+
* Application metadata that remains constant through the lifetime of the connection
|
|
86
|
+
*/
|
|
87
|
+
metadata?: ConfigDirectorMetaContext;
|
|
88
|
+
/**
|
|
89
|
+
* Connection options
|
|
90
|
+
*/
|
|
91
|
+
connection?: {
|
|
92
|
+
/**
|
|
93
|
+
* The connection mode to be used, one of `streaming` (default) or `polling`.
|
|
94
|
+
* If set to `streaming`, the connection will remain open and receive updates whenever
|
|
95
|
+
* config state is updated on the ConfigDirector dashboard.
|
|
96
|
+
* When set to `polling`, there will be an initial request to retrieve config state during
|
|
97
|
+
* initialization, and additional requests on a `pollingInterval`.
|
|
98
|
+
*
|
|
99
|
+
* Defaults to `streaming`
|
|
100
|
+
*/
|
|
101
|
+
mode?: ConnectionMode;
|
|
102
|
+
/**
|
|
103
|
+
* The polling interval in _seconds_ when the `mode` is set to `polling`. This option has no
|
|
104
|
+
* effect when the `mode` is set to `streaming`.
|
|
105
|
+
*
|
|
106
|
+
* Defaults to 300 seconds (5 minutes). The minimum is 60 seconds. A value below the minimum is
|
|
107
|
+
* raised to the minimum and a warning is logged.
|
|
108
|
+
*/
|
|
109
|
+
pollingInterval?: number;
|
|
110
|
+
/**
|
|
111
|
+
* The timeout, in milliseconds, to be used in initialization and when updating the context.
|
|
112
|
+
* If streaming is enabled, the operation (initialization or context update) may still succeed
|
|
113
|
+
* after it times out if no unrecoverable errors are encountered (like an invalid SDK key).
|
|
114
|
+
* If streaming is disabled, if the operation times out, it will not be retried.
|
|
115
|
+
*
|
|
116
|
+
* Defaults to 3,000 milliseconds (3 seconds)
|
|
117
|
+
*/
|
|
118
|
+
timeout?: number;
|
|
119
|
+
/**
|
|
120
|
+
* The base URL to the ConfigDirector SDK server. To be used only when needing to route through a
|
|
121
|
+
* proxy to connect to the ConfigDirector SDK server. Please refer to the docs on how to configure
|
|
122
|
+
* a proxy for the client SDK.
|
|
123
|
+
*/
|
|
124
|
+
url?: string;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* A logger that implements {@link ConfigDirectorLogger}. It defaults to the ConfigDirector console
|
|
128
|
+
* logger set to 'warn' level.
|
|
129
|
+
*
|
|
130
|
+
* The log level of the default logger can be adjusted by creating a default logger with the desired
|
|
131
|
+
* level and providing it in this property:
|
|
132
|
+
* @example
|
|
133
|
+
* import { createClient, createConsoleLogger } from "@configdirector/server-sdk";
|
|
134
|
+
* const client = createClient(
|
|
135
|
+
* "YOUR-SERVER-SDK-KEY",
|
|
136
|
+
* { logger: createConsoleLogger("debug") },
|
|
137
|
+
* );
|
|
138
|
+
*/
|
|
139
|
+
logger?: ConfigDirectorLogger;
|
|
140
|
+
/**
|
|
141
|
+
* Telemetry tunning. It is unlikely these settings need to be adjusted. However, in cases where
|
|
142
|
+
* your application has a large number of evaluations per second, you can adjust these settings
|
|
143
|
+
* to tune the memory footprint and frequency of telemetry requests.
|
|
144
|
+
* Keep in mind that ConfigDirector relies on these telemetry events to provide insights and features
|
|
145
|
+
* related to the configs being used.
|
|
146
|
+
*/
|
|
147
|
+
telemetry?: {
|
|
148
|
+
/**
|
|
149
|
+
* The size limit of telemetry event queues. If the size limit is reached before the events are
|
|
150
|
+
* flushed to the network, older events will be dropped.
|
|
151
|
+
*
|
|
152
|
+
* ConfigDirector keeps a count of dropped events. If the number of dropped events is higher than
|
|
153
|
+
* 50% of the total events, ConfigDirector will issue a notification alert in the dashboard.
|
|
154
|
+
*
|
|
155
|
+
* A number between 100 and 100,000. Defaults to 5,000.
|
|
156
|
+
*/
|
|
157
|
+
eventQueueLimit?: number;
|
|
158
|
+
/**
|
|
159
|
+
* How often events are flushed and sent over the network in milliseconds.
|
|
160
|
+
*
|
|
161
|
+
* Decrease this number if your application consistently captures a large number of events in short
|
|
162
|
+
* periods of time in order to reduce memory footprint from a large event queue.
|
|
163
|
+
*
|
|
164
|
+
* Defaults to 30,000 milliseconds (30 seconds)
|
|
165
|
+
*/
|
|
166
|
+
flushInterval?: number;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Handlers for hooks/events emitted by the client. Each hook accepts either a single event handler or
|
|
170
|
+
* an array of event handlers.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* import { createClient, createConsoleLogger } from "@configdirector/server-sdk";
|
|
174
|
+
* const client = createClient(
|
|
175
|
+
* "YOUR-SERVER-SDK-KEY",
|
|
176
|
+
* {
|
|
177
|
+
* hooks: {
|
|
178
|
+
* configEvaluated: (event) => { console.log(event.evaluation); }
|
|
179
|
+
* },
|
|
180
|
+
* },
|
|
181
|
+
* );
|
|
182
|
+
*/
|
|
183
|
+
hooks?: ClientHooks;
|
|
184
|
+
};
|
|
185
|
+
type ClientEvents = {
|
|
186
|
+
configsUpdated: {
|
|
187
|
+
keys: string[];
|
|
188
|
+
removedKeys: string[];
|
|
189
|
+
};
|
|
190
|
+
clientReady: undefined;
|
|
191
|
+
configEvaluated: {
|
|
192
|
+
evaluation: ConfigEvaluation;
|
|
193
|
+
};
|
|
194
|
+
connectionError: {
|
|
195
|
+
error: Error;
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
type ClientHooks = {
|
|
199
|
+
clientReady?: HookHandler<"clientReady"> | HookHandler<"clientReady">[];
|
|
200
|
+
configsUpdated?: HookHandler<"configsUpdated"> | HookHandler<"configsUpdated">[];
|
|
201
|
+
configEvaluated?: HookHandler<"configEvaluated"> | HookHandler<"configEvaluated">[];
|
|
202
|
+
connectionError?: HookHandler<"connectionError"> | HookHandler<"connectionError">[];
|
|
203
|
+
};
|
|
204
|
+
type HookHandler<TEvent extends keyof ClientEvents> = (payload: ClientEvents[TEvent]) => void;
|
|
205
|
+
type WatchHandler<T extends ConfigValueType> = (message: T) => void;
|
|
206
|
+
/**
|
|
207
|
+
* The ConfigDirector SDK client object.
|
|
208
|
+
*
|
|
209
|
+
* Applications should create a single instance of `ConfigDirectorClient`, and call
|
|
210
|
+
* {@link initialize} during application initialization.
|
|
211
|
+
*/
|
|
212
|
+
interface ConfigDirectorClient {
|
|
213
|
+
/**
|
|
214
|
+
* Initializes the connection to ConfigDirector to retrieve config definitions. Until
|
|
215
|
+
* initialization is successful, all flags will return their default value provided to
|
|
216
|
+
* {@link watch} or {@link getValue}.
|
|
217
|
+
*
|
|
218
|
+
* If the connection fails or is interrupted with a transient error (network error,
|
|
219
|
+
* internal server error, etc) the client will continue to attempt to connect. However,
|
|
220
|
+
* if the connection fails with a persistent error, like an invalid SDK key, the client will
|
|
221
|
+
* not attempt to re-connect and an error will be logged to the console or the provided
|
|
222
|
+
* logger.
|
|
223
|
+
*/
|
|
224
|
+
initialize(): Promise<void>;
|
|
225
|
+
/**
|
|
226
|
+
* Returns whether or not the client is ready after calling {@link initialize}
|
|
227
|
+
*
|
|
228
|
+
* The definition of ready is that the connection to the server was successful, and config definitions
|
|
229
|
+
* were received.
|
|
230
|
+
*/
|
|
231
|
+
get isReady(): boolean;
|
|
232
|
+
/**
|
|
233
|
+
* Evaluates a config and returns its value based on the current context and targeting rules
|
|
234
|
+
*
|
|
235
|
+
* @returns The evaluated config value, or the `defaultValue` if the config state was unavailable
|
|
236
|
+
* @param configKey The config key to evaluate
|
|
237
|
+
* @param defaultValue The default value to be returned if the config state is unavailable. For
|
|
238
|
+
* example, if the client cannot connect to the server due to network conditions, or if getValue
|
|
239
|
+
* is called before initialization is done.
|
|
240
|
+
* @param context The user's context to be used for targeting rules evaluation (optional)
|
|
241
|
+
*/
|
|
242
|
+
getValue<T extends ConfigValueType>(configKey: string, defaultValue: T, context?: ConfigDirectorContext): T;
|
|
243
|
+
/**
|
|
244
|
+
* Watches for changes to a a config evaluation value. Whenever the config value changes, the
|
|
245
|
+
* provided callback function will be called with the new value. Changes can happen due to updates
|
|
246
|
+
* to the config in the ConfigDirector dashboard, or if the context is updated via {@link updateContext}.
|
|
247
|
+
*
|
|
248
|
+
* @returns An 'unwatch' function that can be called to remove the subscriber
|
|
249
|
+
*
|
|
250
|
+
* @param configKey The config key to watch
|
|
251
|
+
* @param defaultValue The default value to be referenced if the config state is unavailable
|
|
252
|
+
* @param callback The callback function to be called whenever the config value is updated
|
|
253
|
+
* @param context The user's context to be used for targeting rules evaluation (optional)
|
|
254
|
+
*/
|
|
255
|
+
watch<T extends ConfigValueType>(configKey: string, defaultValue: T, callback: WatchHandler<T>, context?: ConfigDirectorContext): () => void;
|
|
256
|
+
/**
|
|
257
|
+
* Removes a particular subscriber to the given `configKey`, or all subscribers if no callback
|
|
258
|
+
* is provided.
|
|
259
|
+
*
|
|
260
|
+
* @param configKey The config key to remove subscribers from
|
|
261
|
+
* @param callback The subscriber to be removed. If not provided, all subscribers are removed for
|
|
262
|
+
* the given `configKey`.
|
|
263
|
+
*/
|
|
264
|
+
unwatch<T extends ConfigValueType>(configKey: string, callback?: WatchHandler<T>): void;
|
|
265
|
+
/**
|
|
266
|
+
* Removes all subscribers from all config keys
|
|
267
|
+
*/
|
|
268
|
+
unwatchAll(): void;
|
|
269
|
+
/**
|
|
270
|
+
* Returns the evaluated {@link ConfigState} for every known config key, or only the keys
|
|
271
|
+
* listed in `configKeys` when provided.
|
|
272
|
+
*
|
|
273
|
+
* Intended for SSR hydration — does NOT record telemetry events. Returns an empty object
|
|
274
|
+
* when the client is not yet ready.
|
|
275
|
+
*/
|
|
276
|
+
getAllConfigs(options?: {
|
|
277
|
+
context?: ConfigDirectorContext;
|
|
278
|
+
configKeys?: string[];
|
|
279
|
+
}): Record<string, ConfigState>;
|
|
280
|
+
on<T extends keyof ClientEvents>(eventName: T, handler: (args: ClientEvents[T]) => void): void;
|
|
281
|
+
off<T extends keyof ClientEvents>(eventName: T, handler?: (args: ClientEvents[T]) => void): void;
|
|
282
|
+
/**
|
|
283
|
+
* Disposes of the client. All connections are closed, and all event and config key subscribers
|
|
284
|
+
* are removed.
|
|
285
|
+
*
|
|
286
|
+
* Intended to be called when your application shuts down
|
|
287
|
+
*/
|
|
288
|
+
dispose(): void;
|
|
289
|
+
}
|
|
290
|
+
//#endregion
|
|
291
|
+
export { ConfigDirectorLogger as a, ConfigEvaluation as c, ConnectionMode as d, ConfigDirectorLogMessageDecorator as i, ConfigState as l, ConfigDirectorClientOptions as n, ConfigDirectorLoggingLevel as o, ConfigDirectorContext as r, ConfigDirectorMetaContext as s, ConfigDirectorClient as t, ConfigValueType as u };
|
|
292
|
+
//# sourceMappingURL=types-qIeNbtNf.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-qIeNbtNf.d.mts","names":[],"sources":["../../../shared/src/types.ts","../../../js-server-sdk/src/types.ts"],"mappings":";cAAa,cAAA;AAAA,KAUD,UAAA,WAAqB,cAAA;AAAA,KAErB,kBAAA;EAAA,CAAwB,GAAA;AAAA;AAAA,KAExB,eAAA,wCAAuD,kBAAA;AAAA,KAEvD,WAAA;EACV,EAAA;EACA,GAAA;EACA,IAAA,EAAM,UAAA;EACN,KAAA;EACA,OAAA;AAAA;AAAA,KAQU,0BAAA;AAAA,UAEK,oBAAA;EACf,KAAA,CAAM,OAAA,aAAoB,IAAA;EAE1B,IAAA,CAAK,OAAA,aAAoB,IAAA;EAEzB,IAAA,CAAK,OAAA,aAAoB,IAAA;EAEzB,KAAA,CAAM,OAAA,aAAoB,IAAA;AAAA;AAAA,UAGX,iCAAA;EACf,eAAA,CAAgB,OAAA;AAAA;AAAA,KAGN,gBAAA;AAAA,KAUA,gBAAA;EACV,GAAA;EACA,KAAA,EAAO,eAAA;EACP,OAAA;EACA,cAAA;EACA,MAAA,EAAQ,gBAAA;EACR,OAAA,GAAU,qBAAA;AAAA;;;AA9BZ;;KAoCY,qBAAA;EApCyB;;;;;;;;EA6CnC,EAAA;EAxCyB;;;;EA8CzB,IAAA;EA5C8B;AAGhC;;;EA+CE,MAAA;IAAA,CAAY,GAAA;EAAA;EA3Cc;;;;AAU5B;;;EA0CE,SAAA;AAAA;;;;;KAOU,yBAAA;EACV,UAAA;EACA,OAAA;AAAA;AAAA,KAGU,cAAA;;;;;AAnGZ;KCkBY,2BAAA;;;;EAIV,QAAA,GAAW,yBAAA;EDpBiB;;;ECwB5B,UAAA;IDtBU;;;;;AAEZ;;;;IC8BI,IAAA,GAAO,cAAA;ID5BT;;;;;;;ICoCE,eAAA;IDzBkC;;;;AAEtC;;;;ICgCI,OAAA;ID/BI;;;;;ICqCJ,GAAA;EAAA;EDjCuB;;;;;;AAK3B;;;;;AAIA;;ECuCE,MAAA,GAAS,oBAAA;EDvCiB;;AAU5B;;;;;ECsCE,SAAA;IDhC+B;;;;;;;;;IC0C7B,eAAA;ID1CQ;;;AAMZ;;;;;IC8CI,aAAA;EAAA;EDzBU;;;;AAgBd;;;;;AAKA;;;;;;ECsBE,KAAA,GAAQ,WAAA;AAAA;AAAA,KAGE,YAAA;EACV,cAAA;IAAkB,IAAA;IAAgB,WAAA;EAAA;EAClC,WAAA;EACA,eAAA;IAAmB,UAAA,EAAY,gBAAA;EAAA;EAC/B,eAAA;IAAmB,KAAA,EAAO,KAAA;EAAA;AAAA;AAAA,KAGhB,WAAA;EACV,WAAA,GAAc,WAAA,kBAA6B,WAAA;EAC3C,cAAA,GAAiB,WAAA,qBAAgC,WAAA;EACjD,eAAA,GAAkB,WAAA,sBAAiC,WAAA;EACnD,eAAA,GAAkB,WAAA,sBAAiC,WAAA;AAAA;AAAA,KAGzC,WAAA,sBAAiC,YAAA,KAAiB,OAAA,EAAS,YAAA,CAAa,MAAA;AAAA,KAExE,YAAA,WAAuB,eAAA,KAAoB,OAAA,EAAS,CAAA;;;;;;AAhBhE;UAwBiB,oBAAA;;;;;;;;;;;;EAYf,UAAA,IAAc,OAAA;EAhCiB;;AAGjC;;;;EAHiC,IAwC3B,OAAA;EAnCa;;;;;;;;;;EA+CjB,QAAA,WAAmB,eAAA,EAAiB,SAAA,UAAmB,YAAA,EAAc,CAAA,EAAG,OAAA,GAAU,qBAAA,GAAwB,CAAA;EA/C1G;;;;;;;;;;;AAKF;EAwDE,KAAA,WAAgB,eAAA,EACd,SAAA,UACA,YAAA,EAAc,CAAA,EACd,QAAA,EAAU,YAAA,CAAa,CAAA,GACvB,OAAA,GAAU,qBAAA;EA5DS;;;;;;;;EAuErB,OAAA,WAAkB,eAAA,EAAiB,SAAA,UAAmB,QAAA,GAAW,YAAA,CAAa,CAAA;EAvEI;;;EA4ElF,UAAA;EA1EU;;;;;;;EAmFV,aAAA,CAAc,OAAA;IACZ,OAAA,GAAU,qBAAA;IACV,UAAA;EAAA,IACE,MAAA,SAAe,WAAA;EAEnB,EAAA,iBAAmB,YAAA,EAAc,SAAA,EAAW,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,YAAA,CAAa,CAAA;EAE5E,GAAA,iBAAoB,YAAA,EAAc,SAAA,EAAW,CAAA,EAAG,OAAA,IAAW,IAAA,EAAM,YAAA,CAAa,CAAA;EAtEhE;;;;;;EA8Ed,OAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@configdirector/nextjs-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Next.js SDK for ConfigDirector. ConfigDirector is a remote configuration and feature flag service.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ConfigDirector",
|
|
@@ -33,6 +33,16 @@
|
|
|
33
33
|
"default": "./dist/server/index.mjs"
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
|
+
"./server/testing": {
|
|
37
|
+
"require": {
|
|
38
|
+
"types": "./dist/server/testing.d.cts",
|
|
39
|
+
"default": "./dist/server/testing.cjs"
|
|
40
|
+
},
|
|
41
|
+
"default": {
|
|
42
|
+
"types": "./dist/server/testing.d.mts",
|
|
43
|
+
"default": "./dist/server/testing.mjs"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
36
46
|
"./client": {
|
|
37
47
|
"require": {
|
|
38
48
|
"types": "./dist/client/index.d.cts",
|
|
@@ -42,6 +52,32 @@
|
|
|
42
52
|
"types": "./dist/client/index.d.mts",
|
|
43
53
|
"default": "./dist/client/index.mjs"
|
|
44
54
|
}
|
|
55
|
+
},
|
|
56
|
+
"./client/testing": {
|
|
57
|
+
"require": {
|
|
58
|
+
"types": "./dist/client/testing.d.cts",
|
|
59
|
+
"default": "./dist/client/testing.cjs"
|
|
60
|
+
},
|
|
61
|
+
"default": {
|
|
62
|
+
"types": "./dist/client/testing.d.mts",
|
|
63
|
+
"default": "./dist/client/testing.mjs"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"typesVersions": {
|
|
68
|
+
"*": {
|
|
69
|
+
"server": [
|
|
70
|
+
"./dist/server/index.d.mts"
|
|
71
|
+
],
|
|
72
|
+
"client": [
|
|
73
|
+
"./dist/client/index.d.mts"
|
|
74
|
+
],
|
|
75
|
+
"server/testing": [
|
|
76
|
+
"./dist/server/testing.d.mts"
|
|
77
|
+
],
|
|
78
|
+
"client/testing": [
|
|
79
|
+
"./dist/client/testing.d.mts"
|
|
80
|
+
]
|
|
45
81
|
}
|
|
46
82
|
},
|
|
47
83
|
"files": [
|
|
@@ -89,7 +125,6 @@
|
|
|
89
125
|
"vitest": "^4.1.8"
|
|
90
126
|
},
|
|
91
127
|
"dependencies": {
|
|
92
|
-
"@jsonjoy.com/json-pointer": "^18.1.0",
|
|
93
128
|
"rapidhash-js": "^3.0.0",
|
|
94
129
|
"semver": "^7.7.4"
|
|
95
130
|
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{i as e,r as t,t as n}from"./errors-B1AJJTZ-.mjs";import r,{EventEmitter as i}from"node:events";import{createHash as a,randomUUID as o}from"node:crypto";import{findByPointer as s}from"@jsonjoy.com/json-pointer";import*as c from"semver";import{rapidhash as l}from"rapidhash-js";var u=class e extends Error{constructor(t){super(t),this.name=`StreamClosedError`,Object.setPrototypeOf(this,e.prototype)}},d=class e extends Error{constructor(t){super(t),this.name=`MissingResponseBodyError`,Object.setPrototypeOf(this,e.prototype)}},f=class e extends Error{constructor(t){super(t),this.name=`InvalidOptionError`,Object.setPrototypeOf(this,e.prototype)}},p=class e extends Error{constructor(t){super(t),this.name=`ValueOutOfRangeError`,Object.setPrototypeOf(this,e.prototype)}},m=class{constructor(e){this.isFirstChunk=!0,this.bufferedInput=``,this.currentEvent={data:``},this.currentEvent={data:``},this.onEvent=e.onEvent??(()=>{}),this.onRetry=e.onRetry,this.onComment=e.onComment}parse(e){let t=e;this.isFirstChunk&&(this.isFirstChunk=!1,t.startsWith(``)?t=t.slice(1):t.startsWith(``)&&(t=t.slice(3)));let n=this.scanLines(this.bufferedInput+t);for(let e of n)this.dispatchLine(e)}finish(){this.bufferedInput=``}scanLines(e){let t=[],n=0,r=0;for(;r<e.length;){let i=e[r];i===`\r`||i===`
|
|
2
|
-
`?(t.push(e.slice(n,r)),i===`\r`&&e[r+1]===`
|
|
3
|
-
`&&r++,r++,n=r):r++}return this.bufferedInput=e.slice(n),t}dispatchLine(e){if(e.startsWith(`:`)){this.onComment?.(this.extractValue(e,1));return}if(e===``){this.emitEvent();return}this.applyField(this.parseField(e))}emitEvent(){let e=this.currentEvent.data.endsWith(`
|
|
4
|
-
`)?this.currentEvent.data.slice(0,-1):this.currentEvent.data;e!==``&&this.onEvent({...this.currentEvent,id:this.lastEventId,data:e}),this.currentEvent={data:``}}applyField(e){switch(e.field){case`event`:this.currentEvent.type=e.value;break;case`data`:this.currentEvent.data+=e.value+`
|
|
5
|
-
`;break;case`id`:e.value.includes(`\0`)||(this.lastEventId=e.value);break;case`retry`:/^\d+$/.test(e.value)&&this.onRetry?.(Number.parseInt(e.value,10));break;default:break}}parseField(e){let t=e.indexOf(`:`);return t===-1?{field:e,value:``}:{field:e.slice(0,t),value:this.extractValue(e,t+1)}}extractValue(e,t){return e[t]===` `?e.slice(t+1):e.slice(t)}};let h=function(e){return e.OPEN=`open`,e.CLOSED=`closed`,e.CONNECTING=`connecting`,e}({});var ee=class{constructor(e){this.DEFAULT_SHOULD_RECONNECT=()=>!0,this.DEFAULT_CALCULATE_RECONNECT_DELAY=()=>this.serverReconnectionTime,this.reconnectAttempt=0,this.abortController=new AbortController,this._readyState=h.CLOSED,this.serverReconnectionTime=2e3,this.url=e.url.toString(),this.lastEventId=e.lastEventId,this.headers={Accept:`text/event-stream`,...e.headers};let t=e.body;this.body=typeof t==`function`?t:()=>t,this.requestOptions={method:e.method??`GET`,mode:e.mode,credentials:e.credentials,redirect:e.redirect,referrer:e.referrer,referrerPolicy:e.referrerPolicy},this._fetch=e.fetch??((e,t)=>fetch(e,t)),this._onError=this.resolveCallback(e.onError,()=>{},`onError`),this._onConnect=this.resolveCallback(e.onConnect,()=>{},`onConnect`),this._onDisconnect=this.resolveCallback(e.onDisconnect,()=>{},`onDisconnect`),this._onMessage=this.resolveCallback(e.onMessage,()=>{},`onMessage`),this._onComment=this.resolveCallback(e.onComment,()=>{},`onComment`),this._shouldReconnect=this.resolveCallback(e.shouldReconnect,this.DEFAULT_SHOULD_RECONNECT,`shouldReconnect`),this._calculateReconnectDelay=this.resolveCallback(e.calculateReconnectDelay,this.DEFAULT_CALCULATE_RECONNECT_DELAY,`calculateReconnectDelay`)}set onError(e){this._onError=this.resolveCallback(e,()=>{},`onError`)}set onMessage(e){this._onMessage=this.resolveCallback(e,()=>{},`onMessage`)}set onComment(e){this._onComment=this.resolveCallback(e,()=>{},`onComment`)}set onConnect(e){this._onConnect=this.resolveCallback(e,()=>{},`onConnect`)}set onDisconnect(e){this._onDisconnect=this.resolveCallback(e,()=>{},`onDisconnect`)}set shouldReconnect(e){this._shouldReconnect=this.resolveCallback(e,this.DEFAULT_SHOULD_RECONNECT,`shouldReconnect`)}set calculateReconnectDelay(e){this._calculateReconnectDelay=this.resolveCallback(e,this.DEFAULT_CALCULATE_RECONNECT_DELAY,`shouldReconnect`)}get readyState(){return this._readyState}connect(){this._readyState===h.CLOSED&&(this.reconnectAttempt=0,this.initiateConnection())}close(){clearTimeout(this.reconnectTimeout),this._readyState=h.CLOSED,this.abortController.abort()}initiateConnection(){this.abortController=new AbortController,this._readyState=h.CONNECTING,this._fetch(this.url,{...this.requestOptions,body:this.body(),headers:this.buildRequestHeaders(),signal:this.abortController.signal,cache:`no-store`}).then(e=>this.handleFetchResponse(e)).catch(e=>{if(e.name===`AbortError`||this.abortController.signal.aborted){this.close();return}this._onError(e),this.scheduleReconnect({error:e})})}async handleFetchResponse(e){let{body:t,status:n}=e;if(n===204){this.disconnected();return}if(n>=400){this.scheduleReconnect({status:n});return}if(!t)throw new d(`The server response did not have a body`);this._readyState=h.OPEN,this._onConnect(),this.reconnectAttempt=0;let r=new m({onEvent:e=>{typeof e.id==`string`&&(this.lastEventId=e.id),this._onMessage(e)},onComment:e=>this._onComment(e),onRetry:e=>this.serverReconnectionTime=e});await this.readResponseStream(t,r),this.scheduleReconnect({status:n,error:new u(`The server response stream was closed`)})}async readResponseStream(e,t){let n=e.getReader(),r=new TextDecoder,i=!1;for(;!i;){let e=await n.read();e.value&&t.parse(r.decode(e.value,{stream:!0})),i=e.done}t.finish()}disconnected(){clearTimeout(this.reconnectTimeout),this._readyState=h.CLOSED,this._onDisconnect()}buildRequestHeaders(){let e=this.lastEventId?{"Last-Event-ID":this.lastEventId}:void 0;return{...this.headers,...e}}scheduleReconnect(e){if(this.abortController.signal.aborted)return;clearTimeout(this.reconnectTimeout),this.reconnectAttempt+=1;let t={attempt:this.reconnectAttempt,status:e.status,error:e.error,serverReconnectionTime:this.serverReconnectionTime};if(!this._shouldReconnect(t)){this.disconnected();return}this._readyState=h.CONNECTING;let n=this._calculateReconnectDelay(t);(!Number.isFinite(n)||n<1||n>1e3*60*60)&&(this._onError(new p(`The calculated reconnect delay is out of range: ${n}. Defaulting to ${this.serverReconnectionTime}`)),n=this.serverReconnectionTime),this.reconnectTimeout=setTimeout(()=>this.initiateConnection(),n)}resolveCallback(e,t,n){if(e==null)return t;if(typeof e!=`function`)throw new f(`${n} must be a function`);return e}};const te=e=>new ee(e),g=async(e,t,n,r)=>{let i=new AbortController,a=setTimeout(()=>{r.debug(`[fetchWithTimeout] Reached timeout, aborting request`),i.abort()},e);try{let e=await fetch(typeof t==`string`||t instanceof Request?t:t.toString(),{...n,signal:i.signal});return clearTimeout(a),e}catch(e){throw r.warn(`[fetchWithTimeout] Fetch error: `,e),clearTimeout(a),e}},ne=9e4;var re=class{constructor(e){this.options=e,this.eventEmitter=new i,this.options=e,this.logger=e.logger,this.url=new URL(`server/sse/v1`,e.baseUrl),this.heartbeatUrl=new URL(`server/heartbeat/v1`,e.baseUrl)}async connect(e){this.eventSource&&this.close();let t=new Promise((e,t)=>{this.eventSource=te({url:this.url,method:`POST`,headers:{"Content-Type":`application/json`},body:()=>this.buildRequestBody(),onMessage:({data:e})=>{this.dispatchMessage(e)},onConnect:()=>{this.logger.debug(`[StreamingTransport] Connected`),e(this)},shouldReconnect:e=>{let n=!this.isStatusFatal(e.status);if(!n){let n=this.prepareFatalError(e.status,e.error);this.eventEmitter.emit(`connectionError`,n),t(n)}return n},calculateReconnectDelay:e=>{let t=2**Math.min(e.attempt,9)*1e3,n=`[StreamingTransport] Scheduling reconnect attempt #${e.attempt} in ${t}ms.`;return e.attempt<=5?this.logger.info(n):this.logger.warn(n),t},onDisconnect:()=>{this.logger.debug(`[StreamingTransport] Disconnected`)}}),this.eventSource.connect()});return this.heartbeatTimer=setInterval(()=>this.sendHeartbeat(),ne),Promise.race([t,new Promise(t=>{setTimeout(()=>t(this),e)})])}get sessionId(){return this._sessionId}sendHeartbeat(){!this.isConnected||!this._sessionId||g(ne,this.heartbeatUrl,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({serverSdkKey:this.options.serverSdkKey,sessionId:this._sessionId})},this.logger).then(e=>{e.ok||this.logger.debug(`[StreamingTransport] Heartbeat failed with status: ${e.status}`)}).catch(e=>{this.logger.debug(`[StreamingTransport] Heartbeat failed: `,e)})}buildRequestBody(){return this._sessionId=o(),JSON.stringify({metaContext:this.options.metaContext,serverSdkKey:this.options.serverSdkKey,sessionId:this._sessionId})}dispatchMessage(e){try{let t=JSON.parse(e);this.eventEmitter.emit(`configBundleReceived`,t)}catch(e){this.logger.error(`[StreamingTransport] Error parsing and dispatching config data update: `,e)}}prepareFatalError(e,t){let r=e??0;return new n(`${`Connection failed with status: ${e??`unknown`}.`}${t?` Error: ${t}.`:``} This is an unrecoverable error, will not attempt to reconnect.`,r)}isStatusFatal(e){return!!e&&e>=400&&e<500&&e!=429}get isConnected(){return this.eventSource?.readyState==`open`}on(e,t){this.eventEmitter.on(e,t)}off(e,t){t?this.eventEmitter.off(e,t):this.eventEmitter.removeAllListeners(e)}clear(){this.eventEmitter.removeAllListeners()}close(){clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0,this.eventSource?.close()}dispose(){this.close(),this.clear()}},ie=class{constructor(){this.fatalError=!1,this.pollingIntervalSeconds=60}clearPollingInterval(){clearInterval(this.pollingInterval)}schedulePollingInterval(e){clearInterval(this.pollingInterval),!(this.pollingIntervalSeconds<=0)&&(this.pollingInterval=setInterval(e,this.pollingIntervalSeconds*1e3))}async handleNonOkResponse(e){if(!e.ok)throw this.isStatusFatal(e.status)?(this.fatalError=!0,this.close(),this.prepareFatalResponseStatusError(e.status,await e.text())):new n(`Connection failed with status: ${e.status}`,e.status)}handleFetchError(e){throw this.isFetchErrorFatal(e)?(this.fatalError=!0,this.close(),new n(`Connection failed with fatal error: ${e}. This is an unrecoverable error, retry attempts will be ignored.`)):e instanceof SyntaxError?new n(`Failed to parse the response from the server: ${e}`):new n(`Connection failed with error: ${e}.`)}prepareFatalResponseStatusError(e,t){let r=e??0;return new n(`${`Connection failed with status: ${e??`unknown`}`}${(t?.trim()?.length??0)>0?` (${t})`:``}. This is an unrecoverable error, retry attempts will be ignored.`,r)}isStatusFatal(e){return!!e&&e>=400&&e<500&&e!=429}isFetchErrorFatal(e){return e?.name===`NotAllowedError`}get isConnected(){return this.pollingInterval!==void 0}close(){clearInterval(this.pollingInterval),this.pollingInterval=void 0}dispose(){this.close(),this.clear()}},ae=class extends ie{constructor(e){super(),this.options=e,this.eventEmitter=new i,this._sessionId=o(),this.options=e,this.logger=e.logger,this.url=new URL(`server/polling/v1`,e.baseUrl),this.pollingIntervalSeconds=e.pollingInterval??300}async connect(e){this.clearPollingInterval();try{await this.fetchConfigs(e)}finally{this.fatalError||this.schedulePollingInterval(()=>{this.fetchConfigs(e).catch(e=>{this.logger.error(`[PollingTransport] Error during polling:`,e)})})}return this}get sessionId(){return this._sessionId}async fetchConfigs(e){if(this.fatalError){this.logger.warn(`[PollingTransport] There was a prior unrecoverable error. Ignoring attempt to reconnect.`);return}try{let t=await g(e,this.url,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({metaContext:this.options.metaContext,serverSdkKey:this.options.serverSdkKey,lastUpdateTimestamp:this.lastUpdateTimestamp,sessionId:this._sessionId})},this.logger);if(await this.handleNonOkResponse(t),t.status===200){let e=JSON.parse(await t.text());this.lastUpdateTimestamp=e.timestamp,this.eventEmitter.emit(`configBundleReceived`,e)}}catch(e){try{this.handleFetchError(e)}catch(e){throw this.fatalError&&this.eventEmitter.emit(`connectionError`,e),e}}}on(e,t){this.eventEmitter.on(e,t)}off(e,t){t?this.eventEmitter.off(e,t):this.eventEmitter.removeAllListeners(e)}clear(){this.eventEmitter.removeAllListeners()}};const oe=(e,t,n)=>{let r=n[0];switch(t.toLowerCase()){case`=`:case`equals`:return r!==void 0&&e===r;case`!=`:case`does not equal`:return r!==void 0&&e!==r;case`is one of`:return n.includes(e);case`is not one of`:return!n.includes(e);case`starts with any of`:return n.some(t=>e.startsWith(t));case`does not start with any of`:return!n.some(t=>e.startsWith(t));case`ends with any of`:return n.some(t=>e.endsWith(t));case`does not end with any of`:return!n.some(t=>e.endsWith(t));default:return!1}},se=(e,t,n)=>{let r=t.toLowerCase(),i=ce(e);if(i===void 0)return r===`!=`||r===`does not equal`;let a=n[0];if(a===void 0)return!1;let o=ce(a);if(o===void 0)return!1;switch(r){case`=`:case`equals`:return i===o;case`!=`:case`does not equal`:return i!==o;case`<`:return i<o;case`<=`:return i<=o;case`>`:return i>o;case`>=`:return i>=o;default:return!1}},ce=e=>{if(typeof e==`number`)return Number.isFinite(e)?e:void 0;if(typeof e!=`string`||e.length===0||!le(e))return;let t=Number(e);return Number.isFinite(t)?t:void 0},le=e=>{for(let t of e)if(!(t>=`0`&&t<=`9`)&&!`+-.eE`.includes(t))return!1;return!0};var _=class extends Error{},ue=class extends _{constructor(e){super(`Invalid DateTime: ${e.toMessage()}`)}},de=class extends _{constructor(e){super(`Invalid Interval: ${e.toMessage()}`)}},fe=class extends _{constructor(e){super(`Invalid Duration: ${e.toMessage()}`)}},v=class extends _{},pe=class extends _{constructor(e){super(`Invalid unit ${e}`)}},y=class extends _{},b=class extends _{constructor(){super(`Zone is an abstract class`)}};const x=`numeric`,S=`short`,C=`long`,me={year:x,month:x,day:x},he={year:x,month:S,day:x},ge={year:x,month:S,day:x,weekday:S},_e={year:x,month:C,day:x},ve={year:x,month:C,day:x,weekday:C},ye={hour:x,minute:x},be={hour:x,minute:x,second:x},xe={hour:x,minute:x,second:x,timeZoneName:S},Se={hour:x,minute:x,second:x,timeZoneName:C},Ce={hour:x,minute:x,hourCycle:`h23`},we={hour:x,minute:x,second:x,hourCycle:`h23`},Te={hour:x,minute:x,second:x,hourCycle:`h23`,timeZoneName:S},Ee={hour:x,minute:x,second:x,hourCycle:`h23`,timeZoneName:C},De={year:x,month:x,day:x,hour:x,minute:x},Oe={year:x,month:x,day:x,hour:x,minute:x,second:x},ke={year:x,month:S,day:x,hour:x,minute:x},Ae={year:x,month:S,day:x,hour:x,minute:x,second:x},je={year:x,month:S,day:x,weekday:S,hour:x,minute:x},Me={year:x,month:C,day:x,hour:x,minute:x,timeZoneName:S},Ne={year:x,month:C,day:x,hour:x,minute:x,second:x,timeZoneName:S},Pe={year:x,month:C,day:x,weekday:C,hour:x,minute:x,timeZoneName:C},Fe={year:x,month:C,day:x,weekday:C,hour:x,minute:x,second:x,timeZoneName:C};var Ie=class{get type(){throw new b}get name(){throw new b}get ianaName(){return this.name}get isUniversal(){throw new b}offsetName(e,t){throw new b}formatOffset(e,t){throw new b}offset(e){throw new b}equals(e){throw new b}get isValid(){throw new b}};let Le=null;var Re=class e extends Ie{static get instance(){return Le===null&&(Le=new e),Le}get type(){return`system`}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return dn(e,t,n)}formatOffset(e,t){return hn(this.offset(e),t)}offset(e){return-new Date(e).getTimezoneOffset()}equals(e){return e.type===`system`}get isValid(){return!0}};const ze=new Map;function Be(e){let t=ze.get(e);return t===void 0&&(t=new Intl.DateTimeFormat(`en-US`,{hour12:!1,timeZone:e,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,era:`short`}),ze.set(e,t)),t}const Ve={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function He(e,t){let n=e.format(t).replace(/\u200E/g,``),[,r,i,a,o,s,c,l]=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(n);return[a,r,i,o,s,c,l]}function Ue(e,t){let n=e.formatToParts(t),r=[];for(let e=0;e<n.length;e++){let{type:t,value:i}=n[e],a=Ve[t];t===`era`?r[a]=i:M(a)||(r[a]=parseInt(i,10))}return r}const We=new Map;var w=class e extends Ie{static create(t){let n=We.get(t);return n===void 0&&We.set(t,n=new e(t)),n}static resetCache(){We.clear(),ze.clear()}static isValidSpecifier(e){return this.isValidZone(e)}static isValidZone(e){if(!e)return!1;try{return new Intl.DateTimeFormat(`en-US`,{timeZone:e}).format(),!0}catch{return!1}}constructor(t){super(),this.zoneName=t,this.valid=e.isValidZone(t)}get type(){return`iana`}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return dn(e,t,n,this.name)}formatOffset(e,t){return hn(this.offset(e),t)}offset(e){if(!this.valid)return NaN;let t=new Date(e);if(isNaN(t))return NaN;let n=Be(this.name),[r,i,a,o,s,c,l]=n.formatToParts?Ue(n,t):He(n,t);o===`BC`&&(r=-Math.abs(r)+1);let u=sn({year:r,month:i,day:a,hour:s===24?0:s,minute:c,second:l,millisecond:0}),d=+t,f=d%1e3;return d-=f>=0?f:1e3+f,(u-d)/(60*1e3)}equals(e){return e.type===`iana`&&e.name===this.name}get isValid(){return this.valid}};let Ge={};function Ke(e,t={}){let n=JSON.stringify([e,t]),r=Ge[n];return r||(r=new Intl.ListFormat(e,t),Ge[n]=r),r}const qe=new Map;function Je(e,t={}){let n=JSON.stringify([e,t]),r=qe.get(n);return r===void 0&&(r=new Intl.DateTimeFormat(e,t),qe.set(n,r)),r}const Ye=new Map;function Xe(e,t={}){let n=JSON.stringify([e,t]),r=Ye.get(n);return r===void 0&&(r=new Intl.NumberFormat(e,t),Ye.set(n,r)),r}const Ze=new Map;function Qe(e,t={}){let{base:n,...r}=t,i=JSON.stringify([e,r]),a=Ze.get(i);return a===void 0&&(a=new Intl.RelativeTimeFormat(e,t),Ze.set(i,a)),a}let $e=null;function et(){return $e||($e=new Intl.DateTimeFormat().resolvedOptions().locale,$e)}const tt=new Map;function nt(e){let t=tt.get(e);return t===void 0&&(t=new Intl.DateTimeFormat(e).resolvedOptions(),tt.set(e,t)),t}const rt=new Map;function it(e){let t=rt.get(e);if(!t){let n=new Intl.Locale(e);t=`getWeekInfo`in n?n.getWeekInfo():n.weekInfo,`minimalDays`in t||(t={...mt,...t}),rt.set(e,t)}return t}function at(e){let t=e.indexOf(`-x-`);t!==-1&&(e=e.substring(0,t));let n=e.indexOf(`-u-`);if(n===-1)return[e];{let t,r;try{t=Je(e).resolvedOptions(),r=e}catch{let i=e.substring(0,n);t=Je(i).resolvedOptions(),r=i}let{numberingSystem:i,calendar:a}=t;return[r,i,a]}}function ot(e,t,n){return n||t?(e.includes(`-u-`)||(e+=`-u`),n&&(e+=`-ca-${n}`),t&&(e+=`-nu-${t}`),e):e}function st(e){let t=[];for(let n=1;n<=12;n++){let r=$.utc(2009,n,1);t.push(e(r))}return t}function ct(e){let t=[];for(let n=1;n<=7;n++){let r=$.utc(2016,11,13+n);t.push(e(r))}return t}function lt(e,t,n,r){let i=e.listingMode();return i===`error`?null:i===`en`?n(t):r(t)}function ut(e){return e.numberingSystem&&e.numberingSystem!==`latn`?!1:e.numberingSystem===`latn`||!e.locale||e.locale.startsWith(`en`)||nt(e.locale).numberingSystem===`latn`}var dt=class{constructor(e,t,n){this.padTo=n.padTo||0,this.floor=n.floor||!1;let{padTo:r,floor:i,...a}=n;if(!t||Object.keys(a).length>0){let t={useGrouping:!1,...n};n.padTo>0&&(t.minimumIntegerDigits=n.padTo),this.inf=Xe(e,t)}}format(e){if(this.inf){let t=this.floor?Math.floor(e):e;return this.inf.format(t)}else return I(this.floor?Math.floor(e):rn(e,3),this.padTo)}},ft=class{constructor(e,t,n){this.opts=n,this.originalZone=void 0;let r;if(this.opts.timeZone)this.dt=e;else if(e.zone.type===`fixed`){let t=-1*(e.offset/60),n=t>=0?`Etc/GMT+${t}`:`Etc/GMT${t}`;e.offset!==0&&w.create(n).valid?(r=n,this.dt=e):(r=`UTC`,this.dt=e.offset===0?e:e.setZone(`UTC`).plus({minutes:e.offset}),this.originalZone=e.zone)}else e.zone.type===`system`?this.dt=e:e.zone.type===`iana`?(this.dt=e,r=e.zone.name):(r=`UTC`,this.dt=e.setZone(`UTC`).plus({minutes:e.offset}),this.originalZone=e.zone);let i={...this.opts};i.timeZone=i.timeZone||r,this.dtf=Je(t,i)}format(){return this.originalZone?this.formatToParts().map(({value:e})=>e).join(``):this.dtf.format(this.dt.toJSDate())}formatToParts(){let e=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?e.map(e=>{if(e.type===`timeZoneName`){let t=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:t}}else return e}):e}resolvedOptions(){return this.dtf.resolvedOptions()}},pt=class{constructor(e,t,n){this.opts={style:`long`,...n},!t&&Yt()&&(this.rtf=Qe(e,n))}format(e,t){return this.rtf?this.rtf.format(e,t):Pn(t,e,this.opts.numeric,this.opts.style!==`long`)}formatToParts(e,t){return this.rtf?this.rtf.formatToParts(e,t):[]}};const mt={firstDay:1,minimalDays:4,weekend:[6,7]};var T=class e{static fromOpts(t){return e.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,n,r,i,a=!1){let o=t||k.defaultLocale;return new e(o||(a?`en-US`:et()),n||k.defaultNumberingSystem,r||k.defaultOutputCalendar,en(i)||k.defaultWeekSettings,o)}static resetCache(){$e=null,qe.clear(),Ye.clear(),Ze.clear(),tt.clear(),rt.clear()}static fromObject({locale:t,numberingSystem:n,outputCalendar:r,weekSettings:i}={}){return e.create(t,n,r,i)}constructor(e,t,n,r,i){let[a,o,s]=at(e);this.locale=a,this.numberingSystem=t||o||null,this.outputCalendar=n||s||null,this.weekSettings=r,this.intl=ot(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=i,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached??(this.fastNumbersCached=ut(this)),this.fastNumbersCached}listingMode(){let e=this.isEnglish(),t=(this.numberingSystem===null||this.numberingSystem===`latn`)&&(this.outputCalendar===null||this.outputCalendar===`gregory`);return e&&t?`en`:`intl`}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:e.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,en(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(e={}){return this.clone({...e,defaultToEN:!0})}redefaultToSystem(e={}){return this.clone({...e,defaultToEN:!1})}months(e,t=!1){return lt(this,e,bn,()=>{let n=this.intl===`ja`||this.intl.startsWith(`ja-`);t&=!n;let r=t?{month:e,day:`numeric`}:{month:e},i=t?`format`:`standalone`;if(!this.monthsCache[i][e]){let t=n?e=>this.dtFormatter(e,r).format():e=>this.extract(e,r,`month`);this.monthsCache[i][e]=st(t)}return this.monthsCache[i][e]})}weekdays(e,t=!1){return lt(this,e,wn,()=>{let n=t?{weekday:e,year:`numeric`,month:`long`,day:`numeric`}:{weekday:e},r=t?`format`:`standalone`;return this.weekdaysCache[r][e]||(this.weekdaysCache[r][e]=ct(e=>this.extract(e,n,`weekday`))),this.weekdaysCache[r][e]})}meridiems(){return lt(this,void 0,()=>Tn,()=>{if(!this.meridiemCache){let e={hour:`numeric`,hourCycle:`h12`};this.meridiemCache=[$.utc(2016,11,13,9),$.utc(2016,11,13,19)].map(t=>this.extract(t,e,`dayperiod`))}return this.meridiemCache})}eras(e){return lt(this,e,kn,()=>{let t={era:e};return this.eraCache[e]||(this.eraCache[e]=[$.utc(-40,1,1),$.utc(2017,1,1)].map(e=>this.extract(e,t,`era`))),this.eraCache[e]})}extract(e,t,n){let r=this.dtFormatter(e,t).formatToParts().find(e=>e.type.toLowerCase()===n);return r?r.value:null}numberFormatter(e={}){return new dt(this.intl,e.forceSimple||this.fastNumbers,e)}dtFormatter(e,t={}){return new ft(e,this.intl,t)}relFormatter(e={}){return new pt(this.intl,this.isEnglish(),e)}listFormatter(e={}){return Ke(this.intl,e)}isEnglish(){return this.locale===`en`||this.locale.toLowerCase()===`en-us`||nt(this.intl).locale.startsWith(`en-us`)}getWeekSettings(){return this.weekSettings?this.weekSettings:Xt()?it(this.locale):mt}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}};let ht=null;var E=class e extends Ie{static get utcInstance(){return ht===null&&(ht=new e(0)),ht}static instance(t){return t===0?e.utcInstance:new e(t)}static parseSpecifier(t){if(t){let n=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(n)return new e(fn(n[1],n[2]))}return null}constructor(e){super(),this.fixed=e}get type(){return`fixed`}get name(){return this.fixed===0?`UTC`:`UTC${hn(this.fixed,`narrow`)}`}get ianaName(){return this.fixed===0?`Etc/UTC`:`Etc/GMT${hn(-this.fixed,`narrow`)}`}offsetName(){return this.name}formatOffset(e,t){return hn(this.fixed,t)}get isUniversal(){return!0}offset(){return this.fixed}equals(e){return e.type===`fixed`&&e.fixed===this.fixed}get isValid(){return!0}},gt=class extends Ie{constructor(e){super(),this.zoneName=e}get type(){return`invalid`}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return``}offset(){return NaN}equals(){return!1}get isValid(){return!1}};function D(e,t){if(M(e)||e===null)return t;if(e instanceof Ie)return e;if(qt(e)){let n=e.toLowerCase();return n===`default`?t:n===`local`||n===`system`?Re.instance:n===`utc`||n===`gmt`?E.utcInstance:E.parseSpecifier(n)||w.create(e)}else if(N(e))return E.instance(e);else if(typeof e==`object`&&`offset`in e&&typeof e.offset==`function`)return e;else return new gt(e)}const _t={arab:`[٠-٩]`,arabext:`[۰-۹]`,bali:`[᭐-᭙]`,beng:`[০-৯]`,deva:`[०-९]`,fullwide:`[0-9]`,gujr:`[૦-૯]`,hanidec:`[〇|一|二|三|四|五|六|七|八|九]`,khmr:`[០-៩]`,knda:`[೦-೯]`,laoo:`[໐-໙]`,limb:`[᥆-᥏]`,mlym:`[൦-൯]`,mong:`[᠐-᠙]`,mymr:`[၀-၉]`,orya:`[୦-୯]`,tamldec:`[௦-௯]`,telu:`[౦-౯]`,thai:`[๐-๙]`,tibt:`[༠-༩]`,latn:`\\d`},vt={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},yt=_t.hanidec.replace(/[\[|\]]/g,``).split(``);function bt(e){let t=parseInt(e,10);if(isNaN(t)){t=``;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);if(e[n].search(_t.hanidec)!==-1)t+=yt.indexOf(e[n]);else for(let e in vt){let[n,i]=vt[e];r>=n&&r<=i&&(t+=r-n)}}return parseInt(t,10)}else return t}const xt=new Map;function St(){xt.clear()}function O({numberingSystem:e},t=``){let n=e||`latn`,r=xt.get(n);r===void 0&&(r=new Map,xt.set(n,r));let i=r.get(t);return i===void 0&&(i=RegExp(`${_t[n]}${t}`),r.set(t,i)),i}let Ct=()=>Date.now(),wt=`system`,Tt=null,Et=null,Dt=null,Ot=60,kt,At=null;var k=class{static get now(){return Ct}static set now(e){Ct=e}static set defaultZone(e){wt=e}static get defaultZone(){return D(wt,Re.instance)}static get defaultLocale(){return Tt}static set defaultLocale(e){Tt=e}static get defaultNumberingSystem(){return Et}static set defaultNumberingSystem(e){Et=e}static get defaultOutputCalendar(){return Dt}static set defaultOutputCalendar(e){Dt=e}static get defaultWeekSettings(){return At}static set defaultWeekSettings(e){At=en(e)}static get twoDigitCutoffYear(){return Ot}static set twoDigitCutoffYear(e){Ot=e%100}static get throwOnInvalid(){return kt}static set throwOnInvalid(e){kt=e}static resetCaches(){T.resetCache(),w.resetCache(),$.resetCache(),St()}},A=class{constructor(e,t){this.reason=e,this.explanation=t}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}};const jt=[0,31,59,90,120,151,181,212,243,273,304,334],Mt=[0,31,60,91,121,152,182,213,244,274,305,335];function j(e,t){return new A(`unit out of range`,`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function Nt(e,t,n){let r=new Date(Date.UTC(e,t-1,n));e<100&&e>=0&&r.setUTCFullYear(r.getUTCFullYear()-1900);let i=r.getUTCDay();return i===0?7:i}function Pt(e,t,n){return n+(an(e)?Mt:jt)[t-1]}function Ft(e,t){let n=an(e)?Mt:jt,r=n.findIndex(e=>e<t),i=t-n[r];return{month:r+1,day:i}}function It(e,t){return(e-t+7)%7+1}function Lt(e,t=4,n=1){let{year:r,month:i,day:a}=e,o=Pt(r,i,a),s=It(Nt(r,i,a),n),c=Math.floor((o-s+14-t)/7),l;return c<1?(l=r-1,c=ln(l,t,n)):c>ln(r,t,n)?(l=r+1,c=1):l=r,{weekYear:l,weekNumber:c,weekday:s,...gn(e)}}function Rt(e,t=4,n=1){let{weekYear:r,weekNumber:i,weekday:a}=e,o=It(Nt(r,1,t),n),s=z(r),c=i*7+a-o-7+t,l;c<1?(l=r-1,c+=z(l)):c>s?(l=r+1,c-=z(r)):l=r;let{month:u,day:d}=Ft(l,c);return{year:l,month:u,day:d,...gn(e)}}function zt(e){let{year:t,month:n,day:r}=e;return{year:t,ordinal:Pt(t,n,r),...gn(e)}}function Bt(e){let{year:t,ordinal:n}=e,{month:r,day:i}=Ft(t,n);return{year:t,month:r,day:i,...gn(e)}}function Vt(e,t){if(!M(e.localWeekday)||!M(e.localWeekNumber)||!M(e.localWeekYear)){if(!M(e.weekday)||!M(e.weekNumber)||!M(e.weekYear))throw new v(`Cannot mix locale-based week fields with ISO-based week fields`);return M(e.localWeekday)||(e.weekday=e.localWeekday),M(e.localWeekNumber)||(e.weekNumber=e.localWeekNumber),M(e.localWeekYear)||(e.weekYear=e.localWeekYear),delete e.localWeekday,delete e.localWeekNumber,delete e.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function Ht(e,t=4,n=1){let r=Kt(e.weekYear),i=F(e.weekNumber,1,ln(e.weekYear,t,n)),a=F(e.weekday,1,7);return r?i?a?!1:j(`weekday`,e.weekday):j(`week`,e.weekNumber):j(`weekYear`,e.weekYear)}function Ut(e){let t=Kt(e.year),n=F(e.ordinal,1,z(e.year));return t?n?!1:j(`ordinal`,e.ordinal):j(`year`,e.year)}function Wt(e){let t=Kt(e.year),n=F(e.month,1,12),r=F(e.day,1,on(e.year,e.month));return t?n?r?!1:j(`day`,e.day):j(`month`,e.month):j(`year`,e.year)}function Gt(e){let{hour:t,minute:n,second:r,millisecond:i}=e,a=F(t,0,23)||t===24&&n===0&&r===0&&i===0,o=F(n,0,59),s=F(r,0,59),c=F(i,0,999);return a?o?s?c?!1:j(`millisecond`,i):j(`second`,r):j(`minute`,n):j(`hour`,t)}function M(e){return e===void 0}function N(e){return typeof e==`number`}function Kt(e){return typeof e==`number`&&e%1==0}function qt(e){return typeof e==`string`}function Jt(e){return Object.prototype.toString.call(e)===`[object Date]`}function Yt(){try{return typeof Intl<`u`&&!!Intl.RelativeTimeFormat}catch{return!1}}function Xt(){try{return typeof Intl<`u`&&!!Intl.Locale&&(`weekInfo`in Intl.Locale.prototype||`getWeekInfo`in Intl.Locale.prototype)}catch{return!1}}function Zt(e){return Array.isArray(e)?e:[e]}function Qt(e,t,n){if(e.length!==0)return e.reduce((e,r)=>{let i=[t(r),r];return e&&n(e[0],i[0])===e[0]?e:i},null)[1]}function $t(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function P(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function en(e){if(e==null)return null;if(typeof e!=`object`)throw new y(`Week settings must be an object`);if(!F(e.firstDay,1,7)||!F(e.minimalDays,1,7)||!Array.isArray(e.weekend)||e.weekend.some(e=>!F(e,1,7)))throw new y(`Invalid week settings`);return{firstDay:e.firstDay,minimalDays:e.minimalDays,weekend:Array.from(e.weekend)}}function F(e,t,n){return Kt(e)&&e>=t&&e<=n}function tn(e,t){return e-t*Math.floor(e/t)}function I(e,t=2){let n=e<0,r;return r=n?`-`+(``+-e).padStart(t,`0`):(``+e).padStart(t,`0`),r}function L(e){if(!(M(e)||e===null||e===``))return parseInt(e,10)}function R(e){if(!(M(e)||e===null||e===``))return parseFloat(e)}function nn(e){if(!(M(e)||e===null||e===``)){let t=parseFloat(`0.`+e)*1e3;return Math.floor(t)}}function rn(e,t,n=`round`){let r=10**t;switch(n){case`expand`:return e>0?Math.ceil(e*r)/r:Math.floor(e*r)/r;case`trunc`:return Math.trunc(e*r)/r;case`round`:return Math.round(e*r)/r;case`floor`:return Math.floor(e*r)/r;case`ceil`:return Math.ceil(e*r)/r;default:throw RangeError(`Value rounding ${n} is out of range`)}}function an(e){return e%4==0&&(e%100!=0||e%400==0)}function z(e){return an(e)?366:365}function on(e,t){let n=tn(t-1,12)+1,r=e+(t-n)/12;return n===2?an(r)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][n-1]}function sn(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t),t.setUTCFullYear(e.year,e.month-1,e.day)),+t}function cn(e,t,n){return-It(Nt(e,1,t),n)+t-1}function ln(e,t=4,n=1){let r=cn(e,t,n),i=cn(e+1,t,n);return(z(e)-r+i)/7}function un(e){return e>99?e:e>k.twoDigitCutoffYear?1900+e:2e3+e}function dn(e,t,n,r=null){let i=new Date(e),a={hourCycle:`h23`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`};r&&(a.timeZone=r);let o={timeZoneName:t,...a},s=new Intl.DateTimeFormat(n,o).formatToParts(i).find(e=>e.type.toLowerCase()===`timezonename`);return s?s.value:null}function fn(e,t){let n=parseInt(e,10);Number.isNaN(n)&&(n=0);let r=parseInt(t,10)||0,i=n<0||Object.is(n,-0)?-r:r;return n*60+i}function pn(e){let t=Number(e);if(typeof e==`boolean`||e===``||!Number.isFinite(t))throw new y(`Invalid unit value ${e}`);return t}function mn(e,t){let n={};for(let r in e)if(P(e,r)){let i=e[r];if(i==null)continue;n[t(r)]=pn(i)}return n}function hn(e,t){let n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),i=e>=0?`+`:`-`;switch(t){case`short`:return`${i}${I(n,2)}:${I(r,2)}`;case`narrow`:return`${i}${n}${r>0?`:${r}`:``}`;case`techie`:return`${i}${I(n,2)}${I(r,2)}`;default:throw RangeError(`Value format ${t} is out of range for property format`)}}function gn(e){return $t(e,[`hour`,`minute`,`second`,`millisecond`])}const _n=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],vn=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],yn=[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`];function bn(e){switch(e){case`narrow`:return[...yn];case`short`:return[...vn];case`long`:return[..._n];case`numeric`:return[`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`,`12`];case`2-digit`:return[`01`,`02`,`03`,`04`,`05`,`06`,`07`,`08`,`09`,`10`,`11`,`12`];default:return null}}const xn=[`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`,`Sunday`],Sn=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],Cn=[`M`,`T`,`W`,`T`,`F`,`S`,`S`];function wn(e){switch(e){case`narrow`:return[...Cn];case`short`:return[...Sn];case`long`:return[...xn];case`numeric`:return[`1`,`2`,`3`,`4`,`5`,`6`,`7`];default:return null}}const Tn=[`AM`,`PM`],En=[`Before Christ`,`Anno Domini`],Dn=[`BC`,`AD`],On=[`B`,`A`];function kn(e){switch(e){case`narrow`:return[...On];case`short`:return[...Dn];case`long`:return[...En];default:return null}}function An(e){return Tn[e.hour<12?0:1]}function jn(e,t){return wn(t)[e.weekday-1]}function Mn(e,t){return bn(t)[e.month-1]}function Nn(e,t){return kn(t)[e.year<0?0:1]}function Pn(e,t,n=`always`,r=!1){let i={years:[`year`,`yr.`],quarters:[`quarter`,`qtr.`],months:[`month`,`mo.`],weeks:[`week`,`wk.`],days:[`day`,`day`,`days`],hours:[`hour`,`hr.`],minutes:[`minute`,`min.`],seconds:[`second`,`sec.`]},a=[`hours`,`minutes`,`seconds`].indexOf(e)===-1;if(n===`auto`&&a){let n=e===`days`;switch(t){case 1:return n?`tomorrow`:`next ${i[e][0]}`;case-1:return n?`yesterday`:`last ${i[e][0]}`;case 0:return n?`today`:`this ${i[e][0]}`}}let o=Object.is(t,-0)||t<0,s=Math.abs(t),c=s===1,l=i[e],u=r?c?l[1]:l[2]||l[1]:c?i[e][0]:e;return o?`${s} ${u} ago`:`in ${s} ${u}`}function Fn(e,t){let n=``;for(let r of e)r.literal?n+=r.val:n+=t(r.val);return n}const In={D:me,DD:he,DDD:_e,DDDD:ve,t:ye,tt:be,ttt:xe,tttt:Se,T:Ce,TT:we,TTT:Te,TTTT:Ee,f:De,ff:ke,fff:Me,ffff:Pe,F:Oe,FF:Ae,FFF:Ne,FFFF:Fe};var B=class e{static create(t,n={}){return new e(t,n)}static parseFormat(e){let t=null,n=``,r=!1,i=[];for(let a=0;a<e.length;a++){let o=e.charAt(a);o===`'`?((n.length>0||r)&&i.push({literal:r||/^\s+$/.test(n),val:n===``?`'`:n}),t=null,n=``,r=!r):r||o===t?n+=o:(n.length>0&&i.push({literal:/^\s+$/.test(n),val:n}),n=o,t=o)}return n.length>0&&i.push({literal:r||/^\s+$/.test(n),val:n}),i}static macroTokenToFormatOpts(e){return In[e]}constructor(e,t){this.opts=t,this.loc=e,this.systemLoc=null}formatWithSystemDefault(e,t){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(e,{...this.opts,...t}).format()}dtFormatter(e,t={}){return this.loc.dtFormatter(e,{...this.opts,...t})}formatDateTime(e,t){return this.dtFormatter(e,t).format()}formatDateTimeParts(e,t){return this.dtFormatter(e,t).formatToParts()}formatInterval(e,t){return this.dtFormatter(e.start,t).dtf.formatRange(e.start.toJSDate(),e.end.toJSDate())}resolvedOptions(e,t){return this.dtFormatter(e,t).resolvedOptions()}num(e,t=0,n=void 0){if(this.opts.forceSimple)return I(e,t);let r={...this.opts};return t>0&&(r.padTo=t),n&&(r.signDisplay=n),this.loc.numberFormatter(r).format(e)}formatDateTimeFromString(t,n){let r=this.loc.listingMode()===`en`,i=this.loc.outputCalendar&&this.loc.outputCalendar!==`gregory`,a=(e,n)=>this.loc.extract(t,e,n),o=e=>t.isOffsetFixed&&t.offset===0&&e.allowZ?`Z`:t.isValid?t.zone.formatOffset(t.ts,e.format):``,s=()=>r?An(t):a({hour:`numeric`,hourCycle:`h12`},`dayperiod`),c=(e,n)=>r?Mn(t,e):a(n?{month:e}:{month:e,day:`numeric`},`month`),l=(e,n)=>r?jn(t,e):a(n?{weekday:e}:{weekday:e,month:`long`,day:`numeric`},`weekday`),u=n=>{let r=e.macroTokenToFormatOpts(n);return r?this.formatWithSystemDefault(t,r):n},d=e=>r?Nn(t,e):a({era:e},`era`);return Fn(e.parseFormat(n),e=>{switch(e){case`S`:return this.num(t.millisecond);case`u`:case`SSS`:return this.num(t.millisecond,3);case`s`:return this.num(t.second);case`ss`:return this.num(t.second,2);case`uu`:return this.num(Math.floor(t.millisecond/10),2);case`uuu`:return this.num(Math.floor(t.millisecond/100));case`m`:return this.num(t.minute);case`mm`:return this.num(t.minute,2);case`h`:return this.num(t.hour%12==0?12:t.hour%12);case`hh`:return this.num(t.hour%12==0?12:t.hour%12,2);case`H`:return this.num(t.hour);case`HH`:return this.num(t.hour,2);case`Z`:return o({format:`narrow`,allowZ:this.opts.allowZ});case`ZZ`:return o({format:`short`,allowZ:this.opts.allowZ});case`ZZZ`:return o({format:`techie`,allowZ:this.opts.allowZ});case`ZZZZ`:return t.zone.offsetName(t.ts,{format:`short`,locale:this.loc.locale});case`ZZZZZ`:return t.zone.offsetName(t.ts,{format:`long`,locale:this.loc.locale});case`z`:return t.zoneName;case`a`:return s();case`d`:return i?a({day:`numeric`},`day`):this.num(t.day);case`dd`:return i?a({day:`2-digit`},`day`):this.num(t.day,2);case`c`:return this.num(t.weekday);case`ccc`:return l(`short`,!0);case`cccc`:return l(`long`,!0);case`ccccc`:return l(`narrow`,!0);case`E`:return this.num(t.weekday);case`EEE`:return l(`short`,!1);case`EEEE`:return l(`long`,!1);case`EEEEE`:return l(`narrow`,!1);case`L`:return i?a({month:`numeric`,day:`numeric`},`month`):this.num(t.month);case`LL`:return i?a({month:`2-digit`,day:`numeric`},`month`):this.num(t.month,2);case`LLL`:return c(`short`,!0);case`LLLL`:return c(`long`,!0);case`LLLLL`:return c(`narrow`,!0);case`M`:return i?a({month:`numeric`},`month`):this.num(t.month);case`MM`:return i?a({month:`2-digit`},`month`):this.num(t.month,2);case`MMM`:return c(`short`,!1);case`MMMM`:return c(`long`,!1);case`MMMMM`:return c(`narrow`,!1);case`y`:return i?a({year:`numeric`},`year`):this.num(t.year);case`yy`:return i?a({year:`2-digit`},`year`):this.num(t.year.toString().slice(-2),2);case`yyyy`:return i?a({year:`numeric`},`year`):this.num(t.year,4);case`yyyyyy`:return i?a({year:`numeric`},`year`):this.num(t.year,6);case`G`:return d(`short`);case`GG`:return d(`long`);case`GGGGG`:return d(`narrow`);case`kk`:return this.num(t.weekYear.toString().slice(-2),2);case`kkkk`:return this.num(t.weekYear,4);case`W`:return this.num(t.weekNumber);case`WW`:return this.num(t.weekNumber,2);case`n`:return this.num(t.localWeekNumber);case`nn`:return this.num(t.localWeekNumber,2);case`ii`:return this.num(t.localWeekYear.toString().slice(-2),2);case`iiii`:return this.num(t.localWeekYear,4);case`o`:return this.num(t.ordinal);case`ooo`:return this.num(t.ordinal,3);case`q`:return this.num(t.quarter);case`qq`:return this.num(t.quarter,2);case`X`:return this.num(Math.floor(t.ts/1e3));case`x`:return this.num(t.ts);default:return u(e)}})}formatDurationFromString(t,n){let r=this.opts.signMode===`negativeLargestOnly`?-1:1,i=e=>{switch(e[0]){case`S`:return`milliseconds`;case`s`:return`seconds`;case`m`:return`minutes`;case`h`:return`hours`;case`d`:return`days`;case`w`:return`weeks`;case`M`:return`months`;case`y`:return`years`;default:return null}},a=(e,t)=>n=>{let a=i(n);if(a){let i=t.isNegativeDuration&&a!==t.largestUnit?r:1,o;return o=this.opts.signMode===`negativeLargestOnly`&&a!==t.largestUnit?`never`:this.opts.signMode===`all`?`always`:`auto`,this.num(e.get(a)*i,n.length,o)}else return n},o=e.parseFormat(n),s=o.reduce((e,{literal:t,val:n})=>t?e:e.concat(n),[]),c=t.shiftTo(...s.map(i).filter(e=>e));return Fn(o,a(c,{isNegativeDuration:c<0,largestUnit:Object.keys(c.values)[0]}))}};const Ln=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function Rn(...e){let t=e.reduce((e,t)=>e+t.source,``);return RegExp(`^${t}$`)}function zn(...e){return t=>e.reduce(([e,n,r],i)=>{let[a,o,s]=i(t,r);return[{...e,...a},o||n,s]},[{},null,1]).slice(0,2)}function V(e,...t){if(e==null)return[null,null];for(let[n,r]of t){let t=n.exec(e);if(t)return r(t)}return[null,null]}function Bn(...e){return(t,n)=>{let r={},i;for(i=0;i<e.length;i++)r[e[i]]=L(t[n+i]);return[r,null,n+i]}}const Vn=/(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/,Hn=`(?:${Vn.source}?(?:\\[(${Ln.source})\\])?)?`,Un=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,Wn=RegExp(`${Un.source}${Hn}`),Gn=RegExp(`(?:[Tt]${Wn.source})?`),Kn=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,qn=/(\d{4})-?W(\d\d)(?:-?(\d))?/,Jn=/(\d{4})-?(\d{3})/,Yn=Bn(`weekYear`,`weekNumber`,`weekDay`),Xn=Bn(`year`,`ordinal`),Zn=/(\d{4})-(\d\d)-(\d\d)/,Qn=RegExp(`${Un.source} ?(?:${Vn.source}|(${Ln.source}))?`),$n=RegExp(`(?: ${Qn.source})?`);function H(e,t,n){let r=e[t];return M(r)?n:L(r)}function er(e,t){return[{year:H(e,t),month:H(e,t+1,1),day:H(e,t+2,1)},null,t+3]}function U(e,t){return[{hours:H(e,t,0),minutes:H(e,t+1,0),seconds:H(e,t+2,0),milliseconds:nn(e[t+3])},null,t+4]}function tr(e,t){let n=!e[t]&&!e[t+1],r=fn(e[t+1],e[t+2]);return[{},n?null:E.instance(r),t+3]}function nr(e,t){return[{},e[t]?w.create(e[t]):null,t+1]}const rr=RegExp(`^T?${Un.source}$`),ir=/^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/;function ar(e){let[t,n,r,i,a,o,s,c,l]=e,u=t[0]===`-`,d=c&&c[0]===`-`,f=(e,t=!1)=>e!==void 0&&(t||e&&u)?-e:e;return[{years:f(R(n)),months:f(R(r)),weeks:f(R(i)),days:f(R(a)),hours:f(R(o)),minutes:f(R(s)),seconds:f(R(c),c===`-0`),milliseconds:f(nn(l),d)}]}const or={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function sr(e,t,n,r,i,a,o){let s={year:t.length===2?un(L(t)):L(t),month:vn.indexOf(n)+1,day:L(r),hour:L(i),minute:L(a)};return o&&(s.second=L(o)),e&&(s.weekday=e.length>3?xn.indexOf(e)+1:Sn.indexOf(e)+1),s}const cr=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function lr(e){let[,t,n,r,i,a,o,s,c,l,u,d]=e,f=sr(t,i,r,n,a,o,s),p;return p=c?or[c]:l?0:fn(u,d),[f,new E(p)]}function ur(e){return e.replace(/\([^()]*\)|[\n\t]/g,` `).replace(/(\s\s+)/g,` `).trim()}const dr=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,fr=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,pr=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function mr(e){let[,t,n,r,i,a,o,s]=e;return[sr(t,i,r,n,a,o,s),E.utcInstance]}function hr(e){let[,t,n,r,i,a,o,s]=e;return[sr(t,s,n,r,i,a,o),E.utcInstance]}const gr=Rn(Kn,Gn),_r=Rn(qn,Gn),vr=Rn(Jn,Gn),yr=Rn(Wn),br=zn(er,U,tr,nr),xr=zn(Yn,U,tr,nr),Sr=zn(Xn,U,tr,nr),Cr=zn(U,tr,nr);function wr(e){return V(e,[gr,br],[_r,xr],[vr,Sr],[yr,Cr])}function Tr(e){return V(ur(e),[cr,lr])}function Er(e){return V(e,[dr,mr],[fr,mr],[pr,hr])}function Dr(e){return V(e,[ir,ar])}const Or=zn(U);function kr(e){return V(e,[rr,Or])}const Ar=Rn(Zn,$n),jr=Rn(Qn),Mr=zn(U,tr,nr);function Nr(e){return V(e,[Ar,br],[jr,Mr])}const Pr=`Invalid Duration`,Fr={weeks:{days:7,hours:168,minutes:10080,seconds:10080*60,milliseconds:10080*60*1e3},days:{hours:24,minutes:1440,seconds:1440*60,milliseconds:1440*60*1e3},hours:{minutes:60,seconds:3600,milliseconds:3600*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},Ir={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:2184*60,seconds:2184*60*60,milliseconds:2184*60*60*1e3},months:{weeks:4,days:30,hours:720,minutes:720*60,seconds:720*60*60,milliseconds:720*60*60*1e3},...Fr},W=146097/400,G=146097/4800,Lr={years:{quarters:4,months:12,weeks:W/7,days:W,hours:W*24,minutes:W*24*60,seconds:W*24*60*60,milliseconds:W*24*60*60*1e3},quarters:{months:3,weeks:W/28,days:W/4,hours:W*24/4,minutes:W*24*60/4,seconds:W*24*60*60/4,milliseconds:W*24*60*60*1e3/4},months:{weeks:G/7,days:G,hours:G*24,minutes:G*24*60,seconds:G*24*60*60,milliseconds:G*24*60*60*1e3},...Fr},K=[`years`,`quarters`,`months`,`weeks`,`days`,`hours`,`minutes`,`seconds`,`milliseconds`],Rr=K.slice(0).reverse();function q(e,t,n=!1){return new J({values:n?t.values:{...e.values,...t.values||{}},loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy,matrix:t.matrix||e.matrix})}function zr(e,t){let n=t.milliseconds??0;for(let r of Rr.slice(1))t[r]&&(n+=t[r]*e[r].milliseconds);return n}function Br(e,t){let n=zr(e,t)<0?-1:1;K.reduceRight((r,i)=>{if(M(t[i]))return r;if(r){let a=t[r]*n,o=e[i][r],s=Math.floor(a/o);t[i]+=s*n,t[r]-=s*o*n}return i},null),K.reduce((n,r)=>{if(M(t[r]))return n;if(n){let i=t[n]%1;t[n]-=i,t[r]+=i*e[n][r]}return r},null)}function Vr(e){let t={};for(let[n,r]of Object.entries(e))r!==0&&(t[n]=r);return t}var J=class e{constructor(e){let t=e.conversionAccuracy===`longterm`||!1,n=t?Lr:Ir;e.matrix&&(n=e.matrix),this.values=e.values,this.loc=e.loc||T.create(),this.conversionAccuracy=t?`longterm`:`casual`,this.invalid=e.invalid||null,this.matrix=n,this.isLuxonDuration=!0}static fromMillis(t,n){return e.fromObject({milliseconds:t},n)}static fromObject(t,n={}){if(typeof t!=`object`||!t)throw new y(`Duration.fromObject: argument expected to be an object, got ${t===null?`null`:typeof t}`);return new e({values:mn(t,e.normalizeUnit),loc:T.fromObject(n),conversionAccuracy:n.conversionAccuracy,matrix:n.matrix})}static fromDurationLike(t){if(N(t))return e.fromMillis(t);if(e.isDuration(t))return t;if(typeof t==`object`)return e.fromObject(t);throw new y(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,n){let[r]=Dr(t);return r?e.fromObject(r,n):e.invalid(`unparsable`,`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,n){let[r]=kr(t);return r?e.fromObject(r,n):e.invalid(`unparsable`,`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,n=null){if(!t)throw new y(`need to specify a reason the Duration is invalid`);let r=t instanceof A?t:new A(t,n);if(k.throwOnInvalid)throw new fe(r);return new e({invalid:r})}static normalizeUnit(e){let t={year:`years`,years:`years`,quarter:`quarters`,quarters:`quarters`,month:`months`,months:`months`,week:`weeks`,weeks:`weeks`,day:`days`,days:`days`,hour:`hours`,hours:`hours`,minute:`minutes`,minutes:`minutes`,second:`seconds`,seconds:`seconds`,millisecond:`milliseconds`,milliseconds:`milliseconds`}[e&&e.toLowerCase()];if(!t)throw new pe(e);return t}static isDuration(e){return e&&e.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(e,t={}){let n={...t,floor:t.round!==!1&&t.floor!==!1};return this.isValid?B.create(this.loc,n).formatDurationFromString(this,e):Pr}toHuman(e={}){if(!this.isValid)return Pr;let t=e.showZeros!==!1,n=K.map(n=>{let r=this.values[n];return M(r)||r===0&&!t?null:this.loc.numberFormatter({style:`unit`,unitDisplay:`long`,...e,unit:n.slice(0,-1)}).format(r)}).filter(e=>e);return this.loc.listFormatter({type:`conjunction`,style:e.listStyle||`narrow`,...e}).format(n)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let e=`P`;return this.years!==0&&(e+=this.years+`Y`),(this.months!==0||this.quarters!==0)&&(e+=this.months+this.quarters*3+`M`),this.weeks!==0&&(e+=this.weeks+`W`),this.days!==0&&(e+=this.days+`D`),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(e+=`T`),this.hours!==0&&(e+=this.hours+`H`),this.minutes!==0&&(e+=this.minutes+`M`),(this.seconds!==0||this.milliseconds!==0)&&(e+=rn(this.seconds+this.milliseconds/1e3,3)+`S`),e===`P`&&(e+=`T0S`),e}toISOTime(e={}){if(!this.isValid)return null;let t=this.toMillis();return t<0||t>=864e5?null:(e={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:`extended`,...e,includeOffset:!1},$.fromMillis(t,{zone:`UTC`}).toISOTime(e))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for(`nodejs.util.inspect.custom`)](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?zr(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;let n=e.fromDurationLike(t),r={};for(let e of K)(P(n.values,e)||P(this.values,e))&&(r[e]=n.get(e)+this.get(e));return q(this,{values:r},!0)}minus(t){if(!this.isValid)return this;let n=e.fromDurationLike(t);return this.plus(n.negate())}mapUnits(e){if(!this.isValid)return this;let t={};for(let n of Object.keys(this.values))t[n]=pn(e(this.values[n],n));return q(this,{values:t},!0)}get(t){return this[e.normalizeUnit(t)]}set(t){if(!this.isValid)return this;let n={...this.values,...mn(t,e.normalizeUnit)};return q(this,{values:n})}reconfigure({locale:e,numberingSystem:t,conversionAccuracy:n,matrix:r}={}){let i={loc:this.loc.clone({locale:e,numberingSystem:t}),matrix:r,conversionAccuracy:n};return q(this,i)}as(e){return this.isValid?this.shiftTo(e).get(e):NaN}normalize(){if(!this.isValid)return this;let e=this.toObject();return Br(this.matrix,e),q(this,{values:e},!0)}rescale(){if(!this.isValid)return this;let e=Vr(this.normalize().shiftToAll().toObject());return q(this,{values:e},!0)}shiftTo(...t){if(!this.isValid||t.length===0)return this;t=t.map(t=>e.normalizeUnit(t));let n={},r={},i=this.toObject(),a;for(let e of K)if(t.indexOf(e)>=0){a=e;let t=0;for(let n in r)t+=this.matrix[n][e]*r[n],r[n]=0;N(i[e])&&(t+=i[e]);let o=Math.trunc(t);n[e]=o,r[e]=(t*1e3-o*1e3)/1e3}else N(i[e])&&(r[e]=i[e]);for(let e in r)r[e]!==0&&(n[a]+=e===a?r[e]:r[e]/this.matrix[a][e]);return Br(this.matrix,n),q(this,{values:n},!0)}shiftToAll(){return this.isValid?this.shiftTo(`years`,`months`,`weeks`,`days`,`hours`,`minutes`,`seconds`,`milliseconds`):this}negate(){if(!this.isValid)return this;let e={};for(let t of Object.keys(this.values))e[t]=this.values[t]===0?0:-this.values[t];return q(this,{values:e},!0)}removeZeros(){if(!this.isValid)return this;let e=Vr(this.values);return q(this,{values:e},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(e){if(!this.isValid||!e.isValid||!this.loc.equals(e.loc))return!1;function t(e,t){return e===void 0||e===0?t===void 0||t===0:e===t}for(let n of K)if(!t(this.values[n],e.values[n]))return!1;return!0}};const Y=`Invalid Interval`;function Hr(e,t){return!e||!e.isValid?Ur.invalid(`missing or invalid start`):!t||!t.isValid?Ur.invalid(`missing or invalid end`):t<e?Ur.invalid(`end before start`,`The end of an interval must be after its start, but you had start=${e.toISO()} and end=${t.toISO()}`):null}var Ur=class e{constructor(e){this.s=e.start,this.e=e.end,this.invalid=e.invalid||null,this.isLuxonInterval=!0}static invalid(t,n=null){if(!t)throw new y(`need to specify a reason the Interval is invalid`);let r=t instanceof A?t:new A(t,n);if(k.throwOnInvalid)throw new de(r);return new e({invalid:r})}static fromDateTimes(t,n){let r=Hi(t),i=Hi(n);return Hr(r,i)??new e({start:r,end:i})}static after(t,n){let r=J.fromDurationLike(n),i=Hi(t);return e.fromDateTimes(i,i.plus(r))}static before(t,n){let r=J.fromDurationLike(n),i=Hi(t);return e.fromDateTimes(i.minus(r),i)}static fromISO(t,n){let[r,i]=(t||``).split(`/`,2);if(r&&i){let t,a;try{t=$.fromISO(r,n),a=t.isValid}catch{a=!1}let o,s;try{o=$.fromISO(i,n),s=o.isValid}catch{s=!1}if(a&&s)return e.fromDateTimes(t,o);if(a){let r=J.fromISO(i,n);if(r.isValid)return e.after(t,r)}else if(s){let t=J.fromISO(r,n);if(t.isValid)return e.before(o,t)}}return e.invalid(`unparsable`,`the input "${t}" can't be parsed as ISO 8601`)}static isInterval(e){return e&&e.isLuxonInterval||!1}get start(){return this.isValid?this.s:null}get end(){return this.isValid?this.e:null}get lastDateTime(){return this.isValid&&this.e?this.e.minus(1):null}get isValid(){return this.invalidReason===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}length(e=`milliseconds`){return this.isValid?this.toDuration(e).get(e):NaN}count(e=`milliseconds`,t){if(!this.isValid)return NaN;let n=this.start.startOf(e,t),r;return r=t?.useLocaleWeeks?this.end.reconfigure({locale:n.locale}):this.end,r=r.startOf(e,t),Math.floor(r.diff(n,e).get(e))+(r.valueOf()!==this.end.valueOf())}hasSame(e){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,e):!1}isEmpty(){return this.s.valueOf()===this.e.valueOf()}isAfter(e){return this.isValid?this.s>e:!1}isBefore(e){return this.isValid?this.e<=e:!1}contains(e){return this.isValid?this.s<=e&&this.e>e:!1}set({start:t,end:n}={}){return this.isValid?e.fromDateTimes(t||this.s,n||this.e):this}splitAt(...t){if(!this.isValid)return[];let n=t.map(Hi).filter(e=>this.contains(e)).sort((e,t)=>e.toMillis()-t.toMillis()),r=[],{s:i}=this,a=0;for(;i<this.e;){let t=n[a]||this.e,o=+t>+this.e?this.e:t;r.push(e.fromDateTimes(i,o)),i=o,a+=1}return r}splitBy(t){let n=J.fromDurationLike(t);if(!this.isValid||!n.isValid||n.as(`milliseconds`)===0)return[];let{s:r}=this,i=1,a,o=[];for(;r<this.e;){let t=this.start.plus(n.mapUnits(e=>e*i));a=+t>+this.e?this.e:t,o.push(e.fromDateTimes(r,a)),r=a,i+=1}return o}divideEqually(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]}overlaps(e){return this.e>e.s&&this.s<e.e}abutsStart(e){return this.isValid?+this.e==+e.s:!1}abutsEnd(e){return this.isValid?+e.e==+this.s:!1}engulfs(e){return this.isValid?this.s<=e.s&&this.e>=e.e:!1}equals(e){return!this.isValid||!e.isValid?!1:this.s.equals(e.s)&&this.e.equals(e.e)}intersection(t){if(!this.isValid)return this;let n=this.s>t.s?this.s:t.s,r=this.e<t.e?this.e:t.e;return n>=r?null:e.fromDateTimes(n,r)}union(t){if(!this.isValid)return this;let n=this.s<t.s?this.s:t.s,r=this.e>t.e?this.e:t.e;return e.fromDateTimes(n,r)}static merge(e){let[t,n]=e.sort((e,t)=>e.s-t.s).reduce(([e,t],n)=>t?t.overlaps(n)||t.abutsStart(n)?[e,t.union(n)]:[e.concat([t]),n]:[e,n],[[],null]);return n&&t.push(n),t}static xor(t){let n=null,r=0,i=[],a=t.map(e=>[{time:e.s,type:`s`},{time:e.e,type:`e`}]),o=Array.prototype.concat(...a).sort((e,t)=>e.time-t.time);for(let t of o)r+=t.type===`s`?1:-1,r===1?n=t.time:(n&&+n!=+t.time&&i.push(e.fromDateTimes(n,t.time)),n=null);return e.merge(i)}difference(...t){return e.xor([this].concat(t)).map(e=>this.intersection(e)).filter(e=>e&&!e.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:Y}[Symbol.for(`nodejs.util.inspect.custom`)](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(e=me,t={}){return this.isValid?B.create(this.s.loc.clone(t),e).formatInterval(this):Y}toISO(e){return this.isValid?`${this.s.toISO(e)}/${this.e.toISO(e)}`:Y}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:Y}toISOTime(e){return this.isValid?`${this.s.toISOTime(e)}/${this.e.toISOTime(e)}`:Y}toFormat(e,{separator:t=` – `}={}){return this.isValid?`${this.s.toFormat(e)}${t}${this.e.toFormat(e)}`:Y}toDuration(e,t){return this.isValid?this.e.diff(this.s,e,t):J.invalid(this.invalidReason)}mapEndpoints(t){return e.fromDateTimes(t(this.s),t(this.e))}},Wr=class{static hasDST(e=k.defaultZone){let t=$.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset}static isValidIANAZone(e){return w.isValidZone(e)}static normalizeZone(e){return D(e,k.defaultZone)}static getStartOfWeek({locale:e=null,locObj:t=null}={}){return(t||T.create(e)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:e=null,locObj:t=null}={}){return(t||T.create(e)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:e=null,locObj:t=null}={}){return(t||T.create(e)).getWeekendDays().slice()}static months(e=`long`,{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:i=`gregory`}={}){return(r||T.create(t,n,i)).months(e)}static monthsFormat(e=`long`,{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:i=`gregory`}={}){return(r||T.create(t,n,i)).months(e,!0)}static weekdays(e=`long`,{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||T.create(t,n,null)).weekdays(e)}static weekdaysFormat(e=`long`,{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||T.create(t,n,null)).weekdays(e,!0)}static meridiems({locale:e=null}={}){return T.create(e).meridiems()}static eras(e=`short`,{locale:t=null}={}){return T.create(t,null,`gregory`).eras(e)}static features(){return{relative:Yt(),localeWeek:Xt()}}};function Gr(e,t){let n=e=>e.toUTC(0,{keepLocalTime:!0}).startOf(`day`).valueOf(),r=n(t)-n(e);return Math.floor(J.fromMillis(r).as(`days`))}function Kr(e,t,n){let r=[[`years`,(e,t)=>t.year-e.year],[`quarters`,(e,t)=>t.quarter-e.quarter+(t.year-e.year)*4],[`months`,(e,t)=>t.month-e.month+(t.year-e.year)*12],[`weeks`,(e,t)=>{let n=Gr(e,t);return(n-n%7)/7}],[`days`,Gr]],i={},a=e,o,s;for(let[c,l]of r)n.indexOf(c)>=0&&(o=c,i[c]=l(e,t),s=a.plus(i),s>t?(i[c]--,e=a.plus(i),e>t&&(s=e,i[c]--,e=a.plus(i))):e=s);return[e,i,s,o]}function qr(e,t,n,r){let[i,a,o,s]=Kr(e,t,n),c=t-i,l=n.filter(e=>[`hours`,`minutes`,`seconds`,`milliseconds`].indexOf(e)>=0);l.length===0&&(o<t&&(o=i.plus({[s]:1})),o!==i&&(a[s]=(a[s]||0)+c/(o-i)));let u=J.fromObject(a,r);return l.length>0?J.fromMillis(c,r).shiftTo(...l).plus(u):u}function X(e,t=e=>e){return{regex:e,deser:([e])=>t(bt(e))}}const Jr=`[ \xA0]`,Yr=new RegExp(Jr,`g`);function Xr(e){return e.replace(/\./g,`\\.?`).replace(Yr,Jr)}function Zr(e){return e.replace(/\./g,``).replace(Yr,` `).toLowerCase()}function Z(e,t){return e===null?null:{regex:RegExp(e.map(Xr).join(`|`)),deser:([n])=>e.findIndex(e=>Zr(n)===Zr(e))+t}}function Qr(e,t){return{regex:e,deser:([,e,t])=>fn(e,t),groups:t}}function $r(e){return{regex:e,deser:([e])=>e}}function ei(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,`\\$&`)}function ti(e,t){let n=O(t),r=O(t,`{2}`),i=O(t,`{3}`),a=O(t,`{4}`),o=O(t,`{6}`),s=O(t,`{1,2}`),c=O(t,`{1,3}`),l=O(t,`{1,6}`),u=O(t,`{1,9}`),d=O(t,`{2,4}`),f=O(t,`{4,6}`),p=e=>({regex:RegExp(ei(e.val)),deser:([e])=>e,literal:!0}),m=(m=>{if(e.literal)return p(m);switch(m.val){case`G`:return Z(t.eras(`short`),0);case`GG`:return Z(t.eras(`long`),0);case`y`:return X(l);case`yy`:return X(d,un);case`yyyy`:return X(a);case`yyyyy`:return X(f);case`yyyyyy`:return X(o);case`M`:return X(s);case`MM`:return X(r);case`MMM`:return Z(t.months(`short`,!0),1);case`MMMM`:return Z(t.months(`long`,!0),1);case`L`:return X(s);case`LL`:return X(r);case`LLL`:return Z(t.months(`short`,!1),1);case`LLLL`:return Z(t.months(`long`,!1),1);case`d`:return X(s);case`dd`:return X(r);case`o`:return X(c);case`ooo`:return X(i);case`HH`:return X(r);case`H`:return X(s);case`hh`:return X(r);case`h`:return X(s);case`mm`:return X(r);case`m`:return X(s);case`q`:return X(s);case`qq`:return X(r);case`s`:return X(s);case`ss`:return X(r);case`S`:return X(c);case`SSS`:return X(i);case`u`:return $r(u);case`uu`:return $r(s);case`uuu`:return X(n);case`a`:return Z(t.meridiems(),0);case`kkkk`:return X(a);case`kk`:return X(d,un);case`W`:return X(s);case`WW`:return X(r);case`E`:case`c`:return X(n);case`EEE`:return Z(t.weekdays(`short`,!1),1);case`EEEE`:return Z(t.weekdays(`long`,!1),1);case`ccc`:return Z(t.weekdays(`short`,!0),1);case`cccc`:return Z(t.weekdays(`long`,!0),1);case`Z`:case`ZZ`:return Qr(RegExp(`([+-]${s.source})(?::(${r.source}))?`),2);case`ZZZ`:return Qr(RegExp(`([+-]${s.source})(${r.source})?`),2);case`z`:return $r(/[a-z_+-/]{1,256}?/i);case` `:return $r(/[^\S\n\r]/);default:return p(m)}})(e)||{invalidReason:`missing Intl.DateTimeFormat.formatToParts support`};return m.token=e,m}const ni={year:{"2-digit":`yy`,numeric:`yyyyy`},month:{numeric:`M`,"2-digit":`MM`,short:`MMM`,long:`MMMM`},day:{numeric:`d`,"2-digit":`dd`},weekday:{short:`EEE`,long:`EEEE`},dayperiod:`a`,dayPeriod:`a`,hour12:{numeric:`h`,"2-digit":`hh`},hour24:{numeric:`H`,"2-digit":`HH`},minute:{numeric:`m`,"2-digit":`mm`},second:{numeric:`s`,"2-digit":`ss`},timeZoneName:{long:`ZZZZZ`,short:`ZZZ`}};function ri(e,t,n){let{type:r,value:i}=e;if(r===`literal`){let e=/^\s+$/.test(i);return{literal:!e,val:e?` `:i}}let a=t[r],o=r;r===`hour`&&(o=t.hour12==null?t.hourCycle==null?n.hour12?`hour12`:`hour24`:t.hourCycle===`h11`||t.hourCycle===`h12`?`hour12`:`hour24`:t.hour12?`hour12`:`hour24`);let s=ni[o];if(typeof s==`object`&&(s=s[a]),s)return{literal:!1,val:s}}function ii(e){return[`^${e.map(e=>e.regex).reduce((e,t)=>`${e}(${t.source})`,``)}$`,e]}function ai(e,t,n){let r=e.match(t);if(r){let e={},t=1;for(let i in n)if(P(n,i)){let a=n[i],o=a.groups?a.groups+1:1;!a.literal&&a.token&&(e[a.token.val[0]]=a.deser(r.slice(t,t+o))),t+=o}return[r,e]}else return[r,{}]}function oi(e){let t=e=>{switch(e){case`S`:return`millisecond`;case`s`:return`second`;case`m`:return`minute`;case`h`:case`H`:return`hour`;case`d`:return`day`;case`o`:return`ordinal`;case`L`:case`M`:return`month`;case`y`:return`year`;case`E`:case`c`:return`weekday`;case`W`:return`weekNumber`;case`k`:return`weekYear`;case`q`:return`quarter`;default:return null}},n=null,r;return M(e.z)||(n=w.create(e.z)),M(e.Z)||(n||(n=new E(e.Z)),r=e.Z),M(e.q)||(e.M=(e.q-1)*3+1),M(e.h)||(e.h<12&&e.a===1?e.h+=12:e.h===12&&e.a===0&&(e.h=0)),e.G===0&&e.y&&(e.y=-e.y),M(e.u)||(e.S=nn(e.u)),[Object.keys(e).reduce((n,r)=>{let i=t(r);return i&&(n[i]=e[r]),n},{}),n,r]}let si=null;function ci(){return si||(si=$.fromMillis(1555555555555)),si}function li(e,t){if(e.literal)return e;let n=mi(B.macroTokenToFormatOpts(e.val),t);return n==null||n.includes(void 0)?e:n}function ui(e,t){return Array.prototype.concat(...e.map(e=>li(e,t)))}var di=class{constructor(e,t){if(this.locale=e,this.format=t,this.tokens=ui(B.parseFormat(t),e),this.units=this.tokens.map(t=>ti(t,e)),this.disqualifyingUnit=this.units.find(e=>e.invalidReason),!this.disqualifyingUnit){let[e,t]=ii(this.units);this.regex=RegExp(e,`i`),this.handlers=t}}explainFromTokens(e){if(this.isValid){let[t,n]=ai(e,this.regex,this.handlers),[r,i,a]=n?oi(n):[null,null,void 0];if(P(n,`a`)&&P(n,`H`))throw new v(`Can't include meridiem when specifying 24-hour format`);return{input:e,tokens:this.tokens,regex:this.regex,rawMatches:t,matches:n,result:r,zone:i,specificOffset:a}}else return{input:e,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}};function fi(e,t,n){return new di(e,n).explainFromTokens(t)}function pi(e,t,n){let{result:r,zone:i,specificOffset:a,invalidReason:o}=fi(e,t,n);return[r,i,a,o]}function mi(e,t){if(!e)return null;let n=B.create(t,e).dtFormatter(ci()),r=n.formatToParts(),i=n.resolvedOptions();return r.map(t=>ri(t,e,i))}const hi=`Invalid DateTime`,gi=864e13;function _i(e){return new A(`unsupported zone`,`the zone "${e.name}" is not supported`)}function vi(e){return e.weekData===null&&(e.weekData=Lt(e.c)),e.weekData}function yi(e){return e.localWeekData===null&&(e.localWeekData=Lt(e.c,e.loc.getMinDaysInFirstWeek(),e.loc.getStartOfWeek())),e.localWeekData}function Q(e,t){let n={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new $({...n,...t,old:n})}function bi(e,t,n){let r=e-t*60*1e3,i=n.offset(r);if(t===i)return[r,t];r-=(i-t)*60*1e3;let a=n.offset(r);return i===a?[r,i]:[e-Math.min(i,a)*60*1e3,Math.max(i,a)]}function xi(e,t){e+=t*60*1e3;let n=new Date(e);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds(),millisecond:n.getUTCMilliseconds()}}function Si(e,t,n){return bi(sn(e),t,n)}function Ci(e,t){let n=e.o,r=e.c.year+Math.trunc(t.years),i=e.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,a={...e.c,year:r,month:i,day:Math.min(e.c.day,on(r,i))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},o=J.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as(`milliseconds`),[s,c]=bi(sn(a),n,e.zone);return o!==0&&(s+=o,c=e.zone.offset(s)),{ts:s,o:c}}function wi(e,t,n,r,i,a){let{setZone:o,zone:s}=n;if(e&&Object.keys(e).length!==0||t){let r=t||s,i=$.fromObject(e,{...n,zone:r,specificOffset:a});return o?i:i.setZone(s)}else return $.invalid(new A(`unparsable`,`the input "${i}" can't be parsed as ${r}`))}function Ti(e,t,n=!0){return e.isValid?B.create(T.create(`en-US`),{allowZ:n,forceSimple:!0}).formatDateTimeFromString(e,t):null}function Ei(e,t,n){let r=e.c.year>9999||e.c.year<0,i=``;if(r&&e.c.year>=0&&(i+=`+`),i+=I(e.c.year,r?6:4),n===`year`)return i;if(t){if(i+=`-`,i+=I(e.c.month),n===`month`)return i;i+=`-`}else if(i+=I(e.c.month),n===`month`)return i;return i+=I(e.c.day),i}function Di(e,t,n,r,i,a,o){let s=!n||e.c.millisecond!==0||e.c.second!==0,c=``;switch(o){case`day`:case`month`:case`year`:break;default:if(c+=I(e.c.hour),o===`hour`)break;if(t){if(c+=`:`,c+=I(e.c.minute),o===`minute`)break;s&&(c+=`:`,c+=I(e.c.second))}else{if(c+=I(e.c.minute),o===`minute`)break;s&&(c+=I(e.c.second))}if(o===`second`)break;s&&(!r||e.c.millisecond!==0)&&(c+=`.`,c+=I(e.c.millisecond,3))}return i&&(e.isOffsetFixed&&e.offset===0&&!a?c+=`Z`:e.o<0?(c+=`-`,c+=I(Math.trunc(-e.o/60)),c+=`:`,c+=I(Math.trunc(-e.o%60))):(c+=`+`,c+=I(Math.trunc(e.o/60)),c+=`:`,c+=I(Math.trunc(e.o%60)))),a&&(c+=`[`+e.zone.ianaName+`]`),c}const Oi={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},ki={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},Ai={ordinal:1,hour:0,minute:0,second:0,millisecond:0},ji=[`year`,`month`,`day`,`hour`,`minute`,`second`,`millisecond`],Mi=[`weekYear`,`weekNumber`,`weekday`,`hour`,`minute`,`second`,`millisecond`],Ni=[`year`,`ordinal`,`hour`,`minute`,`second`,`millisecond`];function Pi(e){let t={year:`year`,years:`year`,month:`month`,months:`month`,day:`day`,days:`day`,hour:`hour`,hours:`hour`,minute:`minute`,minutes:`minute`,quarter:`quarter`,quarters:`quarter`,second:`second`,seconds:`second`,millisecond:`millisecond`,milliseconds:`millisecond`,weekday:`weekday`,weekdays:`weekday`,weeknumber:`weekNumber`,weeksnumber:`weekNumber`,weeknumbers:`weekNumber`,weekyear:`weekYear`,weekyears:`weekYear`,ordinal:`ordinal`}[e.toLowerCase()];if(!t)throw new pe(e);return t}function Fi(e){switch(e.toLowerCase()){case`localweekday`:case`localweekdays`:return`localWeekday`;case`localweeknumber`:case`localweeknumbers`:return`localWeekNumber`;case`localweekyear`:case`localweekyears`:return`localWeekYear`;default:return Pi(e)}}function Ii(e){if(Bi===void 0&&(Bi=k.now()),e.type!==`iana`)return e.offset(Bi);let t=e.name,n=Vi.get(t);return n===void 0&&(n=e.offset(Bi),Vi.set(t,n)),n}function Li(e,t){let n=D(t.zone,k.defaultZone);if(!n.isValid)return $.invalid(_i(n));let r=T.fromObject(t),i,a;if(M(e.year))i=k.now();else{for(let t of ji)M(e[t])&&(e[t]=Oi[t]);let t=Wt(e)||Gt(e);if(t)return $.invalid(t);let r=Ii(n);[i,a]=Si(e,r,n)}return new $({ts:i,zone:n,loc:r,o:a})}function Ri(e,t,n){let r=M(n.round)?!0:n.round,i=M(n.rounding)?`trunc`:n.rounding,a=(e,a)=>(e=rn(e,r||n.calendary?0:2,n.calendary?`round`:i),t.loc.clone(n).relFormatter(n).format(e,a)),o=r=>n.calendary?t.hasSame(e,r)?0:t.startOf(r).diff(e.startOf(r),r).get(r):t.diff(e,r).get(r);if(n.unit)return a(o(n.unit),n.unit);for(let e of n.units){let t=o(e);if(Math.abs(t)>=1)return a(t,e)}return a(e>t?-0:0,n.units[n.units.length-1])}function zi(e){let t={},n;return e.length>0&&typeof e[e.length-1]==`object`?(t=e[e.length-1],n=Array.from(e).slice(0,e.length-1)):n=Array.from(e),[t,n]}let Bi;const Vi=new Map;var $=class e{constructor(e){let t=e.zone||k.defaultZone,n=e.invalid||(Number.isNaN(e.ts)?new A(`invalid input`):null)||(t.isValid?null:_i(t));this.ts=M(e.ts)?k.now():e.ts;let r=null,i=null;if(!n)if(e.old&&e.old.ts===this.ts&&e.old.zone.equals(t))[r,i]=[e.old.c,e.old.o];else{let a=N(e.o)&&!e.old?e.o:t.offset(this.ts);r=xi(this.ts,a),n=Number.isNaN(r.year)?new A(`invalid input`):null,r=n?null:r,i=n?null:a}this._zone=t,this.loc=e.loc||T.create(),this.invalid=n,this.weekData=null,this.localWeekData=null,this.c=r,this.o=i,this.isLuxonDateTime=!0}static now(){return new e({})}static local(){let[e,t]=zi(arguments),[n,r,i,a,o,s,c]=t;return Li({year:n,month:r,day:i,hour:a,minute:o,second:s,millisecond:c},e)}static utc(){let[e,t]=zi(arguments),[n,r,i,a,o,s,c]=t;return e.zone=E.utcInstance,Li({year:n,month:r,day:i,hour:a,minute:o,second:s,millisecond:c},e)}static fromJSDate(t,n={}){let r=Jt(t)?t.valueOf():NaN;if(Number.isNaN(r))return e.invalid(`invalid input`);let i=D(n.zone,k.defaultZone);return i.isValid?new e({ts:r,zone:i,loc:T.fromObject(n)}):e.invalid(_i(i))}static fromMillis(t,n={}){if(!N(t))throw new y(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`);return t<-gi||t>gi?e.invalid(`Timestamp out of range`):new e({ts:t,zone:D(n.zone,k.defaultZone),loc:T.fromObject(n)})}static fromSeconds(t,n={}){if(N(t))return new e({ts:t*1e3,zone:D(n.zone,k.defaultZone),loc:T.fromObject(n)});throw new y(`fromSeconds requires a numerical input`)}static fromObject(t,n={}){t=t||{};let r=D(n.zone,k.defaultZone);if(!r.isValid)return e.invalid(_i(r));let i=T.fromObject(n),a=mn(t,Fi),{minDaysInFirstWeek:o,startOfWeek:s}=Vt(a,i),c=k.now(),l=M(n.specificOffset)?r.offset(c):n.specificOffset,u=!M(a.ordinal),d=!M(a.year),f=!M(a.month)||!M(a.day),p=d||f,m=a.weekYear||a.weekNumber;if((p||u)&&m)throw new v(`Can't mix weekYear/weekNumber units with year/month/day or ordinals`);if(f&&u)throw new v(`Can't mix ordinal dates with month/day`);let h=m||a.weekday&&!p,ee,te,g=xi(c,l);h?(ee=Mi,te=ki,g=Lt(g,o,s)):u?(ee=Ni,te=Ai,g=zt(g)):(ee=ji,te=Oi);let ne=!1;for(let e of ee){let t=a[e];M(t)?ne?a[e]=te[e]:a[e]=g[e]:ne=!0}let re=(h?Ht(a,o,s):u?Ut(a):Wt(a))||Gt(a);if(re)return e.invalid(re);let[ie,ae]=Si(h?Rt(a,o,s):u?Bt(a):a,l,r),oe=new e({ts:ie,zone:r,o:ae,loc:i});return a.weekday&&p&&t.weekday!==oe.weekday?e.invalid(`mismatched weekday`,`you can't specify both a weekday of ${a.weekday} and a date of ${oe.toISO()}`):oe.isValid?oe:e.invalid(oe.invalid)}static fromISO(e,t={}){let[n,r]=wr(e);return wi(n,r,t,`ISO 8601`,e)}static fromRFC2822(e,t={}){let[n,r]=Tr(e);return wi(n,r,t,`RFC 2822`,e)}static fromHTTP(e,t={}){let[n,r]=Er(e);return wi(n,r,t,`HTTP`,t)}static fromFormat(t,n,r={}){if(M(t)||M(n))throw new y(`fromFormat requires an input string and a format`);let{locale:i=null,numberingSystem:a=null}=r,[o,s,c,l]=pi(T.fromOpts({locale:i,numberingSystem:a,defaultToEN:!0}),t,n);return l?e.invalid(l):wi(o,s,r,`format ${n}`,t,c)}static fromString(t,n,r={}){return e.fromFormat(t,n,r)}static fromSQL(e,t={}){let[n,r]=Nr(e);return wi(n,r,t,`SQL`,e)}static invalid(t,n=null){if(!t)throw new y(`need to specify a reason the DateTime is invalid`);let r=t instanceof A?t:new A(t,n);if(k.throwOnInvalid)throw new ue(r);return new e({invalid:r})}static isDateTime(e){return e&&e.isLuxonDateTime||!1}static parseFormatForOpts(e,t={}){let n=mi(e,T.fromObject(t));return n?n.map(e=>e?e.val:null).join(``):null}static expandFormat(e,t={}){return ui(B.parseFormat(e),T.fromObject(t)).map(e=>e.val).join(``)}static resetCache(){Bi=void 0,Vi.clear()}get(e){return this[e]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?vi(this).weekYear:NaN}get weekNumber(){return this.isValid?vi(this).weekNumber:NaN}get weekday(){return this.isValid?vi(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?yi(this).weekday:NaN}get localWeekNumber(){return this.isValid?yi(this).weekNumber:NaN}get localWeekYear(){return this.isValid?yi(this).weekYear:NaN}get ordinal(){return this.isValid?zt(this.c).ordinal:NaN}get monthShort(){return this.isValid?Wr.months(`short`,{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Wr.months(`long`,{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Wr.weekdays(`short`,{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Wr.weekdays(`long`,{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:`short`,locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:`long`,locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];let e=864e5,t=6e4,n=sn(this.c),r=this.zone.offset(n-e),i=this.zone.offset(n+e),a=this.zone.offset(n-r*t),o=this.zone.offset(n-i*t);if(a===o)return[this];let s=n-a*t,c=n-o*t,l=xi(s,a),u=xi(c,o);return l.hour===u.hour&&l.minute===u.minute&&l.second===u.second&&l.millisecond===u.millisecond?[Q(this,{ts:s}),Q(this,{ts:c})]:[this]}get isInLeapYear(){return an(this.year)}get daysInMonth(){return on(this.year,this.month)}get daysInYear(){return this.isValid?z(this.year):NaN}get weeksInWeekYear(){return this.isValid?ln(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?ln(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(e={}){let{locale:t,numberingSystem:n,calendar:r}=B.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:t,numberingSystem:n,outputCalendar:r}}toUTC(e=0,t={}){return this.setZone(E.instance(e),t)}toLocal(){return this.setZone(k.defaultZone)}setZone(t,{keepLocalTime:n=!1,keepCalendarTime:r=!1}={}){if(t=D(t,k.defaultZone),t.equals(this.zone))return this;if(t.isValid){let e=this.ts;if(n||r){let n=t.offset(this.ts),r=this.toObject();[e]=Si(r,n,t)}return Q(this,{ts:e,zone:t})}else return e.invalid(_i(t))}reconfigure({locale:e,numberingSystem:t,outputCalendar:n}={}){let r=this.loc.clone({locale:e,numberingSystem:t,outputCalendar:n});return Q(this,{loc:r})}setLocale(e){return this.reconfigure({locale:e})}set(e){if(!this.isValid)return this;let t=mn(e,Fi),{minDaysInFirstWeek:n,startOfWeek:r}=Vt(t,this.loc),i=!M(t.weekYear)||!M(t.weekNumber)||!M(t.weekday),a=!M(t.ordinal),o=!M(t.year),s=!M(t.month)||!M(t.day),c=o||s,l=t.weekYear||t.weekNumber;if((c||a)&&l)throw new v(`Can't mix weekYear/weekNumber units with year/month/day or ordinals`);if(s&&a)throw new v(`Can't mix ordinal dates with month/day`);let u;i?u=Rt({...Lt(this.c,n,r),...t},n,r):M(t.ordinal)?(u={...this.toObject(),...t},M(t.day)&&(u.day=Math.min(on(u.year,u.month),u.day))):u=Bt({...zt(this.c),...t});let[d,f]=Si(u,this.o,this.zone);return Q(this,{ts:d,o:f})}plus(e){if(!this.isValid)return this;let t=J.fromDurationLike(e);return Q(this,Ci(this,t))}minus(e){if(!this.isValid)return this;let t=J.fromDurationLike(e).negate();return Q(this,Ci(this,t))}startOf(e,{useLocaleWeeks:t=!1}={}){if(!this.isValid)return this;let n={},r=J.normalizeUnit(e);switch(r){case`years`:n.month=1;case`quarters`:case`months`:n.day=1;case`weeks`:case`days`:n.hour=0;case`hours`:n.minute=0;case`minutes`:n.second=0;case`seconds`:n.millisecond=0;break}if(r===`weeks`)if(t){let e=this.loc.getStartOfWeek(),{weekday:t}=this;t<e&&(n.weekNumber=this.weekNumber-1),n.weekday=e}else n.weekday=1;return r===`quarters`&&(n.month=(Math.ceil(this.month/3)-1)*3+1),this.set(n)}endOf(e,t){return this.isValid?this.plus({[e]:1}).startOf(e,t).minus(1):this}toFormat(e,t={}){return this.isValid?B.create(this.loc.redefaultToEN(t)).formatDateTimeFromString(this,e):hi}toLocaleString(e=me,t={}){return this.isValid?B.create(this.loc.clone(t),e).formatDateTime(this):hi}toLocaleParts(e={}){return this.isValid?B.create(this.loc.clone(e),e).formatDateTimeParts(this):[]}toISO({format:e=`extended`,suppressSeconds:t=!1,suppressMilliseconds:n=!1,includeOffset:r=!0,extendedZone:i=!1,precision:a=`milliseconds`}={}){if(!this.isValid)return null;a=Pi(a);let o=e===`extended`,s=Ei(this,o,a);return ji.indexOf(a)>=3&&(s+=`T`),s+=Di(this,o,t,n,r,i,a),s}toISODate({format:e=`extended`,precision:t=`day`}={}){return this.isValid?Ei(this,e===`extended`,Pi(t)):null}toISOWeekDate(){return Ti(this,`kkkk-'W'WW-c`)}toISOTime({suppressMilliseconds:e=!1,suppressSeconds:t=!1,includeOffset:n=!0,includePrefix:r=!1,extendedZone:i=!1,format:a=`extended`,precision:o=`milliseconds`}={}){return this.isValid?(o=Pi(o),(r&&ji.indexOf(o)>=3?`T`:``)+Di(this,a===`extended`,t,e,n,i,o)):null}toRFC2822(){return Ti(this,`EEE, dd LLL yyyy HH:mm:ss ZZZ`,!1)}toHTTP(){return Ti(this.toUTC(),`EEE, dd LLL yyyy HH:mm:ss 'GMT'`)}toSQLDate(){return this.isValid?Ei(this,!0):null}toSQLTime({includeOffset:e=!0,includeZone:t=!1,includeOffsetSpace:n=!0}={}){let r=`HH:mm:ss.SSS`;return(t||e)&&(n&&(r+=` `),t?r+=`z`:e&&(r+=`ZZ`)),Ti(this,r,!0)}toSQL(e={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(e)}`:null}toString(){return this.isValid?this.toISO():hi}[Symbol.for(`nodejs.util.inspect.custom`)](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(e={}){if(!this.isValid)return{};let t={...this.c};return e.includeConfig&&(t.outputCalendar=this.outputCalendar,t.numberingSystem=this.loc.numberingSystem,t.locale=this.loc.locale),t}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(e,t=`milliseconds`,n={}){if(!this.isValid||!e.isValid)return J.invalid(`created by diffing an invalid DateTime`);let r={locale:this.locale,numberingSystem:this.numberingSystem,...n},i=Zt(t).map(J.normalizeUnit),a=e.valueOf()>this.valueOf(),o=qr(a?this:e,a?e:this,i,r);return a?o.negate():o}diffNow(t=`milliseconds`,n={}){return this.diff(e.now(),t,n)}until(e){return this.isValid?Ur.fromDateTimes(this,e):this}hasSame(e,t,n){if(!this.isValid)return!1;let r=e.valueOf(),i=this.setZone(e.zone,{keepLocalTime:!0});return i.startOf(t,n)<=r&&r<=i.endOf(t,n)}equals(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)}toRelative(t={}){if(!this.isValid)return null;let n=t.base||e.fromObject({},{zone:this.zone}),r=t.padding?this<n?-t.padding:t.padding:0,i=[`years`,`months`,`days`,`hours`,`minutes`,`seconds`],a=t.unit;return Array.isArray(t.unit)&&(i=t.unit,a=void 0),Ri(n,this.plus(r),{...t,numeric:`always`,units:i,unit:a})}toRelativeCalendar(t={}){return this.isValid?Ri(t.base||e.fromObject({},{zone:this.zone}),this,{...t,numeric:`auto`,units:[`years`,`months`,`days`],calendary:!0}):null}static min(...t){if(!t.every(e.isDateTime))throw new y(`min requires all arguments be DateTimes`);return Qt(t,e=>e.valueOf(),Math.min)}static max(...t){if(!t.every(e.isDateTime))throw new y(`max requires all arguments be DateTimes`);return Qt(t,e=>e.valueOf(),Math.max)}static fromFormatExplain(e,t,n={}){let{locale:r=null,numberingSystem:i=null}=n;return fi(T.fromOpts({locale:r,numberingSystem:i,defaultToEN:!0}),e,t)}static fromStringExplain(t,n,r={}){return e.fromFormatExplain(t,n,r)}static buildFormatParser(e,t={}){let{locale:n=null,numberingSystem:r=null}=t;return new di(T.fromOpts({locale:n,numberingSystem:r,defaultToEN:!0}),e)}static fromFormatParser(t,n,r={}){if(M(t)||M(n))throw new y(`fromFormatParser requires an input string and a format parser`);let{locale:i=null,numberingSystem:a=null}=r,o=T.fromOpts({locale:i,numberingSystem:a,defaultToEN:!0});if(!o.equals(n.locale))throw new y(`fromFormatParser called with a locale of ${o}, but the format parser was created for ${n.locale}`);let{result:s,zone:c,specificOffset:l,invalidReason:u}=n.explainFromTokens(t);return u?e.invalid(u):wi(s,c,r,`format ${n.format}`,t,l)}static get DATE_SHORT(){return me}static get DATE_MED(){return he}static get DATE_MED_WITH_WEEKDAY(){return ge}static get DATE_FULL(){return _e}static get DATE_HUGE(){return ve}static get TIME_SIMPLE(){return ye}static get TIME_WITH_SECONDS(){return be}static get TIME_WITH_SHORT_OFFSET(){return xe}static get TIME_WITH_LONG_OFFSET(){return Se}static get TIME_24_SIMPLE(){return Ce}static get TIME_24_WITH_SECONDS(){return we}static get TIME_24_WITH_SHORT_OFFSET(){return Te}static get TIME_24_WITH_LONG_OFFSET(){return Ee}static get DATETIME_SHORT(){return De}static get DATETIME_SHORT_WITH_SECONDS(){return Oe}static get DATETIME_MED(){return ke}static get DATETIME_MED_WITH_SECONDS(){return Ae}static get DATETIME_MED_WITH_WEEKDAY(){return je}static get DATETIME_FULL(){return Me}static get DATETIME_FULL_WITH_SECONDS(){return Ne}static get DATETIME_HUGE(){return Pe}static get DATETIME_HUGE_WITH_SECONDS(){return Fe}};function Hi(e){if($.isDateTime(e))return e;if(e&&e.valueOf&&N(e.valueOf()))return $.fromJSDate(e);if(e&&typeof e==`object`)return $.fromObject(e);throw new y(`Unknown datetime argument: ${e}, of type ${typeof e}`)}const Ui=(e,t,n)=>{let r=n[0];if(r===void 0)return!1;let i=Wi(e),a=Wi(r);if(i===void 0||a===void 0)return!1;switch(t){case`is after`:return i>a;case`is before`:return i<a;default:return!1}},Wi=e=>{let t=$.fromISO(e,{zone:`utc`});return t.isValid?t.toMillis():void 0},Gi=(e,t,n)=>{let r=t.toLowerCase();if(e.trim().length===0)return r===`is not one of`;let i=c.coerce(e),a=n.map(e=>c.coerce(e)),o=a[0]??null;switch(r){case`=`:return Ki(i,o);case`<`:return qi(i,o,c.lt);case`<=`:return qi(i,o,c.lte);case`>`:return qi(i,o,c.gt);case`>=`:return qi(i,o,c.gte);case`is one of`:return a.some(e=>Ki(i,e));case`is not one of`:return!a.some(e=>Ki(i,e));default:return!1}},Ki=(e,t)=>e!==null&&t!==null&&c.eq(e,t),qi=(e,t,n)=>e!==null&&t!==null&&n(e,t),Ji=Symbol(`absent`),Yi=Symbol(`unknown-attribute`),Xi=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`,Zi=e=>e===Ji||e==null?``:Xi(e)?Qi(e):``,Qi=e=>typeof e==`string`?e:String(e),$i=e=>e===Ji?void 0:e,ea=e=>e===Yi?`unknown-attribute`:e===Ji?`absent`:Xi(e)?`scalar`:Array.isArray(e)?`array`:`object`,ta=(e,t,n)=>{let r=t.toLowerCase();if(!Array.isArray(e))return r===`does not contain any of`;let i=e.filter(Xi).map(Qi);switch(r){case`contains any of`:return i.some(e=>n.includes(e));case`does not contain any of`:return!i.some(e=>n.includes(e));default:return!1}};var na=class{evaluate(e,t){return this.explain(e,t).matched}explain(e,t){let n=this.resolve(e,t),r=ea(n),i=n===Ji||n===Yi?void 0:n;return n===Yi?{matched:!1,resolvedValue:i,resolvedType:r}:{matched:this.compare(e,n),resolvedValue:i,resolvedType:r}}compare(e,t){let n=e.targetValues??[];switch(e.targetType){case`text`:return oe(Zi(t),e.operator,n);case`number`:return se($i(t),e.operator,n);case`datetime`:return Ui(Zi(t),e.operator,n);case`semver`:return Gi(Zi(t),e.operator,n);case`array`:return ta($i(t),e.operator,n)}return!1}resolve(e,t){switch(e.attribute){case`identifier`:return ra(t?.context?.id);case`name`:return ra(t?.context?.name);case`appName`:return ra(t?.metadata?.appName);case`appVersion`:return ra(t?.metadata?.appVersion);case`traits`:return e.trait?ra(this.findTraitValue(t?.context?.traits,e.trait)):Ji;default:return Yi}}findTraitValue(e,t){try{return s(t,e).val}catch{return}}};const ra=e=>e??Ji,ia=e=>{let t=`${e.contextIdentifier}-${e.configId}`;return Number(l(t,{seed:15426857351n})%1000n)/10};var aa=class{constructor(e){if(this.logger=e,this.conditionEvaluator=new na,!e||!e.warn||!e.error||!e.info)throw TypeError(`The provided logger is not a valid 'ConfigDirectorLogger'`);this.logger=e}evaluate(e,t){return{id:e.id,key:e.key,type:e.type,value:this.explain(e,t).value}}explain(e,t){let n=[...e.target?.rules??[]].sort((e,t)=>(e.order??2**53-1)-(t.order??2**53-1)),r=[],i;for(let a of n){if(i){r.push({ruleId:a.id,outcome:`not-evaluated`,conditions:[],bucket:void 0});continue}let n=this.explainRule(a,e,t);r.push(n.explanation),n.value!==void 0&&(i={ruleId:a.id,value:n.value})}return{value:i?.value??e.target?.defaultValue,servedBy:i?{kind:`rule`,ruleId:i.ruleId}:{kind:`default`},rules:r}}explainRule(e,t,n){let r={ruleId:e.id,outcome:`not-matched`,conditions:[],bucket:void 0};try{let i;return e.type==`percentage`?i=this.explainPercentage(e.percentages??[],t,n,r):e.type==`conditional`&&(i=this.explainConditionalRule(e,t,n,r)),i!==void 0&&(r.outcome=`matched`),{explanation:r,value:i}}catch(n){return this.logger.warn(`There was an error while evaluating a targeting rule '${e?.id}' for '${t?.key}'. The rule will be disregarded.`,{error:n,configKey:t?.key,ruleId:e?.id}),{explanation:{ruleId:e.id,outcome:`errored`,conditions:[],bucket:void 0},value:void 0}}}explainPercentage(e,t,n,r){let i=n?.context?.id,a=i??crypto.randomUUID(),o=ia({configId:t.id,contextIdentifier:a}),s=[],c=0,l;for(let t of e){let e=c+t.percentage;s.push({percentageId:t.id,from:c,to:e,value:t.value?.toString()}),l===void 0&&o<e&&(l=t),c=e}return r.bucket={identifier:a,identifierWasGenerated:i==null,assignedPercentage:o,shares:s,selectedPercentageId:l?.id},l?.value==null?void 0:l.value.toString()}explainConditionalRule(e,t,n,r){let i=!1;for(let t of e.conditions??[]){if(i){r.conditions.push({conditionId:t.id,outcome:`not-evaluated`});continue}let e=this.conditionEvaluator.explain(t,n);r.conditions.push({conditionId:t.id,outcome:e.matched?`matched`:`not-matched`,resolvedValue:e.resolvedValue,resolvedType:e.resolvedType}),i=!e.matched}if(!i){if(e.target==`value`)return e.value==null?void 0:e.value.toString();if(e.target==`percentage`)return this.explainPercentage(e.percentages??[],t,n,r)}}};const oa=e=>{let t=typeof e;if(t===`object`)try{return e.constructor?.name??t}catch{return t}else if(t===`function`)try{let n=e.name;return n?`function: ${n}`:t}catch{return t}return t},sa=e=>e===`number`||e===`bigint`,ca=new Set([`boolean`,`integer`,`float`]),la=(e,t)=>{let n=e.value,r=oa(t);if(n==null)return{parsedValue:t,parsedValueId:void 0,requestedType:r,usedDefault:!0,reason:`value-missing`};if(e.type===`json`)return ha(n,t,r,e.valueId);if(typeof t==`string`)return ca.has(e.type)?{parsedValue:t,parsedValueId:void 0,requestedType:r,usedDefault:!0,reason:`type-mismatch`}:{parsedValue:n,parsedValueId:e.valueId,requestedType:r,usedDefault:!1,reason:`found-match`};if(typeof t==`boolean`&&(e.type===`boolean`||e.type===`string`||e.type===`enum`)){let i=ua(n),a=typeof i==`boolean`;return{parsedValue:a?i:t,parsedValueId:a?e.valueId:void 0,requestedType:r,usedDefault:!a,reason:a?`found-match`:`invalid-boolean`}}if(sa(typeof t)&&e.type===`integer`){let i=da(n),a=typeof i==`number`;return{parsedValue:a?i:t,parsedValueId:a?e.valueId:void 0,requestedType:r,usedDefault:!a,reason:a?`found-match`:`invalid-number`}}if(sa(typeof t)&&(e.type===`float`||e.type===`enum`||e.type===`string`)){let i=fa(n),a=typeof i==`number`;return{parsedValue:a?i:t,parsedValueId:a?e.valueId:void 0,requestedType:r,usedDefault:!a,reason:a?`found-match`:`invalid-number`}}return{parsedValue:t,parsedValueId:void 0,requestedType:r,usedDefault:!0,reason:`type-mismatch`}},ua=e=>{if(!e)return;let t=e.toLowerCase();if(!(t!=`true`&&t!=`false`))return t===`true`},da=e=>{let t=pa(e);return t==null?void 0:Math.trunc(t)},fa=e=>pa(e),pa=e=>{if(!e||!ma(e))return;let t=Number(e);if(!(isNaN(t)||!isFinite(t)))return t},ma=e=>{for(let t of e)if(!(t>=`0`&&t<=`9`)&&!`+-.eE`.includes(t))return!1;return!0},ha=(e,t,n,r)=>{if(typeof t==`string`)return{parsedValue:e,parsedValueId:r,requestedType:n,usedDefault:!1,reason:`found-match`};try{let i=JSON.parse(e);return ga(i,t)?{parsedValue:i,parsedValueId:r,requestedType:n,usedDefault:!1,reason:`found-match`}:{parsedValue:t,parsedValueId:void 0,requestedType:n,usedDefault:!0,reason:`type-mismatch`}}catch{return{parsedValue:t,parsedValueId:void 0,requestedType:n,usedDefault:!0,reason:`invalid-json`}}},ga=(e,t)=>{if(e===null)return!1;let n=typeof t;return n===`bigint`?typeof e==`number`:typeof e===n};var _a=class{decorateMessage(e){return`[ConfigDirector:js-server-sdk] ${e}`}};const va=(t,n)=>new e(t??`warn`,n??new _a),ya=(e,t)=>new URL(e,t?.toString()),ba=async(e,t)=>e.valueId?{valueId:e.valueId}:e.value?e.value.length<=500&&e.type!=`json`?{value:e.value}:{valueId:await t(e.value)}:e,xa=e=>{if(e.type===`json`||e.type==null&&typeof e.value==`object`){if(e.valueId)return{valueId:e.valueId,type:`json`};try{return{value:JSON.stringify(e.value),type:`json`}}catch{return{value:e.value.toString(),type:`json`}}}let t=e.value?.toString();return t&&t.length<=500?{value:t}:e.valueId?{valueId:e.valueId}:{value:t}},Sa=e=>{let t=Object.keys(e);if(t.length==0)return!0;for(let n of t)if((e[n]?.length??0)>0)return!1;return!0},Ca=e=>{if(!e)return!0;let t=Object.keys(e);if(t.length==0)return!0;for(let n of t)if((e[n]??0)>0)return!1;return!0};var wa=class{constructor(e){this.executeRequests=!0,this.sdkKey=e.sdkKey,this.sdkIdentity=e.sdkIdentity,this.logger=e.logger,this.metaContext=e.metaContext,this.url=new URL(`server/telemetry/v1`,e.baseUrl.toString())}async report({discreteEvents:e,aggregatedEvents:t,droppedEvents:n}){if(!this.executeRequests)return{success:!1,fatalError:!0};let r={serverSdkKey:this.sdkKey,metaContext:{sdkName:this.sdkIdentity.sdkName,sdkVersion:this.sdkIdentity.sdkVersion,appName:this.metaContext.appName,appVersion:this.metaContext.appVersion},discreteEvents:e,aggregatedEvents:t,droppedEvents:n};if(this.isReportEmpty(r))return{success:!0,fatalError:!1};let i=await this.sendReport(r);return i.fatalError&&(this.executeRequests=!1),i}isReportEmpty(e){return Sa(e.discreteEvents)&&Sa(e.aggregatedEvents)&&Ca(e.droppedEvents)}async sendReport(e){try{let t=await g(5e3,this.url,{method:`POST`,body:JSON.stringify(e)},this.logger),n=this.isStatusFatal(t.status);return n&&this.logger.warn(`[EventReporter] Received a fatal status response (${t.status}) from the telemetry endpoint. No more telemetry data will be sent.`),{success:t.ok,fatalError:n}}catch(e){return this.logger.warn(`[EventReporter] Error attempting to send telemetry data: ${e}`,{error:e}),{success:!1,fatalError:!1}}}isStatusFatal(e){return!!e&&e>=400&&e<500&&e!=429}},Ta=class{aggregate(e){if(e.events.length==0)return[];let t=new Map;for(let n of e.events){let e=JSON.stringify(n),r=t.get(e)?.count||0;t.set(e,{event:n,count:r+1})}return Array.from(t).map(([,t])=>({startTime:e.startTime,endTime:e.endTime,count:t.count,event:t.event}))}},Ea=class{constructor(e){this._events=[],this._droppedEventCount=0,this.limit=e??1e3}get events(){return this._events}get reachedLimit(){return this._events.length>=this.limit}get droppedEventCount(){return this._droppedEventCount}push(...e){this.startTime||(this.startTime=new Date);let t=Math.max(0,e.length-this.limit),n=e.slice(t,e.length);if(this._droppedEventCount+=t,this._events.length+n.length>this.limit){let e=this._events.length+n.length-this.limit;this._events.splice(0,e),this._droppedEventCount+=e}return this._events.push(...n)}takeSnapshot(){let e=new Date,t=this.startTime??e,n=this._events.splice(0),r=this._droppedEventCount;return this.startTime=void 0,this._droppedEventCount=0,{startTime:t,endTime:e,events:n,droppedCount:r}}clear(){this._events=[],this.startTime=void 0,this._droppedEventCount=0}},Da=class{constructor(e){this.aggregator=new Ta,this.collectEvents=!0,this.logger=e.logger,this.evaluationEventQueue=new Ea(e.evaluationQueueLimit??1e3),this.flushIntervalDelay=e.flushIntervalDelay??3e4;let t=e.initialFlushIntervalDelay??5e3;this.flushTimeout=setTimeout(()=>this.flushAndScheduleNext(),t)}async flushAndScheduleNext(){if(!this.collectEvents)return;let e;try{e=await this.flush()}catch(t){this.logger.warn(`[TelemetryEventCollector] Error flushing telemetry events: `,t),e={success:!1,fatalError:!1}}e.fatalError?(this.collectEvents=!1,this.close(),this.logger.warn(`[TelemetryEventCollector] Received a fatal error from telemetry collection. No longer collecting events.`)):this.collectEvents&&(this.cancelScheduledFlush(),this.flushTimeout=setTimeout(()=>this.flushAndScheduleNext(),this.flushIntervalDelay))}cancelScheduledFlush(){clearTimeout(this.flushTimeout)}async close(){this.collectEvents=!1,clearTimeout(this.flushTimeout);try{await this.flush()}catch(e){this.logger.warn(`[TelemetryEventCollector] Error flushing telemetry events during close: `,e)}this.evaluationEventQueue.clear()}dispose(){this.close()}},Oa=class extends Map{constructor(e,t){super(t),this._droppedCount=0,this.limit=e,this.enforceLimit()}set(e,t){return super.set(e,t),this.enforceLimit(),this}get droppedCount(){return this._droppedCount}clearAndReset(){this.clear(),this._droppedCount=0}enforceLimit(){for(;this.size>this.limit;){let e=this.keys().next().value;e!==void 0&&(this.delete(e),this._droppedCount+=1)}}},ka=class{constructor(e){this.valueIdGenerator=e,this.valueIdGenerator=e}async process(e){let t=await Promise.all(e.events.map(async e=>({...e,defaultValue:await ba(e.defaultValue,this.valueIdGenerator),evaluatedValue:await ba(e.evaluatedValue,this.valueIdGenerator)})));return{...e,events:t}}},Aa=class extends Da{constructor(e){super(e),this.reporter=new wa(e),this.contexts=new Oa(e.contextLimit??1e3),this.evaluationEventSnapshotPreprocessor=new ka(e.valueIdGenerator)}evaluatedConfig(e){if(!this.collectEvents)return;e.context?.id&&!e.context.anonymous&&this.contexts.set(e.context.id,e.context);let t={...e.evaluation,contextId:e.context?.anonymous?void 0:e.context?.id};this.evaluationEventQueue.push(this.sanitizeEvaluatedConfigEvent(t))}sanitizeEvaluatedConfigEvent(e){return{...e,defaultValue:xa({value:e.defaultValue,type:e.type}),evaluatedValue:xa({value:e.evaluatedValue,valueId:e.evaluatedValueId,type:e.type})}}snapshotContexts(){let e=Array.from(this.contexts.values()),t=this.contexts.droppedCount;return this.contexts.clearAndReset(),{contexts:e,droppedCount:t}}async flush(){if(!this.reporter)return{success:!1,fatalError:!1};let e=await this.evaluationEventSnapshotPreprocessor.process(this.evaluationEventQueue.takeSnapshot()),t=this.snapshotContexts();return await this.reporter?.report({context:this._context,discreteEvents:{capturedContexts:t.contexts},aggregatedEvents:{evaluatedConfig:this.aggregator.aggregate(e)},droppedEvents:{evaluatedConfig:e.droppedCount,capturedContexts:t.droppedCount}})}};const ja=(e,t)=>{let n=BigInt(0),r=BigInt(62),i=Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``),a=BigInt(`0x`+i),o=``;for(;a>n;)o=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`[Number(a%r)]+o,a/=r;return o.padStart(t,`0`)},Ma=Math.ceil(128/Math.log2(62)),Na=async e=>ja(a(`sha256`).update(e?.toString()??``).digest().subarray(0,16),Ma),Pa=new URL(`https://server-sdk-api.configdirector.com`);var Fa=class{constructor(e,t,n){this.handlersMap=new Map,this.eventEmitter=new r,this.ready=!1,this.logger=n?.logger??va(),this.timeout=n?.connection?.timeout??3e3,this.metaContext=n?.metadata??{},this.validateSdkKeyPresence(e),this.configEvaluator=new aa(this.logger);let i=this.parseUrl(n?.connection?.url)??Pa;this.connectionMode=n?.connection?.mode??`streaming`;let a=this.getTransportConstructor(this.connectionMode),o=n?.telemetry?.eventQueueLimit??5e3;this.usageEventCollector=new Aa({sdkKey:e,sdkIdentity:t,metaContext:n?.metadata??{},logger:this.logger,baseUrl:i,flushIntervalDelay:n?.telemetry?.flushInterval??3e4,evaluationQueueLimit:Math.ceil(o*.7),contextLimit:Math.floor(o*.3),urlFactory:ya,valueIdGenerator:Na}),this.transport=new a({serverSdkKey:e,baseUrl:i,metaContext:{...n?.metadata,sdkName:t.sdkName,sdkVersion:t.sdkVersion},logger:this.logger,pollingInterval:n?.connection?.pollingInterval}),this.transport.on(`configBundleReceived`,e=>{this.readyResolve?.();let t=Object.keys(e.configs);!this.configSet||e.kind==`full`?(this.configSet=e,this.eventEmitter.emit(`configsUpdated`,{keys:t}),this.updateWatchers(e.configs)):(this.configSet.configs={...this.configSet.configs,...e.configs},this.eventEmitter.emit(`configsUpdated`,{keys:t}),this.updateWatchers(e.configs)),this.logger.debug(`[ConfigDirectorClient] ConfigSet updated from server with ${t.length} key(s)`,{keys:t})}),this.transport.on(`connectionError`,e=>{this.logger.error(`[ConfigDirectorClient] The connection encountered an unrecoverable error and will not be retried. Configs will no longer receive updates.`,e),this.eventEmitter.emit(`connectionError`,{error:e})}),this.registerHandler(`clientReady`,n?.hooks?.clientReady),this.registerHandler(`configEvaluated`,n?.hooks?.configEvaluated),this.registerHandler(`configsUpdated`,n?.hooks?.configsUpdated),this.registerHandler(`connectionError`,n?.hooks?.connectionError)}registerHandler(e,t){if(!t)return;let n=Array.isArray(t)?t:[t];for(let t of n)typeof t==`function`&&this.on(e,t)}async initialize(){try{this.ready=!1,this.readyPromise=new Promise(e=>{this.readyResolve=e}).then(()=>{this.ready=!0,this.eventEmitter.emit(`clientReady`),this.logger.debug(`[ConfigDirectorClient] Received initial payload from the server, client is ready`)});let e=new Date().getTime();await this.transport.connect(this.timeout);let t=new Date().getTime()-e,n=this.timeout-t;if(n>0&&await Promise.race([this.readyPromise,new Promise(e=>{setTimeout(()=>e(),n)})]),!this.ready){let e=this.connectionMode===`streaming`?`The client will continue to retry since there were no fatal errors detected. Configs will return the default value until the connection succeeds.`:`Since the client was configured without streaming, configs may not update and always return the default value.`;this.logger.warn(`[ConfigDirectorClient] Timed out waiting for initialization after ${this.timeout}ms. ${e}`)}}catch(e){this.logger.error(`[ConfigDirectorClient] An error occurred during initialization: `,e)}}getTransportConstructor(e){switch(e){case`polling`:return ae;default:return re}}updateWatchers(e){Object.values(e).forEach(e=>this.updateWatchersForConfig(e))}updateWatchersForConfig(e){this.handlersMap.get(e.key)?.forEach(t=>{let n=this.getValueFromConfigDefinition(e.key,e,t.defaultValue,t.context);t.handler(n)})}watch(e,t,n,r){this.validateDefaultValue(t);let i=this.handlersMap.get(e),a={handler:n,defaultValue:t,requestedType:typeof t,context:r};return i?i.push(a):this.handlersMap.set(e,[a]),()=>this.unwatch(e,n)}unwatch(e,t){let n=this.handlersMap.get(e);if(n)if(t){let e=n.findIndex(e=>e.handler==t);e>=0&&n?.splice(e,1)}else n.splice(0)}getValue(e,t,n){this.validateDefaultValue(t);let r=this.configSet?.configs[e];return this.getValueFromConfigDefinition(e,r,t,n)}getValueFromConfigDefinition(e,t,n,r){if(t){let i=this.configEvaluator.evaluate(t,{context:r,metadata:this.metaContext}),a=la(i,n);return this.usageEventCollector.evaluatedConfig({context:r,evaluation:{key:e,type:i.type,defaultValue:n,requestedType:a.requestedType,evaluatedValue:a.parsedValue,evaluatedValueId:a.parsedValueId,usedDefault:a.usedDefault,evaluationReason:a.reason}}),this.dispatchEvaluationEvent({key:e,value:a.parsedValue,valueId:a.parsedValueId??void 0,isDefaultValue:a.usedDefault,reason:a.reason,context:r}),this.logger.debug(`[ConfigDirectorClient] Evaluated '${e}' to '${a.parsedValue}'`),a.parsedValue}else{this.logger.debug(`[ConfigDirectorClient] No config state found for '${e}', returning default value '${n}'`);let t=this.isReady?`config-state-missing`:`client-not-ready`;return this.usageEventCollector.evaluatedConfig({context:r,evaluation:{key:e,defaultValue:n,requestedType:oa(n),evaluatedValue:n,usedDefault:!0,evaluationReason:t}}),this.dispatchEvaluationEvent({key:e,value:n,isDefaultValue:!0,reason:t,context:r}),n}}dispatchEvaluationEvent(e){setTimeout(()=>this.eventEmitter.emit(`configEvaluated`,{evaluation:e}),0)}parseUrl(e){if(e)try{return new URL(e)}catch(n){throw new t(`Invalid base URL '${e}'. Parsing failed: ${n}`)}}validateSdkKeyPresence(e){if(!e||e.trim().length==0)throw new t(`No server SDK key was provided, the client cannot be instantiated without a valid server SDK key`)}validateDefaultValue(e){if(e==null)throw new t(`Invalid default value. The default value for a config must be defined and non-null.`);if(typeof e==`function`)throw new t(`Invalid default value. The default value for a config cannot be a function.`)}get isReady(){return this.ready}on(e,t){this.eventEmitter.on(e,t)}off(e,t){t?this.eventEmitter.off(e,t):this.eventEmitter.removeAllListeners(e)}removeAllObservers(){this.logger.debug(`[ConfigDirectorClient] removeAllObservers() has been called, removing all observers`),this.eventEmitter.removeAllListeners(),this.handlersMap.clear()}unwatchAll(){this.handlersMap.clear()}getAllConfigs(e){if(!this.configSet)return{};let t=Object.entries(this.configSet.configs),n=e?.configKeys?t.filter(([t])=>e.configKeys?.includes(t)):t;return Object.fromEntries(n.map(([t,n])=>[t,this.configEvaluator.evaluate(n,{context:e?.context,metadata:this.metaContext})]))}closeConnection(){this.logger.debug(`[ConfigDirectorClient] closeConnection() has been called, closing connection to server`),this.transport.close(),this.ready=!1}dispose(){this.removeAllObservers(),this.closeConnection(),this.usageEventCollector.close().catch(e=>{this.logger.warn(`[ConfigDirectorClient] Error flushing telemetry while disposing the client: `,e)})}};export{Fa as DefaultConfigDirectorClient};
|
|
6
|
-
//# sourceMappingURL=DefaultConfigDirectorClient-CAMGE6h8.mjs.map
|