@sinequa/atomic-angular 1.9.3 → 1.9.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.
@@ -1249,41 +1249,51 @@ const PrincipalStore = signalStore({ providedIn: 'root' }, withDevtools('Princip
1249
1249
  .map(word => word[0]?.toUpperCase())
1250
1250
  .join('');
1251
1251
  }),
1252
- })), withMethods((store) => ({
1253
- /**
1254
- * @deprecated use getState(PrincipalStore))
1255
- */
1256
- principal() {
1257
- const { userOverrideActive: _, ...rest } = getState(store);
1258
- // this block cannot be put in a computed due to dynamic construction object with signals, which is not supported in computed.
1259
- // using a method allows us to construct the principal object on each call, ensuring that the signals are properly evaluated and returned as values.
1260
- const principal = Object.entries(rest).reduce((acc, [k, v]) => {
1261
- acc[k] = v;
1262
- return acc;
1263
- }, {});
1264
- return principal;
1265
- }
1266
- })), withPrincipalFeatures());
1267
- function withPrincipalFeatures() {
1268
- return signalStoreFeature(withMethods((store) => ({
1252
+ })), withMethods((store) => {
1253
+ // Shared across concurrent callers so two overlapping `initialize()` calls (e.g. a guard running
1254
+ // while another initialization is already in flight) await the same fetch instead of racing two
1255
+ // `fetchPrincipal()` requests.
1256
+ let pendingInitialization = null;
1257
+ return {
1258
+ /**
1259
+ * @deprecated use getState(PrincipalStore))
1260
+ */
1261
+ principal() {
1262
+ const { userOverrideActive: _, ...rest } = getState(store);
1263
+ // this block cannot be put in a computed due to dynamic construction object with signals, which is not supported in computed.
1264
+ // using a method allows us to construct the principal object on each call, ensuring that the signals are properly evaluated and returned as values.
1265
+ const principal = Object.entries(rest).reduce((acc, [k, v]) => {
1266
+ acc[k] = v;
1267
+ return acc;
1268
+ }, {});
1269
+ return principal;
1270
+ },
1269
1271
  async initialize() {
1270
- patchState(store, { state: 'loading' });
1271
- try {
1272
- // Use the SDK's fetchPrincipal so the principal load goes through the same auth handling
1273
- // as the rest of atomic (credentials: "include" + the authMode-aware noAutoAuthentication
1274
- // flag). In SSO mode it sends noAutoAuthentication=false, letting IIS/Windows authenticate.
1275
- const principal = await fetchPrincipal();
1276
- const { userOverrideActive = false } = globalConfig;
1277
- patchState(store, { ...initialPrincipal, ...principal, userOverrideActive, state: 'loaded' });
1278
- }
1279
- catch (error) {
1280
- console.error('Principal fetch failed', error);
1281
- patchState(store, { state: 'error' });
1282
- throw error;
1283
- }
1272
+ if (pendingInitialization)
1273
+ return pendingInitialization;
1274
+ pendingInitialization = (async () => {
1275
+ patchState(store, { state: 'loading' });
1276
+ try {
1277
+ // Use the SDK's fetchPrincipal so the principal load goes through the same auth handling
1278
+ // as the rest of atomic (credentials: "include" + the authMode-aware noAutoAuthentication
1279
+ // flag). In SSO mode it sends noAutoAuthentication=false, letting IIS/Windows authenticate.
1280
+ const principal = await fetchPrincipal();
1281
+ const { userOverrideActive = false } = globalConfig;
1282
+ patchState(store, { ...initialPrincipal, ...principal, userOverrideActive, state: 'loaded' });
1283
+ }
1284
+ catch (error) {
1285
+ console.error('Principal fetch failed', error);
1286
+ patchState(store, { state: 'error' });
1287
+ throw error;
1288
+ }
1289
+ finally {
1290
+ pendingInitialization = null;
1291
+ }
1292
+ })();
1293
+ return pendingInitialization;
1284
1294
  }
1285
- })));
1286
- }
1295
+ };
1296
+ }));
1287
1297
 
