@admin-layout/client 12.2.5-alpha.2 → 12.2.5-alpha.7
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/lib/index.js +1 -1
- package/lib/index.native.js +1 -1
- package/lib/utils/flightCards.d.ts +79 -0
- package/lib/utils/flightCards.d.ts.map +1 -1
- package/lib/utils/flightCards.js +214 -11
- package/lib/utils/flightCards.js.map +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.d.ts.map +1 -1
- package/lib/utils/resultCards.d.ts +241 -0
- package/lib/utils/resultCards.d.ts.map +1 -0
- package/lib/utils/resultCards.js +640 -0
- package/lib/utils/resultCards.js.map +1 -0
- package/lib/utils/resultCards.test.d.ts +2 -0
- package/lib/utils/resultCards.test.d.ts.map +1 -0
- package/package.json +2 -2
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{SearchBarBehavior}from'./interfaces/settings.js';export{APPLICATION_ERROR_SLOT_FILL,CHANGE_LANGUAGE,CHANGE_SETTINGS_ACTION}from'./constants/constants.js';export{BACKEND_ERROR,CLEAR_APPLICATION_ERRORS,DISMISS_APPLICATION_ERROR,LOG_APPLICATION_ERROR,RESTORE_APPLICATION_ERRORS}from'./constants/error.js';export{HEADER_SEARCHBAR_FILL,HEADER_SEARCH_BUTTON_FILL,RIGHT_CONTENT_FILL,SCROLL_END_FILL}from'./constants/layout.js';export{languages}from'./constants/languages.js';export{dismissApplicationError,restoreApplicationError,setApplicationError}from'./redux/actions/error-actions.js';export{applicationErrors,initialErrorsState}from'./redux/reducers/error.js';export{settingsReducer}from'./redux/reducers/settings.js';export{store}from'./redux/store.js';export{useAppDispatch,useAppSelector}from'./redux/hooks.js';export{getMenuSeparation}from'./utils/seperatedMenus.js';export{useComponentSize,useIsomorphicLayoutEffect}from'./utils/componentSize.js';export{matchParentRoute}from'./utils/parentRoute.js';export{addProLayoutParentKeys,filterRoutesWithLocale,menuDataRender,removeUnnecessaryProperties,setLocale,transformData}from'./utils/menuUtils.js';export{getMatchMenuKeys}from'./utils/matchMenuKeys.js';export{generateMenuPath}from'./utils/generateMenuLink.js';export{compareAndSaveSettingsDifferences}from'./utils/settingsDifference.js';export{safeLocalStorage}from'./utils/storage.js';export{getStorageMode,isSpaMode,settingsStorage}from'./utils/settingsStorage.js';export{dateLabel,dayOffset,durationLabel,flightPrice,isFlightAttachment,stopsLabel,toFlightCard,toFlightCards,wallClock}from'./utils/flightCards.js';export{ApplicationErrorHandlerCommon}from'./components/ApplicationErrorHandlerCommon.js';export{ErrorBoundaryCommon}from'./components/ErrorBoundaryCommon.js';export{ApplicationErrorFillWrapper}from'./components/ApplicationErrorFillWrapper.js';export{LayoutCookieProvider}from'./components/LayoutCookieProvider.js';export{ErrorLink,errorReduxLink}from'./graphql/link/error-link.js';export{systemFont}from'./themes/systemFont/index.js';export{borderRadius,colors,lightLayoutTheme,lightNavigationBarTheme,lightTabBarTheme,shadows,sizes,spacings,textVariants}from'./themes/templates/lightLayoutTheme.js';export{createLayoutTheme}from'./themes/templates/createLayoutTheme.js';export{darkColors,darkLayoutTheme,darkNavigationBarTheme,darkTabBarTheme}from'./themes/templates/darkLayoutTheme.js';export{config}from'./config/env-config.js';export{AMENITIES,DEFAULT_HEADER,DEFAULT_LAYOUT,DEFAULT_SETTINGS,SEARCH_TYPES,SHARED_VIEW_CONFIG}from'./config/defaultSettings.js';export{useLayoutSettings}from'./hooks/useLayoutSettings.js';export{usePermissionAutoFetch,useSetting,useSettingsLoader}from'@adminide-stack/platform-client';export{ClientOnly}from'./hooks/Client-only.js';export{blue}from'./colors/presets/blue.js';export{brinkPink}from'./colors/presets/brinkPink.js';export{cyan}from'./colors/presets/cyan.js';export{green}from'./colors/presets/green.js';export{lime}from'./colors/presets/lime.js';export{orange}from'./colors/presets/orange.js';export{pink}from'./colors/presets/pink.js';export{purple}from'./colors/presets/purple.js';export{red}from'./colors/presets/red.js';export{skyBlue}from'./colors/presets/skyBlue.js';export{turquoise}from'./colors/presets/turquoise.js';export{yellow}from'./colors/presets/yellow.js';export{white}from'./colors/presets/white.js';export{black}from'./colors/presets/black.js';export{colorList,getThemeColors}from'./colors/colorsList.js';//# sourceMappingURL=index.js.map
|
|
1
|
+
export{SearchBarBehavior}from'./interfaces/settings.js';export{APPLICATION_ERROR_SLOT_FILL,CHANGE_LANGUAGE,CHANGE_SETTINGS_ACTION}from'./constants/constants.js';export{BACKEND_ERROR,CLEAR_APPLICATION_ERRORS,DISMISS_APPLICATION_ERROR,LOG_APPLICATION_ERROR,RESTORE_APPLICATION_ERRORS}from'./constants/error.js';export{HEADER_SEARCHBAR_FILL,HEADER_SEARCH_BUTTON_FILL,RIGHT_CONTENT_FILL,SCROLL_END_FILL}from'./constants/layout.js';export{languages}from'./constants/languages.js';export{dismissApplicationError,restoreApplicationError,setApplicationError}from'./redux/actions/error-actions.js';export{applicationErrors,initialErrorsState}from'./redux/reducers/error.js';export{settingsReducer}from'./redux/reducers/settings.js';export{store}from'./redux/store.js';export{useAppDispatch,useAppSelector}from'./redux/hooks.js';export{getMenuSeparation}from'./utils/seperatedMenus.js';export{useComponentSize,useIsomorphicLayoutEffect}from'./utils/componentSize.js';export{matchParentRoute}from'./utils/parentRoute.js';export{addProLayoutParentKeys,filterRoutesWithLocale,menuDataRender,removeUnnecessaryProperties,setLocale,transformData}from'./utils/menuUtils.js';export{getMatchMenuKeys}from'./utils/matchMenuKeys.js';export{generateMenuPath}from'./utils/generateMenuLink.js';export{compareAndSaveSettingsDifferences}from'./utils/settingsDifference.js';export{safeLocalStorage}from'./utils/storage.js';export{getStorageMode,isSpaMode,settingsStorage}from'./utils/settingsStorage.js';export{airlineCode,airlineTone,cabinLabel,dateLabel,dayOffset,durationLabel,flightBadgeLabel,flightNumberLabel,flightPrice,flightPriceValue,flightResultSummary,isFlightAttachment,rankFlightCards,sortFlightCards,stopsLabel,toFlightCard,toFlightCards,wallClock}from'./utils/flightCards.js';export{carSummary,countLabel,daysSince,groundSummary,hostLabel,jobSummary,movieSummary,postedLabel,productSummary,ratingLabel,resultBadgeLabel,sortResultCards,sourceLabelOf,staySummary,toCarCard,toCarCards,toGroundCard,toGroundCards,toJobCard,toJobCards,toMovieCard,toMovieCards,toProductCard,toProductCards,toResumeCard,toStayCard,toStayCards,travelItemKind,travelResultKind,travelResultNoun}from'./utils/resultCards.js';export{ApplicationErrorHandlerCommon}from'./components/ApplicationErrorHandlerCommon.js';export{ErrorBoundaryCommon}from'./components/ErrorBoundaryCommon.js';export{ApplicationErrorFillWrapper}from'./components/ApplicationErrorFillWrapper.js';export{LayoutCookieProvider}from'./components/LayoutCookieProvider.js';export{ErrorLink,errorReduxLink}from'./graphql/link/error-link.js';export{systemFont}from'./themes/systemFont/index.js';export{borderRadius,colors,lightLayoutTheme,lightNavigationBarTheme,lightTabBarTheme,shadows,sizes,spacings,textVariants}from'./themes/templates/lightLayoutTheme.js';export{createLayoutTheme}from'./themes/templates/createLayoutTheme.js';export{darkColors,darkLayoutTheme,darkNavigationBarTheme,darkTabBarTheme}from'./themes/templates/darkLayoutTheme.js';export{config}from'./config/env-config.js';export{AMENITIES,DEFAULT_HEADER,DEFAULT_LAYOUT,DEFAULT_SETTINGS,SEARCH_TYPES,SHARED_VIEW_CONFIG}from'./config/defaultSettings.js';export{useLayoutSettings}from'./hooks/useLayoutSettings.js';export{usePermissionAutoFetch,useSetting,useSettingsLoader}from'@adminide-stack/platform-client';export{ClientOnly}from'./hooks/Client-only.js';export{blue}from'./colors/presets/blue.js';export{brinkPink}from'./colors/presets/brinkPink.js';export{cyan}from'./colors/presets/cyan.js';export{green}from'./colors/presets/green.js';export{lime}from'./colors/presets/lime.js';export{orange}from'./colors/presets/orange.js';export{pink}from'./colors/presets/pink.js';export{purple}from'./colors/presets/purple.js';export{red}from'./colors/presets/red.js';export{skyBlue}from'./colors/presets/skyBlue.js';export{turquoise}from'./colors/presets/turquoise.js';export{yellow}from'./colors/presets/yellow.js';export{white}from'./colors/presets/white.js';export{black}from'./colors/presets/black.js';export{colorList,getThemeColors}from'./colors/colorsList.js';//# sourceMappingURL=index.js.map
|
package/lib/index.native.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{SearchBarBehavior}from'./interfaces/settings.js';export{APPLICATION_ERROR_SLOT_FILL,CHANGE_LANGUAGE,CHANGE_SETTINGS_ACTION}from'./constants/constants.js';export{BACKEND_ERROR,CLEAR_APPLICATION_ERRORS,DISMISS_APPLICATION_ERROR,LOG_APPLICATION_ERROR,RESTORE_APPLICATION_ERRORS}from'./constants/error.js';export{HEADER_SEARCHBAR_FILL,HEADER_SEARCH_BUTTON_FILL,RIGHT_CONTENT_FILL,SCROLL_END_FILL}from'./constants/layout.js';export{languages}from'./constants/languages.js';export{dismissApplicationError,restoreApplicationError,setApplicationError}from'./redux/actions/error-actions.js';export{applicationErrors,initialErrorsState}from'./redux/reducers/error.js';export{settingsReducer}from'./redux/reducers/settings.js';export{store}from'./redux/store.js';export{useAppDispatch,useAppSelector}from'./redux/hooks.js';export{getMenuSeparation}from'./utils/seperatedMenus.js';export{useComponentSize,useIsomorphicLayoutEffect}from'./utils/componentSize.js';export{matchParentRoute}from'./utils/parentRoute.js';export{addProLayoutParentKeys,filterRoutesWithLocale,menuDataRender,removeUnnecessaryProperties,setLocale,transformData}from'./utils/menuUtils.js';export{getMatchMenuKeys}from'./utils/matchMenuKeys.js';export{generateMenuPath}from'./utils/generateMenuLink.js';export{compareAndSaveSettingsDifferences}from'./utils/settingsDifference.js';export{safeLocalStorage}from'./utils/storage.js';export{getStorageMode,isSpaMode,settingsStorage}from'./utils/settingsStorage.js';export{dateLabel,dayOffset,durationLabel,flightPrice,isFlightAttachment,stopsLabel,toFlightCard,toFlightCards,wallClock}from'./utils/flightCards.js';export{ApplicationErrorHandlerCommon}from'./components/ApplicationErrorHandlerCommon.js';export{ErrorBoundaryCommon}from'./components/ErrorBoundaryCommon.js';export{ApplicationErrorFillWrapper}from'./components/ApplicationErrorFillWrapper.js';export{LayoutCookieProvider}from'./components/LayoutCookieProvider.js';export{ErrorLink,errorReduxLink}from'./graphql/link/error-link.js';export{systemFont}from'./themes/systemFont/index.js';export{borderRadius,colors,lightLayoutTheme,lightNavigationBarTheme,lightTabBarTheme,shadows,sizes,spacings,textVariants}from'./themes/templates/lightLayoutTheme.js';export{createLayoutTheme}from'./themes/templates/createLayoutTheme.js';export{darkColors,darkLayoutTheme,darkNavigationBarTheme,darkTabBarTheme}from'./themes/templates/darkLayoutTheme.js';export{config}from'./config/env-config.js';export{AMENITIES,DEFAULT_HEADER,DEFAULT_LAYOUT,DEFAULT_SETTINGS,SEARCH_TYPES,SHARED_VIEW_CONFIG}from'./config/defaultSettings.js';//# sourceMappingURL=index.native.js.map
|
|
1
|
+
export{SearchBarBehavior}from'./interfaces/settings.js';export{APPLICATION_ERROR_SLOT_FILL,CHANGE_LANGUAGE,CHANGE_SETTINGS_ACTION}from'./constants/constants.js';export{BACKEND_ERROR,CLEAR_APPLICATION_ERRORS,DISMISS_APPLICATION_ERROR,LOG_APPLICATION_ERROR,RESTORE_APPLICATION_ERRORS}from'./constants/error.js';export{HEADER_SEARCHBAR_FILL,HEADER_SEARCH_BUTTON_FILL,RIGHT_CONTENT_FILL,SCROLL_END_FILL}from'./constants/layout.js';export{languages}from'./constants/languages.js';export{dismissApplicationError,restoreApplicationError,setApplicationError}from'./redux/actions/error-actions.js';export{applicationErrors,initialErrorsState}from'./redux/reducers/error.js';export{settingsReducer}from'./redux/reducers/settings.js';export{store}from'./redux/store.js';export{useAppDispatch,useAppSelector}from'./redux/hooks.js';export{getMenuSeparation}from'./utils/seperatedMenus.js';export{useComponentSize,useIsomorphicLayoutEffect}from'./utils/componentSize.js';export{matchParentRoute}from'./utils/parentRoute.js';export{addProLayoutParentKeys,filterRoutesWithLocale,menuDataRender,removeUnnecessaryProperties,setLocale,transformData}from'./utils/menuUtils.js';export{getMatchMenuKeys}from'./utils/matchMenuKeys.js';export{generateMenuPath}from'./utils/generateMenuLink.js';export{compareAndSaveSettingsDifferences}from'./utils/settingsDifference.js';export{safeLocalStorage}from'./utils/storage.js';export{getStorageMode,isSpaMode,settingsStorage}from'./utils/settingsStorage.js';export{airlineCode,airlineTone,cabinLabel,dateLabel,dayOffset,durationLabel,flightBadgeLabel,flightNumberLabel,flightPrice,flightPriceValue,flightResultSummary,isFlightAttachment,rankFlightCards,sortFlightCards,stopsLabel,toFlightCard,toFlightCards,wallClock}from'./utils/flightCards.js';export{carSummary,countLabel,daysSince,groundSummary,hostLabel,jobSummary,movieSummary,postedLabel,productSummary,ratingLabel,resultBadgeLabel,sortResultCards,sourceLabelOf,staySummary,toCarCard,toCarCards,toGroundCard,toGroundCards,toJobCard,toJobCards,toMovieCard,toMovieCards,toProductCard,toProductCards,toResumeCard,toStayCard,toStayCards,travelItemKind,travelResultKind,travelResultNoun}from'./utils/resultCards.js';export{ApplicationErrorHandlerCommon}from'./components/ApplicationErrorHandlerCommon.js';export{ErrorBoundaryCommon}from'./components/ErrorBoundaryCommon.js';export{ApplicationErrorFillWrapper}from'./components/ApplicationErrorFillWrapper.js';export{LayoutCookieProvider}from'./components/LayoutCookieProvider.js';export{ErrorLink,errorReduxLink}from'./graphql/link/error-link.js';export{systemFont}from'./themes/systemFont/index.js';export{borderRadius,colors,lightLayoutTheme,lightNavigationBarTheme,lightTabBarTheme,shadows,sizes,spacings,textVariants}from'./themes/templates/lightLayoutTheme.js';export{createLayoutTheme}from'./themes/templates/createLayoutTheme.js';export{darkColors,darkLayoutTheme,darkNavigationBarTheme,darkTabBarTheme}from'./themes/templates/darkLayoutTheme.js';export{config}from'./config/env-config.js';export{AMENITIES,DEFAULT_HEADER,DEFAULT_LAYOUT,DEFAULT_SETTINGS,SEARCH_TYPES,SHARED_VIEW_CONFIG}from'./config/defaultSettings.js';//# sourceMappingURL=index.native.js.map
|
|
@@ -48,7 +48,13 @@ export interface FlightOfferSetLike {
|
|
|
48
48
|
properties?: FlightOfferLike[];
|
|
49
49
|
/** ISO 4217 currency of the `price` values (default "USD"). */
|
|
50
50
|
currency?: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
totalCount?: number;
|
|
51
53
|
}
|
|
54
|
+
/** A standout a card can be labelled with once the result set is ranked. */
|
|
55
|
+
export type FlightBadge = 'cheapest' | 'fastest' | 'best';
|
|
56
|
+
/** Orderings a result list offers. `recommended` keeps the order the agent returned. */
|
|
57
|
+
export type FlightSort = 'recommended' | 'cheapest' | 'fastest' | 'departure';
|
|
52
58
|
export interface FlightSliceView {
|
|
53
59
|
origin: string;
|
|
54
60
|
destination: string;
|
|
@@ -57,7 +63,12 @@ export interface FlightSliceView {
|
|
|
57
63
|
/** "+1" when it lands on a later calendar day than it left. */
|
|
58
64
|
dayOffset?: string;
|
|
59
65
|
stops?: string;
|
|
66
|
+
/** Numeric stops for a renderer that draws them on the route line. */
|
|
67
|
+
stopCount?: number;
|
|
60
68
|
duration?: string;
|
|
69
|
+
durationMinutes?: number;
|
|
70
|
+
/** "Sun, Oct 4": the slice's departure date. */
|
|
71
|
+
date?: string;
|
|
61
72
|
/**
|
|
62
73
|
* The small line under the route. One way: the duration only, since the
|
|
63
74
|
* footer already says how it flies ("ANA · Nonstop"). Round trip: duration
|
|
@@ -79,6 +90,26 @@ export interface FlightCardView {
|
|
|
79
90
|
price?: string;
|
|
80
91
|
/** One sentence a screen reader announces for the whole card. */
|
|
81
92
|
accessibleLabel: string;
|
|
93
|
+
/** Marketing airline, e.g. "Airblue". */
|
|
94
|
+
airline?: string;
|
|
95
|
+
/** Two-letter monogram for the airline tile: the IATA prefix of a flight number, else initials. */
|
|
96
|
+
airlineCode: string;
|
|
97
|
+
/** Stable 0..7 palette slot for the monogram, so one airline keeps one colour across cards. */
|
|
98
|
+
airlineTone: number;
|
|
99
|
+
/** "PA 201", or "PA 201 · PA 202" for a round trip. */
|
|
100
|
+
flightNumber?: string;
|
|
101
|
+
seller?: string;
|
|
102
|
+
/** Outbound departure date, "Sun, Oct 4". */
|
|
103
|
+
date?: string;
|
|
104
|
+
/** Humanised cabin, "Business"; omitted for plain economy. */
|
|
105
|
+
cabin?: string;
|
|
106
|
+
roundTrip: boolean;
|
|
107
|
+
/** Numeric price for ranking; undefined when the offer carries no usable number. */
|
|
108
|
+
priceValue?: number;
|
|
109
|
+
/** Door-to-door minutes across every slice; undefined when any slice lacks one. */
|
|
110
|
+
totalMinutes?: number;
|
|
111
|
+
/** Set by {@link rankFlightCards}: the standouts this card is. */
|
|
112
|
+
badges: FlightBadge[];
|
|
82
113
|
}
|
|
83
114
|
export declare const wallClock: (iso?: string) => string | undefined;
|
|
84
115
|
export declare const dayOffset: (departAt?: string, arriveAt?: string) => string | undefined;
|
|
@@ -87,8 +118,56 @@ export declare const dateLabel: (iso?: string) => string | undefined;
|
|
|
87
118
|
export declare const stopsLabel: (stops?: number) => string | undefined;
|
|
88
119
|
export declare const durationLabel: (minutes?: number) => string | undefined;
|
|
89
120
|
export declare const flightPrice: (item: FlightOfferLike, currency?: string) => string | undefined;
|
|
121
|
+
/** The numeric fare, from `price` or parsed out of the label; undefined when neither is usable. */
|
|
122
|
+
export declare const flightPriceValue: (item: FlightOfferLike) => number | undefined;
|
|
123
|
+
/** "premium_economy" → "Premium economy"; plain economy is the default and reads as nothing. */
|
|
124
|
+
export declare const cabinLabel: (cabinClass?: string) => string | undefined;
|
|
125
|
+
export declare const flightNumberLabel: (numbers?: string[]) => string | undefined;
|
|
126
|
+
/** The two-letter tile for an airline: its IATA prefix when a flight number carries one, else initials. */
|
|
127
|
+
export declare const airlineCode: (airline?: string, flightNumbers?: string[]) => string;
|
|
128
|
+
/** A stable palette slot for an airline name, so Airblue is the same colour on every card. */
|
|
129
|
+
export declare const airlineTone: (airline?: string, slots?: number) => number;
|
|
90
130
|
/** True when the attachment is a flight result, so the card shows flights, not stays. */
|
|
91
131
|
export declare const isFlightAttachment: (a?: FlightOfferSetLike) => boolean;
|
|
92
132
|
export declare const toFlightCard: (item: FlightOfferLike, index: number, currency?: string) => FlightCardView | null;
|
|
133
|
+
export declare const flightBadgeLabel: (badge: FlightBadge) => string;
|
|
134
|
+
/**
|
|
135
|
+
* Labels the standouts of a result set: the cheapest fare, the shortest trip,
|
|
136
|
+
* and, when it is a third card, the best price-for-time. Needs two priced
|
|
137
|
+
* offers to mean anything; a lone card gets no badge. Cards keep their order.
|
|
138
|
+
*/
|
|
139
|
+
export declare const rankFlightCards: (cards: FlightCardView[]) => FlightCardView[];
|
|
140
|
+
/** Every offer as a ranked card; stays and unusable items are skipped. */
|
|
93
141
|
export declare const toFlightCards: (a: FlightOfferSetLike) => FlightCardView[];
|
|
142
|
+
/** A stable ordering of the cards; `recommended` is the order the agent returned them in. */
|
|
143
|
+
export declare const sortFlightCards: (cards: FlightCardView[], sort: FlightSort) => FlightCardView[];
|
|
144
|
+
/** One quick pick in the result header: "Cheapest · $61 · Airblue". */
|
|
145
|
+
export interface FlightPick {
|
|
146
|
+
badge: FlightBadge;
|
|
147
|
+
label: string;
|
|
148
|
+
/** The card it points at. */
|
|
149
|
+
key: string;
|
|
150
|
+
price?: string;
|
|
151
|
+
duration?: string;
|
|
152
|
+
airline?: string;
|
|
153
|
+
}
|
|
154
|
+
/** What a result set is as a whole: the line above the cards and the panel header. */
|
|
155
|
+
export interface FlightResultSummary {
|
|
156
|
+
/** "ISB → KHI", or "ISB ⇄ KHI" for a round trip. */
|
|
157
|
+
route?: string;
|
|
158
|
+
origin?: string;
|
|
159
|
+
destination?: string;
|
|
160
|
+
roundTrip: boolean;
|
|
161
|
+
/** "Sun, Oct 4", or "Sun, Oct 4 – Sun, Oct 11"; unset when the offers span different dates. */
|
|
162
|
+
date?: string;
|
|
163
|
+
/** True when every offer leaves on the same date, so a card need not repeat it. */
|
|
164
|
+
sameDate: boolean;
|
|
165
|
+
count: number;
|
|
166
|
+
/** Lowest fare, formatted. */
|
|
167
|
+
fromPrice?: string;
|
|
168
|
+
/** The seller, when every offer comes from one. */
|
|
169
|
+
seller?: string;
|
|
170
|
+
picks: FlightPick[];
|
|
171
|
+
}
|
|
172
|
+
export declare const flightResultSummary: (a: FlightOfferSetLike, cards?: FlightCardView[]) => FlightResultSummary;
|
|
94
173
|
//# sourceMappingURL=flightCards.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flightCards.d.ts","sourceRoot":"","sources":["../../src/utils/flightCards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAC9B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAChC,wDAAwD;IACxD,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IAC/B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"flightCards.d.ts","sourceRoot":"","sources":["../../src/utils/flightCards.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/flightCards.js
CHANGED
|
@@ -56,22 +56,100 @@ const durationLabel = (minutes) => {
|
|
|
56
56
|
return `${m}m`;
|
|
57
57
|
return m === 0 ? `${h}h` : `${h}h ${m}m`;
|
|
58
58
|
};
|
|
59
|
-
const
|
|
60
|
-
if (item.priceLabel)
|
|
61
|
-
return item.priceLabel;
|
|
62
|
-
if (typeof item.price !== 'number' || !Number.isFinite(item.price))
|
|
63
|
-
return undefined;
|
|
59
|
+
const formatCurrency = (amount, currency) => {
|
|
64
60
|
try {
|
|
65
|
-
return new Intl.NumberFormat('en-US', {
|
|
61
|
+
return (new Intl.NumberFormat('en-US', {
|
|
66
62
|
style: 'currency',
|
|
67
63
|
currency,
|
|
68
64
|
maximumFractionDigits: 0,
|
|
69
|
-
})
|
|
65
|
+
})
|
|
66
|
+
.format(amount)
|
|
67
|
+
// Intl pads "PKR 17,500" with a no-break space; a plain one wraps and compares sanely.
|
|
68
|
+
.replace(/\u00a0/g, ' '));
|
|
70
69
|
}
|
|
71
70
|
catch {
|
|
72
71
|
// An unknown currency code must not take the whole card down.
|
|
73
|
-
return `${Math.round(
|
|
72
|
+
return `${Math.round(amount)} ${currency}`;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/** A provider label written as "<ISO code> <amount>", e.g. "USD 61.00" or "PKR 17,500". */
|
|
76
|
+
const CODE_AMOUNT = /^([A-Z]{3})\s+([\d,]+(?:\.\d+)?)$/;
|
|
77
|
+
const flightPrice = (item, currency = 'USD') => {
|
|
78
|
+
if (item.priceLabel) {
|
|
79
|
+
// "USD 61.00" reads as "$61": same currency, the way a fare is printed.
|
|
80
|
+
const m = CODE_AMOUNT.exec(item.priceLabel.trim());
|
|
81
|
+
if (m) {
|
|
82
|
+
const amount = Number(m[2].replace(/,/g, ''));
|
|
83
|
+
if (Number.isFinite(amount))
|
|
84
|
+
return formatCurrency(amount, m[1]);
|
|
85
|
+
}
|
|
86
|
+
return item.priceLabel;
|
|
74
87
|
}
|
|
88
|
+
if (typeof item.price !== 'number' || !Number.isFinite(item.price))
|
|
89
|
+
return undefined;
|
|
90
|
+
return formatCurrency(item.price, currency);
|
|
91
|
+
};
|
|
92
|
+
/** The numeric fare, from `price` or parsed out of the label; undefined when neither is usable. */
|
|
93
|
+
const flightPriceValue = (item) => {
|
|
94
|
+
if (typeof item.price === 'number' && Number.isFinite(item.price) && item.price > 0)
|
|
95
|
+
return item.price;
|
|
96
|
+
const digits = item.priceLabel?.replace(/[^\d.]/g, '');
|
|
97
|
+
const parsed = digits ? Number(digits) : NaN;
|
|
98
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
99
|
+
};
|
|
100
|
+
const CABIN_LABELS = {
|
|
101
|
+
economy: 'Economy',
|
|
102
|
+
premium_economy: 'Premium economy',
|
|
103
|
+
premium: 'Premium economy',
|
|
104
|
+
business: 'Business',
|
|
105
|
+
first: 'First',
|
|
106
|
+
};
|
|
107
|
+
/** "premium_economy" → "Premium economy"; plain economy is the default and reads as nothing. */
|
|
108
|
+
const cabinLabel = (cabinClass) => {
|
|
109
|
+
const key = cabinClass
|
|
110
|
+
?.trim()
|
|
111
|
+
.toLowerCase()
|
|
112
|
+
.replace(/[\s-]+/g, '_');
|
|
113
|
+
if (!key || key === 'economy')
|
|
114
|
+
return undefined;
|
|
115
|
+
return CABIN_LABELS[key] ?? key.replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
|
|
116
|
+
};
|
|
117
|
+
/** An IATA (2 chars, at least one letter) or ICAO (3 letters) airline code, then the number. */
|
|
118
|
+
const FLIGHT_NUMBER = /^([A-Z]{2,3}|[A-Z][0-9]|[0-9][A-Z])\s*(\d{1,4}[A-Z]?)$/i;
|
|
119
|
+
/** "PA201" → "PA 201"; anything else is shown as written. */
|
|
120
|
+
const formatFlightNumber = (raw) => {
|
|
121
|
+
const m = FLIGHT_NUMBER.exec(raw.trim());
|
|
122
|
+
return m ? `${m[1].toUpperCase()} ${m[2].toUpperCase()}` : raw.trim();
|
|
123
|
+
};
|
|
124
|
+
const flightNumberLabel = (numbers) => {
|
|
125
|
+
const list = (numbers ?? []).map((n) => n?.trim()).filter(Boolean);
|
|
126
|
+
if (list.length === 0)
|
|
127
|
+
return undefined;
|
|
128
|
+
const shown = list.slice(0, 2).map(formatFlightNumber);
|
|
129
|
+
return list.length > 2 ? `${shown.join(' · ')} +${list.length - 2}` : shown.join(' · ');
|
|
130
|
+
};
|
|
131
|
+
/** The two-letter tile for an airline: its IATA prefix when a flight number carries one, else initials. */
|
|
132
|
+
const airlineCode = (airline, flightNumbers) => {
|
|
133
|
+
const first = flightNumbers?.find((n) => n && FLIGHT_NUMBER.test(n.trim()));
|
|
134
|
+
if (first)
|
|
135
|
+
return FLIGHT_NUMBER.exec(first.trim())[1].toUpperCase().slice(0, 2);
|
|
136
|
+
const words = (airline ?? '')
|
|
137
|
+
.split(/[\s,/&-]+/)
|
|
138
|
+
.map((w) => w.replace(/[^A-Za-z0-9]/g, ''))
|
|
139
|
+
.filter(Boolean);
|
|
140
|
+
if (words.length === 0)
|
|
141
|
+
return '✈';
|
|
142
|
+
if (words.length === 1)
|
|
143
|
+
return words[0].slice(0, 2).toUpperCase();
|
|
144
|
+
return (words[0][0] + words[1][0]).toUpperCase();
|
|
145
|
+
};
|
|
146
|
+
/** A stable palette slot for an airline name, so Airblue is the same colour on every card. */
|
|
147
|
+
const airlineTone = (airline, slots = 8) => {
|
|
148
|
+
const s = (airline ?? '').toLowerCase();
|
|
149
|
+
let h = 0;
|
|
150
|
+
for (let i = 0; i < s.length; i++)
|
|
151
|
+
h = (h * 31 + s.charCodeAt(i)) >>> 0;
|
|
152
|
+
return h % slots;
|
|
75
153
|
};
|
|
76
154
|
const sliceView = (s) => ({
|
|
77
155
|
origin: s.origin,
|
|
@@ -80,7 +158,12 @@ const sliceView = (s) => ({
|
|
|
80
158
|
arriveTime: wallClock(s.arriveAt),
|
|
81
159
|
dayOffset: dayOffset(s.departAt, s.arriveAt),
|
|
82
160
|
stops: stopsLabel(s.stops),
|
|
161
|
+
stopCount: typeof s.stops === 'number' && Number.isFinite(s.stops) && s.stops >= 0 ? s.stops : undefined,
|
|
83
162
|
duration: durationLabel(s.durationMinutes),
|
|
163
|
+
durationMinutes: typeof s.durationMinutes === 'number' && Number.isFinite(s.durationMinutes) && s.durationMinutes > 0
|
|
164
|
+
? s.durationMinutes
|
|
165
|
+
: undefined,
|
|
166
|
+
date: dateLabel(s.departAt),
|
|
84
167
|
});
|
|
85
168
|
/** True when the attachment is a flight result, so the card shows flights, not stays. */
|
|
86
169
|
const isFlightAttachment = (a) => !!a?.properties?.some((p) => (p.flight?.slices?.length ?? 0) > 0);
|
|
@@ -95,17 +178,20 @@ const toFlightCard = (item, index, currency) => {
|
|
|
95
178
|
if (!flight || slices.length === 0)
|
|
96
179
|
return null;
|
|
97
180
|
const outbound = flight.slices[0];
|
|
98
|
-
const seller = flight.seller?.trim();
|
|
181
|
+
const seller = flight.seller?.trim() || undefined;
|
|
182
|
+
const airline = flight.airline?.trim() || undefined;
|
|
99
183
|
const date = dateLabel(outbound.departAt);
|
|
100
184
|
const header = [seller, date].filter(Boolean).join(' · ') || `${slices[0].origin} to ${slices[0].destination}`;
|
|
101
185
|
// One direction: say how it flies. A round trip already shows stops per
|
|
102
186
|
// row, so the footer names the trip type instead of repeating them.
|
|
103
187
|
const how = roundTrip ? 'Round trip' : slices[0].stops;
|
|
104
|
-
const footer = [
|
|
188
|
+
const footer = [airline || item.title, how].filter(Boolean).join(' · ');
|
|
105
189
|
const price = flightPrice(item, currency);
|
|
106
190
|
const spoken = slices
|
|
107
191
|
.map((s) => `${s.origin} ${s.departTime ?? ''} to ${s.destination} ${s.arriveTime ?? ''}${s.dayOffset === '+1' ? ' next day' : s.dayOffset ? ` ${s.dayOffset.slice(1)} days later` : ''}${s.stops ? `, ${s.stops.toLowerCase()}` : ''}`)
|
|
108
192
|
.join('; returning ');
|
|
193
|
+
const minutes = slices.map((s) => s.durationMinutes);
|
|
194
|
+
const totalMinutes = minutes.every((m) => m != null) ? minutes.reduce((a, b) => a + b, 0) : undefined;
|
|
109
195
|
return {
|
|
110
196
|
key: item.id ?? `flight-${index}`,
|
|
111
197
|
url: item.url,
|
|
@@ -123,6 +209,123 @@ const toFlightCard = (item, index, currency) => {
|
|
|
123
209
|
]
|
|
124
210
|
.filter(Boolean)
|
|
125
211
|
.join(', '),
|
|
212
|
+
airline,
|
|
213
|
+
airlineCode: airlineCode(airline, flight.flightNumbers),
|
|
214
|
+
airlineTone: airlineTone(airline ?? item.title),
|
|
215
|
+
flightNumber: flightNumberLabel(flight.flightNumbers),
|
|
216
|
+
seller,
|
|
217
|
+
date,
|
|
218
|
+
cabin: cabinLabel(flight.cabinClass),
|
|
219
|
+
roundTrip,
|
|
220
|
+
priceValue: flightPriceValue(item),
|
|
221
|
+
totalMinutes,
|
|
222
|
+
badges: [],
|
|
126
223
|
};
|
|
127
224
|
};
|
|
128
|
-
const
|
|
225
|
+
const BADGE_WORDS = {
|
|
226
|
+
cheapest: 'cheapest',
|
|
227
|
+
fastest: 'fastest',
|
|
228
|
+
best: 'best value',
|
|
229
|
+
};
|
|
230
|
+
const flightBadgeLabel = (badge) => badge === 'best' ? 'Best value' : badge === 'cheapest' ? 'Cheapest' : 'Fastest';
|
|
231
|
+
/**
|
|
232
|
+
* Labels the standouts of a result set: the cheapest fare, the shortest trip,
|
|
233
|
+
* and, when it is a third card, the best price-for-time. Needs two priced
|
|
234
|
+
* offers to mean anything; a lone card gets no badge. Cards keep their order.
|
|
235
|
+
*/
|
|
236
|
+
const rankFlightCards = (cards) => {
|
|
237
|
+
const priced = cards.filter((c) => c.priceValue != null);
|
|
238
|
+
if (priced.length < 2)
|
|
239
|
+
return cards.map((c) => ({ ...c, badges: [] }));
|
|
240
|
+
const byPrice = (a, b) => a.priceValue - b.priceValue || (a.totalMinutes ?? Infinity) - (b.totalMinutes ?? Infinity);
|
|
241
|
+
const cheapest = [...priced].sort(byPrice)[0];
|
|
242
|
+
const timed = priced.filter((c) => c.totalMinutes != null);
|
|
243
|
+
const fastest = timed.length
|
|
244
|
+
? [...timed].sort((a, b) => a.totalMinutes - b.totalMinutes || a.priceValue - b.priceValue)[0]
|
|
245
|
+
: undefined;
|
|
246
|
+
let best;
|
|
247
|
+
if (fastest && timed.length >= 2) {
|
|
248
|
+
const minPrice = cheapest.priceValue;
|
|
249
|
+
const minMinutes = fastest.totalMinutes;
|
|
250
|
+
const score = (c) => c.priceValue / minPrice + c.totalMinutes / minMinutes;
|
|
251
|
+
best = [...timed].sort((a, b) => score(a) - score(b) || byPrice(a, b))[0];
|
|
252
|
+
}
|
|
253
|
+
return cards.map((c) => {
|
|
254
|
+
const badges = [];
|
|
255
|
+
if (c === cheapest)
|
|
256
|
+
badges.push('cheapest');
|
|
257
|
+
if (fastest && c === fastest)
|
|
258
|
+
badges.push('fastest');
|
|
259
|
+
// "Best value" only when it is a different card: the cheapest or
|
|
260
|
+
// fastest already says more than a derived score would.
|
|
261
|
+
if (best && c === best && c !== cheapest && c !== fastest)
|
|
262
|
+
badges.push('best');
|
|
263
|
+
if (badges.length === 0)
|
|
264
|
+
return { ...c, badges };
|
|
265
|
+
return {
|
|
266
|
+
...c,
|
|
267
|
+
badges,
|
|
268
|
+
accessibleLabel: `${badges.map((b) => BADGE_WORDS[b]).join(' and ')}, ${c.accessibleLabel}`,
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
/** Every offer as a ranked card; stays and unusable items are skipped. */
|
|
273
|
+
const toFlightCards = (a) => rankFlightCards((a.properties ?? [])
|
|
274
|
+
.map((p, i) => toFlightCard(p, i, a.currency))
|
|
275
|
+
.filter((c) => c !== null));
|
|
276
|
+
/** A stable ordering of the cards; `recommended` is the order the agent returned them in. */
|
|
277
|
+
const sortFlightCards = (cards, sort) => {
|
|
278
|
+
if (sort === 'recommended')
|
|
279
|
+
return cards;
|
|
280
|
+
const metric = (c) => {
|
|
281
|
+
if (sort === 'cheapest')
|
|
282
|
+
return c.priceValue ?? Infinity;
|
|
283
|
+
if (sort === 'fastest')
|
|
284
|
+
return c.totalMinutes ?? Infinity;
|
|
285
|
+
return c.slices[0]?.departTime ?? '99:99';
|
|
286
|
+
};
|
|
287
|
+
return cards
|
|
288
|
+
.map((c, index) => ({ c, index, m: metric(c) }))
|
|
289
|
+
.sort((a, b) => (a.m < b.m ? -1 : a.m > b.m ? 1 : 0) || a.index - b.index)
|
|
290
|
+
.map((x) => x.c);
|
|
291
|
+
};
|
|
292
|
+
const flightResultSummary = (a, cards = toFlightCards(a)) => {
|
|
293
|
+
const first = cards[0];
|
|
294
|
+
const out = first?.slices[0];
|
|
295
|
+
const back = first?.roundTrip ? first.slices[first.slices.length - 1] : undefined;
|
|
296
|
+
const roundTrip = !!back;
|
|
297
|
+
const dates = new Set(cards.map((c) => c.date ?? ''));
|
|
298
|
+
const sameDate = dates.size <= 1;
|
|
299
|
+
const outDate = sameDate ? first?.date : undefined;
|
|
300
|
+
const date = outDate ? [outDate, back?.date].filter(Boolean).join(' – ') : undefined;
|
|
301
|
+
const priced = cards.filter((c) => c.priceValue != null);
|
|
302
|
+
const cheapestCard = priced.length ? [...priced].sort((x, y) => x.priceValue - y.priceValue)[0] : undefined;
|
|
303
|
+
const sellers = new Set(cards.map((c) => c.seller ?? ''));
|
|
304
|
+
const seller = sellers.size === 1 ? first?.seller : undefined;
|
|
305
|
+
const picks = [];
|
|
306
|
+
for (const badge of ['cheapest', 'fastest', 'best']) {
|
|
307
|
+
const card = cards.find((c) => c.badges.includes(badge));
|
|
308
|
+
if (!card)
|
|
309
|
+
continue;
|
|
310
|
+
picks.push({
|
|
311
|
+
badge,
|
|
312
|
+
label: flightBadgeLabel(badge),
|
|
313
|
+
key: card.key,
|
|
314
|
+
price: card.price,
|
|
315
|
+
duration: durationLabel(card.totalMinutes),
|
|
316
|
+
airline: card.airline,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
route: out ? `${out.origin} ${roundTrip ? '⇄' : '→'} ${out.destination}` : undefined,
|
|
321
|
+
origin: out?.origin,
|
|
322
|
+
destination: out?.destination,
|
|
323
|
+
roundTrip,
|
|
324
|
+
date,
|
|
325
|
+
sameDate,
|
|
326
|
+
count: a.totalCount ?? cards.length,
|
|
327
|
+
fromPrice: cheapestCard?.price,
|
|
328
|
+
seller,
|
|
329
|
+
picks,
|
|
330
|
+
};
|
|
331
|
+
};export{airlineCode,airlineTone,cabinLabel,dateLabel,dayOffset,durationLabel,flightBadgeLabel,flightNumberLabel,flightPrice,flightPriceValue,flightResultSummary,isFlightAttachment,rankFlightCards,sortFlightCards,stopsLabel,toFlightCard,toFlightCards,wallClock};//# sourceMappingURL=flightCards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flightCards.js","sources":["../../src/utils/flightCards.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;AAWG;AAEH,MAAA,UAAA,GAAA,kBAAA;AACA,MAAM,aAAW,GAAA,0BAAiB;AAC9B,MAAA,SAAA,GAAA,CAAA,GAAA,KAAA;IACA,MAAM,CAAA,SAAS,UAAA,CAAA,IAAA,CAAA,GAAA,CAAA,GAAA,IAAA;IACf,OAAA,CAAA,GAAW,CAAA,OAAQ,CAAC,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,SAAA;;MAEpB,MAAQ,GAAG,CAAA,GAAA,KAAO;IAClB,MAAA,CAAA,GAAS,GAAE,GAAA,aAAO,CAAA,IAAA,CAAA,GAAA,CAAA,GAAA,IAAA;IAClB,OAAA,CAAA,GAAA,IAAA,CAAA,GAAmB,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,SAAA;;AAEnB,MAAA,SAAA,GAAA,CAAA,QAAA,EAAA,QAAA,KAAA;IACA,MAAA,CAAA,GAAA,MAAgB,CAAA,QAAS,CAAA;AAC5B,IAAA,MAAA,CAAA,GAAA,MAAA,CAAA,QAAA,CAAA;AAED,IAAA,aAAiB,IAAA,CAAA,IAAA,IAAA;QACb,OAAA,SAAA;IACA,MAAM,IAAE,GAAA,IAAA,CAAA,KAAA,CAAA,CAAiB,CAAA,GAAG,CAAA,IAAA,UAAA,CAAA;IAC5B,OAAA,IAAA,GAAA,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,GAAA,SAAA;;AAEA;AACA,MAAA,SAAA,GAAA,CAAA,GAAA,KAAA;IACA,MAAM,GAAG,GAAA,MAAO,CAAA,GAAA,CAAA;IAChB,IAAA,GAAA,IAAA,IAAA;QACA,OAAW,SAAS;AACvB,IAAA,OAAA,IAAA,IAAA,CAAA,GAAA,CAAA,CAAA,kBAAA,CAAA,OAAA,EAAA;AAED,QAAA,OAAA,EAAA,OAAA;AACA,sBAAiB;QACV,GAAE,EAAA,SAAO;QACZ,UAAc,KAAA;KACd,CAAA;;AAEM,MAAA,UAAO,GAAA,CAAA,KAAA,KAAA;IACb,IAAA,OAAS,KAAA,KAAA,QAAoB,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,KAAA,CAAA,IAAA,KAAA,GAAA,CAAA;AAChC,QAAA,OAAA,SAAA;AAED,IAAA,IAAA,KAAA,KAAA,CAAA;AACA,wBAAiB;AACb,IAAA,OAAA,KAAW,KAAE,CAAA,GAAA,QAAe,GAAG,CAAA,EAAA,KAAA,CAAA,MAAA,CAAA;;AAEvB,MAAC,aAAS,GAAA,CAAA,OAAA,KAAA;
|
|
1
|
+
{"version":3,"file":"flightCards.js","sources":["../../src/utils/flightCards.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/lib/utils/index.d.ts
CHANGED
package/lib/utils/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|