@envive-ai/react-hooks 0.3.10 → 0.3.12
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/dist/application/commerce-api.cjs +26 -22
- package/dist/application/commerce-api.d.cts +58 -0
- package/dist/application/commerce-api.d.ts +59 -0
- package/dist/application/commerce-api.js +16 -12
- package/dist/application/models/api/widgetText.d.cts +14 -0
- package/dist/application/models/api/widgetText.d.ts +14 -0
- package/dist/application/models/api/widgetTextRequest.d.cts +16 -0
- package/dist/application/models/api/widgetTextRequest.d.ts +16 -0
- package/dist/application/models/chatElementDisplayLocationV3.cjs +4 -1
- package/dist/application/models/chatElementDisplayLocationV3.d.cts +4 -1
- package/dist/application/models/chatElementDisplayLocationV3.d.ts +4 -1
- package/dist/application/models/chatElementDisplayLocationV3.js +4 -1
- package/dist/application/models/guards/api/index.cjs +7 -7
- package/dist/application/models/guards/api/index.js +7 -7
- package/dist/application/models/guards/api/isApiFormResponse.cjs +1 -1
- package/dist/application/models/guards/api/isApiFormResponse.js +1 -1
- package/dist/application/models/guards/api/isApiFormSubmittedResponseAttributes.cjs +1 -1
- package/dist/application/models/guards/api/isApiFormSubmittedResponseAttributes.js +1 -1
- package/dist/application/models/guards/api/isApiOrderResponseAttributes.cjs +1 -1
- package/dist/application/models/guards/api/isApiOrderResponseAttributes.js +1 -1
- package/dist/application/models/guards/api/isApiProductResponseAttributes.cjs +1 -1
- package/dist/application/models/guards/api/isApiProductResponseAttributes.js +1 -1
- package/dist/application/models/guards/api/isApiResponse.cjs +1 -1
- package/dist/application/models/guards/api/isApiResponse.js +1 -1
- package/dist/application/models/index.cjs +29 -29
- package/dist/application/models/index.d.cts +25 -25
- package/dist/application/models/index.d.ts +25 -25
- package/dist/application/models/index.js +29 -29
- package/dist/application/models/validators/validateGraphQLFrontendConfig.cjs +1 -1
- package/dist/application/models/validators/validateGraphQLFrontendConfig.js +1 -1
- package/dist/application/models/validators/validateResponse.cjs +3 -3
- package/dist/application/models/validators/validateResponse.js +3 -3
- package/dist/application/models/validators/validateUserEvent.cjs +2 -2
- package/dist/application/models/validators/validateUserEvent.js +2 -2
- package/dist/application/models/variantInfo/variantInfo.cjs +2 -1
- package/dist/application/models/variantInfo/variantInfo.d.cts +6 -1
- package/dist/application/models/variantInfo/variantInfo.d.ts +6 -1
- package/dist/application/models/variantInfo/variantInfo.js +2 -1
- package/dist/application/utils/analyticsUtils.cjs +1 -1
- package/dist/application/utils/analyticsUtils.js +1 -1
- package/dist/application/utils/nodeSelector.cjs +12 -14
- package/dist/application/utils/nodeSelector.js +12 -14
- package/dist/application/utils/widgetTextFromApiWidgetTextResponse.cjs +3 -1
- package/dist/application/utils/widgetTextFromApiWidgetTextResponse.js +3 -1
- package/dist/application/utils/widgetTextRequestToApiRequest.cjs +4 -1
- package/dist/application/utils/widgetTextRequestToApiRequest.js +4 -1
- package/dist/atoms/app/index.cjs +7 -7
- package/dist/atoms/app/index.d.cts +1 -1
- package/dist/atoms/app/index.d.ts +8 -8
- package/dist/atoms/app/index.js +1 -1
- package/dist/atoms/app/variant.cjs +44 -4
- package/dist/atoms/app/variant.d.cts +8 -8
- package/dist/atoms/app/variant.d.ts +8 -8
- package/dist/atoms/app/variant.js +44 -5
- package/dist/atoms/chat/chatState.d.cts +18 -18
- package/dist/atoms/chat/chatState.d.ts +17 -17
- package/dist/atoms/chat/form.cjs +1 -1
- package/dist/atoms/chat/form.d.cts +2 -2
- package/dist/atoms/chat/form.d.ts +2 -2
- package/dist/atoms/chat/form.js +1 -1
- package/dist/atoms/chat/index.d.cts +3 -3
- package/dist/atoms/chat/index.d.ts +2 -2
- package/dist/atoms/chat/lastMessage.d.cts +2 -2
- package/dist/atoms/chat/lastMessage.d.ts +2 -2
- package/dist/atoms/chat/messageQueue.d.cts +6 -6
- package/dist/atoms/chat/messageQueue.d.ts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
- package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
- package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
- package/dist/atoms/chat/replies.d.cts +3 -3
- package/dist/atoms/chat/replies.d.ts +3 -3
- package/dist/atoms/chat/suggestions.d.cts +2 -2
- package/dist/atoms/chat/suggestions.d.ts +2 -2
- package/dist/atoms/envive/enviveConfig.d.cts +19 -0
- package/dist/atoms/envive/enviveConfig.d.ts +19 -0
- package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
- package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
- package/dist/atoms/org/customerService.d.cts +6 -6
- package/dist/atoms/org/customerService.d.ts +6 -6
- package/dist/atoms/org/graphqlConfig.d.cts +4 -4
- package/dist/atoms/org/graphqlConfig.d.ts +4 -4
- package/dist/atoms/org/index.cjs +1 -1
- package/dist/atoms/org/index.js +1 -1
- package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
- package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
- package/dist/atoms/org/orgAnalyticsConfig.d.cts +5 -5
- package/dist/atoms/org/orgAnalyticsConfig.d.ts +5 -5
- package/dist/atoms/search/chatSearch.cjs +1 -1
- package/dist/atoms/search/chatSearch.d.cts +17 -17
- package/dist/atoms/search/chatSearch.d.ts +17 -17
- package/dist/atoms/search/chatSearch.js +1 -1
- package/dist/atoms/search/searchAPI.d.cts +13 -13
- package/dist/atoms/search/searchAPI.d.ts +13 -13
- package/dist/atoms/search/types.d.cts +1 -1
- package/dist/atoms/search/types.d.ts +1 -1
- package/dist/atoms/search/utils.d.cts +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
- package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
- package/dist/config/locators/components/search/index.d.cts +1 -1
- package/dist/contexts/amplitudeContext/amplitudeContext.cjs +9 -7
- package/dist/contexts/amplitudeContext/amplitudeContext.d.cts +2 -2
- package/dist/contexts/amplitudeContext/amplitudeContext.d.ts +2 -2
- package/dist/contexts/amplitudeContext/amplitudeContext.js +5 -3
- package/dist/contexts/amplitudeContext/index.cjs +1 -0
- package/dist/contexts/amplitudeContext/index.d.cts +2 -2
- package/dist/contexts/amplitudeContext/index.d.ts +2 -2
- package/dist/contexts/amplitudeContext/index.js +2 -2
- package/dist/contexts/cdnContext/cdnContext.cjs +3 -3
- package/dist/contexts/enviveConfigContext/enviveConfigContext.cjs +6 -5
- package/dist/contexts/enviveConfigContext/enviveConfigContext.d.cts +2 -1
- package/dist/contexts/enviveConfigContext/enviveConfigContext.d.ts +2 -1
- package/dist/contexts/enviveConfigContext/enviveConfigContext.js +3 -2
- package/dist/contexts/enviveContext/WindowChatToggleBinder.cjs +4 -3
- package/dist/contexts/enviveContext/WindowChatToggleBinder.js +4 -3
- package/dist/contexts/enviveContext/enviveContext.cjs +23 -16
- package/dist/contexts/enviveContext/enviveContext.d.cts +5 -1
- package/dist/contexts/enviveContext/enviveContext.d.ts +5 -1
- package/dist/contexts/enviveContext/enviveContext.js +23 -16
- package/dist/contexts/enviveContext/types.d.cts +1 -1
- package/dist/contexts/enviveContext/types.d.ts +1 -1
- package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.cjs +23 -2
- package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.cts +11 -2
- package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.d.ts +11 -2
- package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.js +23 -2
- package/dist/contexts/featureFlagServiceContext/index.d.cts +2 -2
- package/dist/contexts/featureFlagServiceContext/index.d.ts +2 -2
- package/dist/contexts/graphqlContext/graphqlContext.cjs +7 -7
- package/dist/contexts/graphqlContext/graphqlContext.d.cts +1 -1
- package/dist/contexts/graphqlContext/graphqlContext.d.ts +1 -1
- package/dist/contexts/graphqlContext/graphqlContext.js +3 -3
- package/dist/contexts/graphqlContext/mockV3Config.cjs +10 -4
- package/dist/contexts/graphqlContext/mockV3Config.js +10 -4
- package/dist/contexts/hardcopyContext/hardcopyContext.cjs +60 -6
- package/dist/contexts/hardcopyContext/hardcopyContext.d.cts +8 -3
- package/dist/contexts/hardcopyContext/hardcopyContext.d.ts +8 -3
- package/dist/contexts/hardcopyContext/hardcopyContext.js +58 -4
- package/dist/contexts/newOrgConfigContext/newOrgConfigContext.cjs +3 -3
- package/dist/contexts/pageContext/mapping.cjs +6 -2
- package/dist/contexts/pageContext/mapping.js +6 -2
- package/dist/contexts/pageContext/pageContext.cjs +12 -7
- package/dist/contexts/pageContext/pageContext.js +10 -5
- package/dist/contexts/pageContext/types.d.cts +7 -3
- package/dist/contexts/pageContext/types.d.ts +7 -3
- package/dist/contexts/salesAgentContext/chatAPI.cjs +101 -12
- package/dist/contexts/salesAgentContext/chatAPI.d.cts +8 -4
- package/dist/contexts/salesAgentContext/chatAPI.d.ts +8 -4
- package/dist/contexts/salesAgentContext/chatAPI.js +103 -14
- package/dist/contexts/salesAgentContext/salesAgentContext.cjs +1 -1
- package/dist/contexts/salesAgentContext/salesAgentContext.js +1 -1
- package/dist/contexts/salesAgentContext/salesAgentService.cjs +52 -10
- package/dist/contexts/salesAgentContext/salesAgentService.js +50 -8
- package/dist/contexts/searchContext/searchContext.cjs +4 -4
- package/dist/contexts/searchContext/searchContext.js +1 -1
- package/dist/contexts/systemSettingsContext/systemSettingsContext.cjs +3 -3
- package/dist/contexts/systemSettingsContext/systemSettingsContext.d.cts +2 -2
- package/dist/contexts/types.cjs +1 -1
- package/dist/contexts/types.d.cts +10 -3
- package/dist/contexts/types.d.ts +10 -3
- package/dist/contexts/types.js +1 -1
- package/dist/contexts/typesV3.cjs +2 -1
- package/dist/contexts/typesV3.d.cts +28 -7
- package/dist/contexts/typesV3.d.ts +26 -5
- package/dist/contexts/typesV3.js +2 -1
- package/dist/contexts/userIdentityContext/userIdentityContext.cjs +3 -3
- package/dist/contexts/widgetConfigContext/widgetConfigContext.cjs +1 -1
- package/dist/contexts/widgetConfigContext/widgetConfigContext.js +1 -1
- package/dist/hooks/AppDetails/useAppDetails.cjs +6 -6
- package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
- package/dist/hooks/ImageResolver/useImageResolver.cjs +3 -3
- package/dist/hooks/Search/useSearch.cjs +4 -4
- package/dist/hooks/Search/useSearch.d.cts +1 -1
- package/dist/hooks/Search/useSearch.d.ts +1 -1
- package/dist/hooks/Search/useSearch.js +1 -1
- package/dist/services/amplitudeService/amplitudeService.cjs +49 -11
- package/dist/services/amplitudeService/amplitudeService.d.cts +18 -3
- package/dist/services/amplitudeService/amplitudeService.d.ts +18 -3
- package/dist/services/amplitudeService/amplitudeService.js +49 -12
- package/dist/services/amplitudeService/index.cjs +1 -0
- package/dist/services/amplitudeService/index.d.cts +2 -2
- package/dist/services/amplitudeService/index.d.ts +2 -2
- package/dist/services/amplitudeService/index.js +2 -2
- package/dist/types/customerService.d.cts +3 -1
- package/dist/types/customerService.d.ts +1 -1
- package/dist/types/enviveConfig.d.cts +4 -1
- package/dist/types/enviveConfig.d.ts +4 -1
- package/package.json +10 -2
- package/src/application/commerce-api.ts +25 -20
- package/src/application/models/api/widgetText.ts +2 -0
- package/src/application/models/api/widgetTextRequest.ts +2 -0
- package/src/application/models/chatElementDisplayLocationV3.ts +3 -0
- package/src/application/models/variantInfo/variantInfo.ts +5 -0
- package/src/application/utils/nodeSelector.ts +15 -14
- package/src/application/utils/widgetTextFromApiWidgetTextResponse.ts +2 -0
- package/src/application/utils/widgetTextRequestToApiRequest.ts +5 -0
- package/src/atoms/app/variant.ts +56 -2
- package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +2 -0
- package/src/contexts/amplitudeContext/amplitudeContext.tsx +5 -1
- package/src/contexts/enviveConfigContext/enviveConfigContext.tsx +3 -0
- package/src/contexts/enviveContext/WindowChatToggleBinder.tsx +5 -1
- package/src/contexts/enviveContext/enviveContext.tsx +10 -3
- package/src/contexts/featureFlagServiceContext/featureFlagServiceContext.tsx +36 -0
- package/src/contexts/graphqlContext/mockV3Config.ts +13 -7
- package/src/contexts/hardcopyContext/hardcopyContext.tsx +67 -4
- package/src/contexts/pageContext/mapping.ts +13 -1
- package/src/contexts/pageContext/pageContext.tsx +9 -4
- package/src/contexts/pageContext/types.ts +7 -1
- package/src/contexts/salesAgentContext/chatAPI.ts +105 -13
- package/src/contexts/salesAgentContext/salesAgentService.ts +66 -4
- package/src/contexts/types.ts +11 -2
- package/src/contexts/typesV3.ts +42 -16
- package/src/services/amplitudeService/__tests__/amplitudeService.test.ts +80 -0
- package/src/services/amplitudeService/amplitudeService.ts +55 -11
- package/src/types/enviveConfig.ts +3 -0
|
@@ -46,8 +46,20 @@ export enum SpiffyMetricsEventName {
|
|
|
46
46
|
SearchSortClicked = 'Search Sort Clicked',
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
export enum EnviveMetricsEventName {
|
|
50
|
+
WidgetRendered = 'Widget Rendered',
|
|
51
|
+
WidgetInteraction = 'Widget Interaction',
|
|
52
|
+
ChatRequest = 'Chat Request',
|
|
53
|
+
ChatResponse = 'Chat Response',
|
|
54
|
+
EnviveInitialized = 'Envive Initialized',
|
|
55
|
+
PageViewed = 'Page Viewed', // Will this be useful?
|
|
56
|
+
WidgetTextRequest = 'Widget Text Request',
|
|
57
|
+
WidgetTextResponse = 'Widget Text Response',
|
|
58
|
+
WidgetTextClicked = 'Widget Text Clicked',
|
|
59
|
+
}
|
|
60
|
+
|
|
49
61
|
export interface TrackEventParams {
|
|
50
|
-
eventName: SpiffyMetricsEventName;
|
|
62
|
+
eventName: SpiffyMetricsEventName | EnviveMetricsEventName;
|
|
51
63
|
eventProps?: Record<string, unknown>;
|
|
52
64
|
eventGroups?: Record<string, unknown>;
|
|
53
65
|
alsoSendToGoogleAnalytics?: boolean;
|
|
@@ -64,6 +76,7 @@ export interface AmplitudeServiceConfig {
|
|
|
64
76
|
featureFlagService: FeatureFlagService;
|
|
65
77
|
orgGaConfig?: unknown;
|
|
66
78
|
show: boolean;
|
|
79
|
+
enviveOn: boolean;
|
|
67
80
|
enabledFeatures?: Record<string, boolean>;
|
|
68
81
|
getLocalStorageItem: null | ((key: string) => string | null);
|
|
69
82
|
}
|
|
@@ -101,7 +114,9 @@ export class AmplitudeService {
|
|
|
101
114
|
return null;
|
|
102
115
|
}
|
|
103
116
|
|
|
104
|
-
private getDefaultTrackingProps(
|
|
117
|
+
private getDefaultTrackingProps(
|
|
118
|
+
eventName: SpiffyMetricsEventName | EnviveMetricsEventName,
|
|
119
|
+
): Record<string, unknown> {
|
|
105
120
|
const featureGates = Object.entries(this.config.featureFlagService.getFeatureFlags());
|
|
106
121
|
const gatesProps =
|
|
107
122
|
featureGates.length > 0
|
|
@@ -114,16 +129,32 @@ export class AmplitudeService {
|
|
|
114
129
|
: {};
|
|
115
130
|
const experimentProps = {}; // No direct equivalent for experiments in EnviveConfig yet
|
|
116
131
|
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
132
|
+
const environmentProps = {
|
|
133
|
+
'environment.execution_context': 'bundle',
|
|
134
|
+
'environment.page_url': window.location.href,
|
|
135
|
+
'environment.envive_user_id': this.config.userId,
|
|
136
|
+
'environment.execution_environment': this.config.env || 'unknown',
|
|
137
|
+
'environment.context_source': this.config.contextSource,
|
|
138
|
+
'environment.sales_agent_enabled': this.config.enabledFeatures?.salesAgent ?? false,
|
|
139
|
+
'environment.search_enabled': this.config.enabledFeatures?.searchAgent ?? false,
|
|
140
|
+
'environment.envive_on_query_param': this.config.enviveOn,
|
|
141
|
+
'environment.window_show': this.config.show,
|
|
142
|
+
'environment.envive_enabled': this.config.enabledFeatures?.envive,
|
|
120
143
|
};
|
|
121
144
|
|
|
145
|
+
const orgLevelAmplitudeTrackingProps = AmplitudeService.isEnviveEvent(eventName)
|
|
146
|
+
? {
|
|
147
|
+
...this.config.featureFlagService.getFullFlagValues(),
|
|
148
|
+
...experimentProps,
|
|
149
|
+
...environmentProps,
|
|
150
|
+
}
|
|
151
|
+
: {
|
|
152
|
+
...gatesProps,
|
|
153
|
+
...experimentProps,
|
|
154
|
+
};
|
|
122
155
|
return {
|
|
123
156
|
...orgLevelAmplitudeTrackingProps,
|
|
124
157
|
...this.supplementalDefaultProps,
|
|
125
|
-
// TODO: org_id is not directly available in EnviveConfig. Need to find a new source or derive it.
|
|
126
|
-
// org_id: orgConfig?.org?.org?.id,
|
|
127
158
|
app_id: 'commerce-chat-react-component',
|
|
128
159
|
chat_id: this.getLocalStorageItem(LocalStorageKeys.ChatId),
|
|
129
160
|
env: this.config.env || 'unknown',
|
|
@@ -143,7 +174,7 @@ export class AmplitudeService {
|
|
|
143
174
|
|
|
144
175
|
// eslint-disable-next-line class-methods-use-this
|
|
145
176
|
private eventPropsToPrefixedEventProps(
|
|
146
|
-
eventName: SpiffyMetricsEventName,
|
|
177
|
+
eventName: SpiffyMetricsEventName | EnviveMetricsEventName,
|
|
147
178
|
eventProps: Record<string, unknown>,
|
|
148
179
|
): Record<string, unknown> {
|
|
149
180
|
const prefix = eventName.toLowerCase().replace(/\s+/g, '_');
|
|
@@ -200,7 +231,9 @@ export class AmplitudeService {
|
|
|
200
231
|
...event,
|
|
201
232
|
event_properties: {
|
|
202
233
|
...event.event_properties,
|
|
203
|
-
...this.getDefaultTrackingProps(
|
|
234
|
+
...this.getDefaultTrackingProps(
|
|
235
|
+
event.event_type as SpiffyMetricsEventName | EnviveMetricsEventName,
|
|
236
|
+
),
|
|
204
237
|
...globalProperties,
|
|
205
238
|
...enabledFeaturesProperties,
|
|
206
239
|
...timingProperties,
|
|
@@ -342,6 +375,17 @@ export class AmplitudeService {
|
|
|
342
375
|
return eventProps ?? {};
|
|
343
376
|
}
|
|
344
377
|
|
|
378
|
+
static isEnviveEvent(eventName: SpiffyMetricsEventName | EnviveMetricsEventName): boolean {
|
|
379
|
+
return Object.values(EnviveMetricsEventName).includes(eventName as EnviveMetricsEventName);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
static decorateEventName(eventName: SpiffyMetricsEventName | EnviveMetricsEventName): string {
|
|
383
|
+
if (AmplitudeService.isEnviveEvent(eventName)) {
|
|
384
|
+
return `[Envive] ${eventName}`;
|
|
385
|
+
}
|
|
386
|
+
return `[Spiffy] ${eventName}`;
|
|
387
|
+
}
|
|
388
|
+
|
|
345
389
|
async trackEvent({
|
|
346
390
|
eventName,
|
|
347
391
|
eventProps,
|
|
@@ -350,7 +394,7 @@ export class AmplitudeService {
|
|
|
350
394
|
}: TrackEventParams): Promise<void> {
|
|
351
395
|
Logger.logDebug('Submitting event', eventName);
|
|
352
396
|
try {
|
|
353
|
-
const decoratedEventName =
|
|
397
|
+
const decoratedEventName = AmplitudeService.decorateEventName(eventName);
|
|
354
398
|
|
|
355
399
|
if (!this.amplitudeClient) {
|
|
356
400
|
Logger.logWarn('amplitude client undefined', undefined, {
|
|
@@ -382,7 +426,7 @@ export class AmplitudeService {
|
|
|
382
426
|
this.amplitudeClient.track(
|
|
383
427
|
decoratedEventName,
|
|
384
428
|
{
|
|
385
|
-
...this.getDefaultTrackingProps(),
|
|
429
|
+
...this.getDefaultTrackingProps(eventName),
|
|
386
430
|
...mappedEventProps,
|
|
387
431
|
...(mappedEventProps
|
|
388
432
|
? this.eventPropsToPrefixedEventProps(eventName, mappedEventProps)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { FrontendConfigOverrides, VariantInfo } from 'src/application/models';
|
|
2
|
+
import type { HardcopyResponse } from 'src/contexts/hardcopyContext/hardcopyContext';
|
|
3
|
+
import type { WidgetTypeV3 } from 'src/contexts/typesV3';
|
|
2
4
|
|
|
3
5
|
export interface EnviveConfig {
|
|
4
6
|
publicKey?: string;
|
|
@@ -15,6 +17,7 @@ export interface EnviveConfig {
|
|
|
15
17
|
initialOpenSearchOverlay?: boolean;
|
|
16
18
|
WidgetMountingOverride?: Record<string, any>[];
|
|
17
19
|
configChanges?: FrontendConfigOverrides[];
|
|
20
|
+
hardcopyOverride?: Partial<Record<WidgetTypeV3, HardcopyResponse>>;
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
declare global {
|