1288
1298
  /**
1289
1299
  * Creates a debounced signal that updates its value after a specified timeout.
@@ -1580,6 +1590,12 @@ function withThemes(app, themes) {
1580
1590
  return app;
1581
1591
  }
1582
1592
 
1593
+ /**
1594
+ * Mirrors @sinequa/atomic's `AUTH_REDIRECT_ATTEMPT_KEY` (authentication/constants.ts): the
1595
+ * sessionStorage flag set right before a provider (oauth/saml) full-page redirect. Not re-exported
1596
+ * by atomic, so mirrored here as well — the same mirroring already used in sign-in-form.ts.
1597
+ */
1598
+ const AUTH_REDIRECT_ATTEMPT_KEY$1 = "sinequa-auth-redirect-attempt";
1583
1599
  /**
1584
1600
  * sessionStorage flag recording that an SSO re-authentication reload has already been attempted.
1585
1601
  *
@@ -1597,6 +1613,10 @@ function markSsoReloadAttempted() {
1597
1613
  function clearSsoReloadAttempt() {
1598
1614
  sessionStorage.removeItem(SSO_RELOAD_ATTEMPT_KEY);
1599
1615
  }
1616
+ // Shared across concurrent callers (e.g. the error interceptor reacting to a 401 while a component
1617
+ // also calls signIn() itself) so only one clearSessionTokens()/login() handshake actually runs; the
1618
+ // others await and receive the same result instead of each clearing/re-establishing the session.
1619
+ let pendingSignIn = null;
1600
1620
  /**
1601
1621
  * Signs the user in according to the resolved {@link globalConfig.authMode}.
1602
1622
  *
@@ -1614,8 +1634,34 @@ function clearSsoReloadAttempt() {
1614
1634
  */
1615
1635
  async function signIn() {
1616
1636
  assertInInjectionContext(signIn);
1637
+ if (pendingSignIn)
1638
+ return pendingSignIn;
1617
1639
  const router = inject(Router);
1618
1640
  const lastUrlAfterNavigation = inject(NavigationService).urlAfterNavigation;
1641
+ pendingSignIn = performSignIn(router, lastUrlAfterNavigation).finally(() => {
1642
+ // A provider redirect (oauth/saml) or an SSO reload was just triggered: the page is about to
1643
+ // unload, but browser navigations are asynchronous — other pending work (e.g. a second,
1644
+ // independent signIn() call from a component that bypasses the HTTP interceptor) can still run
1645
+ // before that happens. Keep the mutex held in that case instead of releasing it, so any such
1646
+ // late arrival gets this same (already-decided) outcome rather than starting a fresh recovery
1647
+ // attempt that would misread the one-shot loop-guard flag — already set by THIS attempt — as a
1648
+ // genuine repeat failure and flash the error page moments before the pending navigation succeeds.
1649
+ const navigatingAway = sessionStorage.getItem(AUTH_REDIRECT_ATTEMPT_KEY$1) !== null || hasAttemptedSsoReload();
1650
+ if (!navigatingAway) {
1651
+ pendingSignIn = null;
1652
+ }
1653
+ });
1654
+ return pendingSignIn;
1655
+ }
1656
+ /**
1657
+ * @internal Test-only hook: forces the concurrent-call mutex back to its initial (unheld) state.
1658
+ * Production code never needs this — the mutex only stays held while a redirect/reload triggered
1659
+ * by `signIn()` is pending, a state a real page unload naturally clears by tearing down the module.
1660
+ */
1661
+ function __resetSignInMutexForTests() {
1662
+ pendingSignIn = null;
1663
+ }
1664
+ async function performSignIn(router, lastUrlAfterNavigation) {
1619
1665
  const { loginPath, authMode } = globalConfig;
1620
1666
  // Always clear authentication tokens first to clear any existing session
1621
1667
  clearSessionTokens();
@@ -1762,7 +1808,7 @@ async function bootstrapApp({ createRoutes = true } = {}) {
1762
1808
  }
1763
1809
  info('User authenticated, initializing application...');
1764
1810
  try {
1765
- await applicationService.initialize(createRoutes);
1811
+ await applicationService.initialize(createRoutes, { isBootstrap: true });
1766
1812
  info(`Application initialized successfully (createRoutes: ${createRoutes}).`);
1767
1813
  return true;
1768
1814
  }
@@ -3726,9 +3772,13 @@ function AuthGuard() {
3726
3772
  router.navigate([loginPath], { queryParams: { returnUrl: state.url } });
3727
3773
  return false;
3728
3774
  }
3729
- // If the user is authenticated, initialize the principal store if it's in the initial state
3775
+ // If the user is authenticated, make sure the principal store is loaded. Calling initialize()
3776
+ // whenever it isn't (instead of only when state is exactly "initial") means an initialization
3777
+ // already in flight elsewhere ("loading") is awaited rather than assumed absent — initialize()
3778
+ // itself dedupes concurrent calls into the same in-flight fetch — and a previous failed attempt
3779
+ // ("error") gets retried instead of permanently redirecting to login.
3730
3780
  try {
3731
- if (principalStore.state() === "initial") {
3781
+ if (principalStore.state() !== "loaded") {
3732
3782
  await principalStore.initialize();
3733
3783
  }
3734
3784
  }
@@ -3741,7 +3791,7 @@ function AuthGuard() {
3741
3791
  // check if the "princiapl" infos are loaded, if not navigate to the login page
3742
3792
  const { passwordExpirationDate, editablePartition, name, state: principalState } = getState(principalStore);
3743
3793
  if (principalState !== "loaded") {
3744
- info("PrincipalStore state is still initial after initialization attempt. Redirecting to login.");
3794
+ info("PrincipalStore state is not 'loaded' after initialization attempt. Redirecting to login.");
3745
3795
  router.navigate([loginPath], { queryParams: { returnUrl: state.url } });
3746
3796
  return false;
3747
3797
  }
@@ -3784,9 +3834,12 @@ class ApplicationService {
3784
3834
  * 1. Calls the `initializeStores` function to initialize all the application's stores.
3785
3835
  * 2. Calls the `createRoutes` function to set up the application routes.
3786
3836
  *
3837
+ * @param options.isBootstrap - Whether this is the initial app bootstrap (before Angular
3838
+ * Router's own initial navigation), as opposed to a later re-initialization (e.g. user
3839
+ * override). Forwarded to `initializeStores` — see there for why it matters.
3787
3840
  * @returns {Promise<void>} A promise that resolves when the initialization and route creation are complete.
3788
3841
  */
3789
- async initialize(withCreateRoutes = true) {
3842
+ async initialize(withCreateRoutes = true, options) {
3790
3843
  // throw an error if no components are registered and withCreateRoutes is true
3791
3844
  // components are required to create the routes
3792
3845
  if (withCreateRoutes && !this.components.length)
@@ -3795,7 +3848,7 @@ class ApplicationService {
3795
3848
  // this will override the value set in your global config
3796
3849
  setGlobalConfig({ createRoutes: withCreateRoutes });
3797
3850
  info("Initializing application...");
3798
- await this.initializeStores();
3851
+ await this.initializeStores(options);
3799
3852
  info("Application initialized");
3800
3853
  // this will set the title and logo of the application
3801
3854
  // it will also set the logo in the css variables
@@ -3824,8 +3877,16 @@ class ApplicationService {
3824
3877
  * - Resets the query params store (runs on first login as well as on every subsequent
3825
3878
  * re-initialization, e.g. user override, so no previous user's search state leaks in).
3826
3879
  * - Loads the user settings and logs the state of the user settings store.
3880
+ *
3881
+ * @param options.isBootstrap - During the initial app bootstrap this runs inside a
3882
+ * `provideAppInitializer`, BEFORE Angular Router's own initial navigation has processed the
3883
+ * browser's real URL. Resetting the query params store would otherwise navigate (consuming
3884
+ * the router's initial-navigation slot) and land the user on the wildcard route instead of the
3885
+ * deep link they actually loaded — so URL sync is skipped in that case. Later
3886
+ * re-initializations (user override) run with the router already navigated, so they keep
3887
+ * syncing the reset to the URL as before.
3827
3888
  */
3828
- async initializeStores() {
3889
+ async initializeStores(options) {
3829
3890
  try {
3830
3891
  // Fetch the application configuration
3831
3892
  await this.appStore.initialize();
@@ -3835,7 +3896,7 @@ class ApplicationService {
3835
3896
  info("principalStore", getState(this.principalStore));
3836
3897
  // Reset the query params (search text, filters, sort, ...) so a previous user's
3837
3898
  // in-memory search state doesn't leak into the next user's session. ES-32053.
3838
- this.queryParamsStore.reset();
3899
+ this.queryParamsStore.reset({ syncUrl: !options?.isBootstrap });
3839
3900
  // Load the user settings
3840
3901
  await this.userSettingsStore.initialize();
3841
3902
  info("userSettingsStore", getState(this.userSettingsStore));
@@ -4331,8 +4392,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4331
4392
  class NavigationService {
4332
4393
  router = inject(Router);
4333
4394
  auditService = inject(AuditService);
4334
- // The URL after the last navigation event, used to redirect the user after login
4335
- urlAfterNavigation = null;
4395
+ // Tracks the previous NavigationEnd url, used only to dedupe audit route-change notifications
4396
+ // in navigationEnd$ below. Kept separate from urlAfterNavigation so that getter stays correct
4397
+ // regardless of whether anything subscribes to navigationEnd$.
4398
+ previousNavigationUrl = null;
4399
+ /**
4400
+ * The URL of the current navigation, used to redirect the user after login.
4401
+ *
4402
+ * Sourced directly from `Router.url`, which Angular keeps up to date on every navigation with no
4403
+ * subscription required — unlike a field updated as a side effect of `navigationEnd$` below,
4404
+ * which only happens for whoever actually subscribes to it.
4405
+ */
4406
+ get urlAfterNavigation() {
4407
+ return this.router.url !== "/login" ? this.router.url : null;
4408
+ }
4336
4409
  /**
4337
4410
  * Observable that emits events of type `NavigationEnd` from the Angular Router.
4338
4411
  *
@@ -4341,19 +4414,18 @@ class NavigationService {
4341
4414
  * - Filters the events to only include instances of `NavigationEnd`.
4342
4415
  * - Taps into the event stream to extract the route name from the URL and notify the audit service of route changes,
4343
4416
  * excluding duplicate navigations.
4344
- * - Updates the `urlAfterNavigation` property with the current URL after navigation.
4345
4417
  * - Shares the replayed value with a buffer size of 1 to ensure subscribers receive the latest emitted value.
4346
4418
  *
4347
4419
  * @type Observable<RouterEvent>
4348
4420
  */
4349
4421
  navigationEnd$ = this.router.events.pipe(map((event) => event), filter$1((event) => event instanceof NavigationEnd), tap((event) => {
4350
4422
  const url = event.url.slice(1).split("?")[0]; // Extract route name
4351
- if (url && url !== this.urlAfterNavigation) {
4423
+ if (url && url !== this.previousNavigationUrl) {
4352
4424
  this.auditService.notifyRouteChange(url);
4353
4425
  }
4354
4426
  }), tap((event) => {
4355
4427
  if (event.url !== "/login") {
4356
- this.urlAfterNavigation = event.url;
4428
+ this.previousNavigationUrl = event.url;
4357
4429
  }
4358
4430
  }), shareReplay(1));
4359
4431
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -4615,14 +4687,28 @@ class PreviewService {
4615
4687
  /**
4616
4688
  * Sends a message to the iframe if it exists.
4617
4689
  *
4690
+ * Also keeps `selectedHighlightId` in sync with any `select` action, regardless of which
4691
+ * caller triggered it (side panel navigation, snippet auto-select on preview open, assistant
4692
+ * citations, etc.), so that re-enabling highlighting after it was toggled off can restore the
4693
+ * currently selected highlight.
4694
+ *
4618
4695
  * @param message - The message to be sent. It can be of any type.
4619
4696
  */
4620
4697
  sendMessage(message) {
4698
+ if (this.isSelectMessage(message)) {
4699
+ this.selectedHighlightId.set(message.id);
4700
+ }
4621
4701
  const iframe = this.iframe;
4622
4702
  if (iframe) {
4623
4703
  iframe.postMessage(message, "*");
4624
4704
  }
4625
4705
  }
4706
+ isSelectMessage(message) {
4707
+ return (typeof message === "object" &&
4708
+ message !== null &&
4709
+ message.action === "select" &&
4710
+ typeof message.id === "string");
4711
+ }
4626
4712
  /**
4627
4713
  * Get preview id for an entity value for an index
4628
4714
  * @param entity the entity type (i.e. "geo")
@@ -10124,7 +10210,6 @@ class ArticleExtracts {
10124
10210
  scrollTo(type, index, usePassageHighlighter = false) {
10125
10211
  // if previewData contains "matchingpassages" then we use the passage highlighter otherwise we use "extractslocations"
10126
10212
  const category = type || this.previewService.highlightCategory;
10127
- this.previewService.selectedHighlightId.set(`${category}_${index}`);
10128
10213
  this.previewService.events.set("scrollTo");
10129
10214
  this.previewService.sendMessage({ action: "select", id: `${category}_${index}`, usePassageHighlighter });
10130
10215
  }
@@ -12442,8 +12527,12 @@ class OverrideUserDialogComponent {
12442
12527
  notify.success(`Welcome back ${fullName}!`, { duration: 2000 });
12443
12528
  })
12444
12529
  .catch((err) => {
12530
+ // `err.message` already carries the backend's specific reason (e.g. "The user XYZ is
12531
+ // disabled") when @sinequa/atomic's UnauthorizedError is thrown with one — surface it
12532
+ // instead of a generic string so admins know why the override was rejected.
12533
+ const message = err?.message || "An error occurred while overriding";
12445
12534
  error("An error occurred while overriding (initialize)", err);
12446
- notify.error("An error occurred while overriding (initialize)", { duration: 2000 });
12535
+ notify.error(message, { duration: 5000, closeButton: true });
12447
12536
  setGlobalConfig({ userOverrideActive: false, userOverride: undefined });
12448
12537
  });
12449
12538
  }
@@ -17646,5 +17735,5 @@ const queryNameResolver = () => {
17646
17735
  * Generated bundle index. Do not edit.
17647
17736
  */
17648
17737
 
17649
- export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, AdvancedFiltersComponent, AdvancedSearch, AdvancedSearchComponent, AggregationComponent, AggregationDateComponent, AggregationDateRangeDialogComponent, AggregationItemDirective, AggregationListComponent, AggregationPanelComponent, AggregationTreeComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, ArticleEntities, ArticleExtracts, ArticleLabels, ArticleSimilarDocuments, AsideFiltersComponent, AuditFeedbackType, AuditService, AuthGuard, AuthPageComponent, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChangePasswordComponent, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, DRAWER_COMPONENT, DRAWER_STACK_MAX_COUNT, DateComponent, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, DrawerAdvancedFiltersComponent, DrawerComponent, DrawerNavbarComponent, DrawerPreviewComponent, DrawerService, DrawerStackComponent, DrawerStackService, DropdownInputComponent, DropdownListComponent, ErrorComponent, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FeatureFlagsDialogComponent, FeedbackDialogComponent, FileSizePipe, FilterButtonComponent, FiltersBarComponent, HIGHLIGHTS, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardNavigatorDirective, LabelService, LabelsEditDialog, LoadingComponent, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUserDialogComponent, PREVIEW_CONFIG, PagerComponent, PreviewNavigator, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearchDialog, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputFooter, SearchService, SelectArticleDirective, SelectArticleOnClickDirective, SelectionHistoryService, SelectionService, SelectionStore, ShowBookmarkDirective, SidebarNavComponent, SignInComponent, SignedOutComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserProfileDialog, UserProfileFormComponent, UserProfileService, UserSettingsStore, applyThemeToNativeElement, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildQuery, debouncedSignal, errorInterceptorFn, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, injectRouteNavigation, legacyFilterToFilter, processCssVars, queryNameResolver, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, toastInterceptorFn, withAggregationsFeatures, withAlertsFeatures, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withBootstrapApp, withExtractsFeatures, withFetch, withMultiSelectionFeatures, withPrincipalFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
17738
+ export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, AdvancedFiltersComponent, AdvancedSearch, AdvancedSearchComponent, AggregationComponent, AggregationDateComponent, AggregationDateRangeDialogComponent, AggregationItemDirective, AggregationListComponent, AggregationPanelComponent, AggregationTreeComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, ArticleEntities, ArticleExtracts, ArticleLabels, ArticleSimilarDocuments, AsideFiltersComponent, AuditFeedbackType, AuditService, AuthGuard, AuthPageComponent, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChangePasswordComponent, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, DRAWER_COMPONENT, DRAWER_STACK_MAX_COUNT, DateComponent, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, DrawerAdvancedFiltersComponent, DrawerComponent, DrawerNavbarComponent, DrawerPreviewComponent, DrawerService, DrawerStackComponent, DrawerStackService, DropdownInputComponent, DropdownListComponent, ErrorComponent, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FeatureFlagsDialogComponent, FeedbackDialogComponent, FileSizePipe, FilterButtonComponent, FiltersBarComponent, HIGHLIGHTS, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardNavigatorDirective, LabelService, LabelsEditDialog, LoadingComponent, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUserDialogComponent, PREVIEW_CONFIG, PagerComponent, PreviewNavigator, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearchDialog, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputFooter, SearchService, SelectArticleDirective, SelectArticleOnClickDirective, SelectionHistoryService, SelectionService, SelectionStore, ShowBookmarkDirective, SidebarNavComponent, SignInComponent, SignedOutComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserProfileDialog, UserProfileFormComponent, UserProfileService, UserSettingsStore, __resetSignInMutexForTests, applyThemeToNativeElement, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildQuery, debouncedSignal, errorInterceptorFn, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, injectRouteNavigation, legacyFilterToFilter, processCssVars, queryNameResolver, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, toastInterceptorFn, withAggregationsFeatures, withAlertsFeatures, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withBootstrapApp, withExtractsFeatures, withFetch, withMultiSelectionFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
17650
17739
  //# sourceMappingURL=sinequa-atomic-angular.mjs.map