Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rebase-cleanup: restore logout AND ITS TESTS #1478

Closed
wants to merge 41 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
45ffe2f
Release v10.1.0 (#1441)
zburke Mar 13, 2024
a4563a2
STCOR-769 Utilize the 'tenant' procured through the SSO login process…
usavkov-epam Mar 14, 2024
e58e2dd
leverage keycloak (authn) and kong (discovery) endpoints
zburke Dec 8, 2023
855ac3a
test cleanup
zburke Dec 13, 2023
7d74746
backwards compatibility with non-keycloak environments
zburke Dec 14, 2023
535d642
lint cleanup, console.log cleanup
zburke Dec 14, 2023
937e528
Add back button support to multi-tenant workflow (#1381)
ryandberger Dec 22, 2023
6f2a39a
STCOR-773 show legacy or application-based discovery info (#1385)
zburke Jan 4, 2024
c8ee9bb
Graceful handling when provides array is null in API response (#1388)
ryandberger Jan 10, 2024
27608f9
STCOR-790: check parsed client id, if undefined use clientId defined …
aidynoJ Jan 15, 2024
8d6cd1a
STCOR-795 optionally use users-keycloak endpoint for password reset (…
zburke Jan 22, 2024
3b9ee17
STCOR-794: Disable Continue button when no tenant selected (#1400)
ryandberger Jan 22, 2024
e2d8ac5
STCOR-796 replace x-okapi-token credentials with RTR and cookies (#1410)
zburke Jan 31, 2024
0c865c4
Add opt-in "Really logout?" stripes.config.js option (#1420)
ryandberger Feb 13, 2024
b6a1e8c
STCOR-798 Add Jest tests for SSO Landing - remove BTOG tests for the …
zburke Feb 14, 2024
7c92079
STCOR-811 parse /authn/token response for AT/RT expirations (#1417)
zburke Feb 14, 2024
4aa0dec
STCOR-812 include X-Okapi-Tenant header in /authn/logout requests (#1…
zburke Feb 14, 2024
0189b30
STCOR-813 correctly parse .../_self permissions (#1421)
zburke Feb 14, 2024
b5846a2
STCOR-770: Export getEventHandler to be able to create events in othe…
zburke Feb 14, 2024
99d5d9e
STCOR-810 cleanup deprecated entitlement params (#1418)
zburke Feb 16, 2024
15ccd09
[STCOR-803] Simplify logout workflow to bypass keycloak confirmation …
ryandberger Feb 16, 2024
d3c8959
Revert "STCOR-810 cleanup deprecated entitlement params (#1418)" (#1427)
zburke Feb 18, 2024
5c22d33
STCOR-810 CORRECTLY clean up deprecated entitlement params (#1429)
zburke Feb 19, 2024
848af4f
STCOR-816 only fetch /saml/check when login-saml is present (#1432)
zburke Feb 26, 2024
65eefa9
STCOR-776 show "Keep working?" prompt when session ages (#1431)
zburke Feb 27, 2024
3ad4921
Revert "STCOR-776 show "Keep working?" prompt when session ages (#143…
zburke Feb 29, 2024
79322fb
STCOR-821 Add `idName` and `limit` as passable props to `useChunkedCQ…
ryandberger Mar 6, 2024
5166a73
STCOR-789: Restore original URL on login (#1442)
aidynoJ Mar 18, 2024
39a8117
STCOR-820 For the /reset-password route, allow token to be specified …
ryandberger Mar 22, 2024
f292130
rebase cleanup: missed a few things along the way
zburke Mar 28, 2024
a8fe98a
STCOR-820 Use isEureka config value (#1450)
ryandberger Apr 5, 2024
1c5b150
STCOR-789-follow-up: Include /authn/token on the list of always-permi…
aidynoJ Apr 9, 2024
ff44653
STCOR-712 Refactor tagname selectors used in Auth-related forms. (#1449)
JohnC-80 Apr 3, 2024
c8200d1
STCOR-830 user-tenant-permissions hooks/functions (#1453)
zburke Apr 11, 2024
7d7d3bc
STCOR-769 Utilize the 'tenant' procured through the SSO login process…
usavkov-epam Mar 14, 2024
b9e21fc
STCOR-845 Redirect correctly after changing password (#1462)
ryandberger May 7, 2024
b8b423e
Merge branch 'keycloak-ramsons' of https://github.com/folio-org/strip…
ryandberger May 15, 2024
ff01ae9
Small fixes
ryandberger May 15, 2024
a2406bc
Merge branch 'keycloak-ramsons' of https://github.com/folio-org/strip…
ryandberger May 23, 2024
1faf77b
Revert "Merge branch 'keycloak-ramsons' of https://github.com/folio-o…
ryandberger May 23, 2024
0d745ad
rebase-cleanup: restore logout AND ITS TESTS
zburke May 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@

## 10.2.0 IN PROGRESS

* Utilize the `tenant` procured through the SSO login process. Refs STCOR-769.
* Remove tag-based selectors from Login, ResetPassword, Forgot UserName/Password form CSS. Refs STCOR-712.
* Provide `useUserTenantPermissions` hook. Refs STCOR-830.
* Load DayJS locale data as part of `loginServices`. STCOR-771.
* Turn on `<StrictMode>`; ignore it with `stripes.config.js` `disableStrictMode: true`. Refs STCOR-841.
* Make branding optional. Refs STCOR-847.
* Idle-session timeout and "Keep working?" modal. Refs STCOR-776.
* Utilize the `tenant` procured through the SSO login process. Refs STCOR-769.
* Use keycloak URLs in place of users-bl for tenant-switch. Refs US1153537.
* Provide `useUserTenantPermissions` hook. Refs STCOR-830.
* Fix 404 error page when logging in after changing password in Eureka. Refs STCOR-845.

## [10.1.1](https://github.com/folio-org/stripes-core/tree/v10.1.1) (2024-03-25)
[Full Changelog](https://github.com/folio-org/stripes-core/compare/v10.1.0...v10.1.1)

## [10.1.1](https://github.com/folio-org/stripes-core/tree/v10.1.1) (2024-03-25)
[Full Changelog](https://github.com/folio-org/stripes-core/compare/v10.1.0...v10.1.1)

* Utilize the `tenant` procured through the SSO login process. Refs STCOR-769.
* Remove tag-based selectors from Login, ResetPassword, Forgot UserName/Password form CSS. Refs STCOR-712.
* Provide `useUserTenantPermissions` hook. Refs STCOR-830.
* Load DayJS locale data as part of `loginServices`. STCOR-771.
* Turn on `<StrictMode>`; ignore it with `stripes.config.js` `disableStrictMode: true`. Refs STCOR-841.
* Use keycloak URLs in place of users-bl for tenant-switch. Refs US1153537.
* Make branding optional. Refs STCOR-847.
* Idle-session timeout and "Keep working?" modal. Refs STCOR-776.

## [10.1.0](https://github.com/folio-org/stripes-core/tree/v10.1.0) (2024-03-12)
[Full Changelog](https://github.com/folio-org/stripes-core/compare/v10.0.0...v10.1.0)
Expand Down
8 changes: 6 additions & 2 deletions src/RootWithIntl.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
Settings,
HandlerManager,
TitleManager,
Login,
Logout,
LogoutTimeout,
OverlayContainer,
Expand All @@ -40,7 +41,6 @@ import {
import StaleBundleWarning from './components/StaleBundleWarning';
import { StripesContext } from './StripesContext';
import { CalloutContext } from './CalloutContext';
import AuthnLogin from './components/AuthnLogin';

const RootWithIntl = ({ stripes, token = '', isAuthenticated = false, disableAuth, history = {} }) => {
const connect = connectFor('@folio/core', stripes.epics, stripes.logger);
Expand Down Expand Up @@ -163,7 +163,11 @@ const RootWithIntl = ({ stripes, token = '', isAuthenticated = false, disableAut
/>
<TitledRoute
name="login"
component={<AuthnLogin stripes={connectedStripes} />}
component={
<Login
autoLogin={connectedStripes.config.autoLogin}
stripes={connectedStripes}
/>}
/>
</Switch>
}
Expand Down
20 changes: 10 additions & 10 deletions src/RootWithIntl.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import { Login } from './components';
import PreLoginLanding from './components/PreLoginLanding';

// import {
// renderLogoutComponent
// } from './RootWithIntl';
import {
renderLogoutComponent

Check failure on line 12 in src/RootWithIntl.test.js

View workflow job for this annotation

GitHub Actions / build-npm

renderLogoutComponent not found in './RootWithIntl'

Check failure on line 12 in src/RootWithIntl.test.js

View workflow job for this annotation

GitHub Actions / build-npm

renderLogoutComponent not found in './RootWithIntl'
} from './RootWithIntl';

import AuthnLogin from './components/AuthnLogin';

Expand Down Expand Up @@ -54,12 +54,12 @@
});
});

// describe('renderLogoutComponent', () => {
// it('handles legacy logout', () => {
// const stripes = { okapi: {}, config: {} };
// render(renderLogoutComponent(stripes));
describe('renderLogoutComponent', () => {
it('handles legacy logout', () => {
const stripes = { okapi: {}, config: {} };
render(renderLogoutComponent(stripes));

// expect(screen.getByText(/<internalredirect>/)).toBeInTheDocument();
// });
// });
expect(screen.getByText(/<internalredirect>/)).toBeInTheDocument();
});
});
});
4 changes: 2 additions & 2 deletions src/components/LogoutTimeout/LogoutTimeout.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ const LogoutTimeout = () => {
</Row>
<Row center="xs">
<Col xs={12}>
<Headline size="large"><FormattedMessage id="stripes-core.rtr.idleSession.sessionExpiredSoSad" /></Headline>
<Headline size="large"><FormattedMessage id="rtr.idleSession.sessionExpiredSoSad" /></Headline>
</Col>
</Row>
<Row center="xs">
<Col xs={12}>
<Button to="/"><FormattedMessage id="stripes-core.rtr.idleSession.logInAgain" /></Button>
<Button to="/"><FormattedMessage id="rtr.idleSession.logInAgain" /></Button>
</Col>
</Row>
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/components/LogoutTimeout/LogoutTimeout.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ describe('LogoutTimeout', () => {
mockUseStripes.mockReturnValue({ okapi: { isAuthenticated: false } });

render(<LogoutTimeout />);
screen.getByText('stripes-core.rtr.idleSession.sessionExpiredSoSad');
screen.getByText('rtr.idleSession.sessionExpiredSoSad');
});

it('if authenticated, renders a redirect', async () => {
Expand Down
8 changes: 8 additions & 0 deletions src/components/MainNav/MainNav.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,14 @@ class MainNav extends Component {
});
}

// Return the user to the login screen, but after logging in they will return to their previous activity.
returnToLogin() {
const { okapi } = this.store.getState();

return getLocale(okapi.url, this.store, okapi.tenant)
.then(sessionLogout(okapi.url, this.store));
}

// return the user to the login screen, but after logging in they will be brought to the default screen.
logout() {
const { okapi } = this.store.getState();
Expand Down
1 change: 1 addition & 0 deletions src/components/Root/FXHR.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { rtr } from './token-util';
import { getTokenExpiry } from '../../loginServices';
import { RTRError } from './Errors';

Check warning on line 3 in src/components/Root/FXHR.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'RTRError' is defined but never used. Allowed unused vars must match /React/u

Check warning on line 3 in src/components/Root/FXHR.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'RTRError' is defined but never used. Allowed unused vars must match /React/u
import FXHR from './FXHR';

jest.mock('./token-util', () => ({
Expand Down
2 changes: 1 addition & 1 deletion src/components/Root/Root.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import createApolloClient from '../../createApolloClient';
import createReactQueryClient from '../../createReactQueryClient';
import { setSinglePlugin, setBindings, setIsAuthenticated, setOkapiToken, setTimezone, setCurrency, updateCurrentUser } from '../../okapiActions';
import { loadTranslations, checkOkapiSession } from '../../loginServices';
import { loadTranslations, checkOkapiSession, addRtrEventListeners } from '../../loginServices';

Check warning on line 24 in src/components/Root/Root.js

View workflow job for this annotation

GitHub Actions / build-npm

'addRtrEventListeners' is defined but never used. Allowed unused vars must match /React/u

Check warning on line 24 in src/components/Root/Root.js

View workflow job for this annotation

GitHub Actions / build-npm

'addRtrEventListeners' is defined but never used. Allowed unused vars must match /React/u
import { getQueryResourceKey, getCurrentModule } from '../../locationService';
import Stripes from '../../Stripes';
import RootWithIntl from '../../RootWithIntl';
Expand Down
1 change: 0 additions & 1 deletion src/components/Root/token-util.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ export const resourceMapper = (resource, fx) => {
export const isAuthenticationRequest = (resource, oUrl) => {
const isPermissibleResource = (string) => {
const permissible = [
'/authn/token',
'/bl-users/login-with-expiry',
'/bl-users/_self',
];
Expand Down
1 change: 1 addition & 0 deletions src/components/Root/token-util.test.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { waitFor } from '@folio/jest-config-stripes/testing-library/react';

Check warning on line 1 in src/components/Root/token-util.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'waitFor' is defined but never used. Allowed unused vars must match /React/u

Check warning on line 1 in src/components/Root/token-util.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'waitFor' is defined but never used. Allowed unused vars must match /React/u
import { RTRError, UnexpectedResourceError } from './Errors';
import {
configureRtr,
Expand Down
3 changes: 0 additions & 3 deletions src/discoverServices.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,21 +114,18 @@
return Promise.all(list);
}

// eslint-disable-next-line no-console
console.error(`>>> NO APPLICATIONS AVAILABLE FOR ${okapi.tenant}`, json);

Check warning on line 117 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement

Check warning on line 117 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement
store.dispatch({ type: 'DISCOVERY_FAILURE', code: response.status });
throw response;
});
} else {
// eslint-disable-next-line no-console
console.error(`>>> COULD NOT RETRIEVE APPLICATIONS FOR ${okapi.tenant}`, response);

Check warning on line 122 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement

Check warning on line 122 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement
store.dispatch({ type: 'DISCOVERY_FAILURE', code: response.status });
throw response;
}
})
.catch(reason => {
// eslint-disable-next-line no-console
console.error(`@@ COULD NOT RETRIEVE APPLICATIONS FOR ${okapi.tenant}`, reason);

Check warning on line 128 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement

Check warning on line 128 in src/discoverServices.js

View workflow job for this annotation

GitHub Actions / build-npm

Unexpected console statement
store.dispatch({ type: 'DISCOVERY_FAILURE', message: reason });
});
}
Expand Down
58 changes: 40 additions & 18 deletions src/loginServices.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,18 +111,6 @@
return localforage.setItem(SESSION_NAME, val);
};

/**
* removeUnauthorizedPathFromSession, setUnauthorizedPathToSession, getUnauthorizedPathFromSession
* remove/set/get unauthorized_path to/from session storage.
* Used to restore path on returning from login if user accessed a bookmarked
* URL while unauthenticated and was redirected to login.
*
* @see components/OIDCRedirect
*/
const UNAUTHORIZED_PATH = 'unauthorized_path';
export const removeUnauthorizedPathFromSession = () => sessionStorage.removeItem(UNAUTHORIZED_PATH);
export const setUnauthorizedPathToSession = (pathname) => sessionStorage.setItem(UNAUTHORIZED_PATH, pathname);
export const getUnauthorizedPathFromSession = () => sessionStorage.getItem(UNAUTHORIZED_PATH);

// export config values for storing user locale
export const userLocaleConfig = {
Expand Down Expand Up @@ -478,12 +466,10 @@
fetch(`${okapiUrl}/authn/logout`, {
method: 'POST',
mode: 'cors',
credentials: 'include',
headers: getHeaders(store.getState()?.okapi?.tenant),
credentials: 'include'
})
:
Promise.resolve();

return logoutPromise
// clear private-storage
.then(() => {
Expand Down Expand Up @@ -537,6 +523,8 @@
* @returns {Promise}
*/
export function createOkapiSession(store, tenant, token, data) {
// @@ new StripesSession(store, data);

// clear any auth-n errors
store.dispatch(setAuthError(null));

Expand All @@ -552,7 +540,7 @@
// which doesn't provide it, then set an invalid AT value and a near-future (+10 minutes) RT value.
// the invalid AT will prompt an RTR cycle which will either give us new AT/RT values
// (if the RT was valid) or throw an RTR_ERROR (if the RT was not valid).
const tokenExpiration = {

Check warning on line 543 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'tokenExpiration' is assigned a value but never used. Allowed unused vars must match /React/u

Check warning on line 543 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'tokenExpiration' is assigned a value but never used. Allowed unused vars must match /React/u
atExpires: data.tokenExpiration?.accessTokenExpiration ? new Date(data.tokenExpiration.accessTokenExpiration).getTime() : -1,
rtExpires: data.tokenExpiration?.refreshTokenExpiration ? new Date(data.tokenExpiration.refreshTokenExpiration).getTime() : Date.now() + (10 * 60 * 1000),
};
Expand All @@ -564,7 +552,6 @@
user,
perms,
tenant: sessionTenant,
tokenExpiration,
};

// localStorage events emit across tabs so we can use it like a
Expand Down Expand Up @@ -609,6 +596,41 @@
});
}

/**
* handleRtrError
* Clear out the redux store and logout.
*
* @param {*} event
* @param {*} store
* @returns void
*/
export const handleRtrError = (event, store) => {
logger.log('rtr', 'rtr error; logging out', event.detail);

Check failure on line 608 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'logger' is not defined

Check failure on line 608 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'logger' is not defined
store.dispatch(setIsAuthenticated(false));
store.dispatch(clearCurrentUser());
store.dispatch(resetStore());
localforage.removeItem(SESSION_NAME)
.then(localforage.removeItem('loginResponse'));
};

/**
* addRtrEventListeners
* RTR_ERROR_EVENT: RTR error, logout
* RTR_ROTATION_EVENT: configure a timer for auto-logout
*
* @param {*} okapiConfig
* @param {*} store
*/
export function addRtrEventListeners(okapiConfig, store) {
document.addEventListener(RTR_ERROR_EVENT, (e) => {

Check failure on line 625 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'RTR_ERROR_EVENT' is not defined

Check failure on line 625 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'RTR_ERROR_EVENT' is not defined
handleRtrError(e, store);
});

// document.addEventListener(RTR_ROTATION_EVENT, (e) => {
// handleRtrRotation(e, store);
// });
}

/**
* getSSOEnabled
* return a promise that fetches from /saml/check and dispatches checkSSO.
Expand Down Expand Up @@ -952,9 +974,9 @@
*
* @returns {Promise}
*/
export async function updateTenant(okapiConfig, tenant) {
export async function updateTenant(okapi, tenant) {

Check failure on line 977 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'okapi' is already declared in the upper scope on line 2 column 18

Check failure on line 977 in src/loginServices.js

View workflow job for this annotation

GitHub Actions / build-npm

'okapi' is already declared in the upper scope on line 2 column 18
const okapiSess = await getOkapiSession();
const userWithPermsResponse = await fetchUserWithPerms(okapiConfig.url, tenant, okapiConfig.token);
const userWithPermsResponse = await fetchUserWithPerms(okapi.url, tenant, okapi.token);
const userWithPerms = await userWithPermsResponse.json();
await localforage.setItem(SESSION_NAME, { ...okapiSess, tenant, ...spreadUserWithPerms(userWithPerms) });
}
3 changes: 3 additions & 0 deletions src/loginServices.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import localforage from 'localforage';
import { config } from 'stripes-config';

Check warning on line 2 in src/loginServices.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'config' is defined but never used. Allowed unused vars must match /React/u

Check warning on line 2 in src/loginServices.test.js

View workflow job for this annotation

GitHub Actions / build-npm

'config' is defined but never used. Allowed unused vars must match /React/u

import {
createOkapiSession,
Expand Down Expand Up @@ -475,6 +476,7 @@
global.fetch = jest.fn().mockImplementation(() => Promise.resolve());
const store = {
dispatch: jest.fn(),
getState: jest.fn(),
};
window.sessionStorage.clear();

Expand All @@ -496,6 +498,7 @@
localStorage.setItem(SESSION_NAME, 'true');
const store = {
dispatch: jest.fn(),
getState: jest.fn(),
};
window.sessionStorage.clear();

Expand Down
2 changes: 1 addition & 1 deletion src/okapiReducer.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
rtrModalIsVisible: true,
rtrTimeout: 123,
};
const ct = jest.spyOn(window, 'clearTimeout');
const ct = jest.spyOn(window, 'clearTimeout')

Check failure on line 16 in src/okapiReducer.test.js

View workflow job for this annotation

GitHub Actions / build-npm

Missing semicolon

Check failure on line 16 in src/okapiReducer.test.js

View workflow job for this annotation

GitHub Actions / build-npm

Missing semicolon
const o = okapiReducer(state, { type: 'SET_IS_AUTHENTICATED', isAuthenticated: false });
expect(o.isAuthenticated).toBe(false);
expect(o.rtrModalIsVisible).toBe(false);
Expand Down
34 changes: 22 additions & 12 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1581,10 +1581,11 @@
webpack-bundle-analyzer "^4.4.2"
yargs "^17.3.1"

"@folio/stripes-components@^12.2.0":
version "12.2.1000004329"
resolved "https://repository.folio.org/repository/npm-folioci/@folio/stripes-components/-/stripes-components-12.2.1000004329.tgz#87b8c3c508b055ccaa92613b8cca46531973eaf2"
integrity sha512-EZh2OJ99xCzIy1nmZebkF+ezr5rdWrx0MVTh7F5HFoZ3zDhvH4cf8abukghMXDbQFXf91Ybaei7WIblGf3/65A==
"@folio/stripes-components@^12.0.0":
version "12.2.1000004277"
resolved "https://repository.folio.org/repository/npm-folioci/@folio/stripes-components/-/stripes-components-12.2.1000004277.tgz#c49e1bc61b9e629705ce5d562c33800879d9f156"
integrity sha512-3Y724MLT+dsmHg8EBdaSXzRH+SOzE/z2g46GK4k0QTHOZsp3QkehmsV5KwmnRbTpENe/e4X9HLaZiout5fzPVg==

dependencies:
"@csstools/postcss-global-data" "^2.1.1"
"@folio/stripes-react-hotkeys" "^3.0.5"
Expand Down Expand Up @@ -6943,13 +6944,6 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==

inactivity-timer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/inactivity-timer/-/inactivity-timer-1.0.0.tgz#054bf48274efea5c82713cb051b945fb42ec59bb"
integrity sha512-kxWME4cNy0TKfy9wwJ2L3oCV1JDFQTPGtYdw3Zvpiv5GbZwfnCwfESJgM1MQaYcrzLYOziiU3YEAgWOafL7Kdw==
dependencies:
ms "^2.1.1"

indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
Expand Down Expand Up @@ -8893,7 +8887,7 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==

ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
ms@2.1.3, ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
Expand Down Expand Up @@ -9564,6 +9558,22 @@ possible-typed-array-names@^1.0.0:
resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==

postcss-calc@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6"
integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==
dependencies:
postcss-selector-parser "^6.0.11"
postcss-value-parser "^4.2.0"

postcss-color-function@folio-org/postcss-color-function:
version "4.1.0"
resolved "https://codeload.github.com/folio-org/postcss-color-function/tar.gz/c128aad740ae740fb571c4b6493f467dd51efe85"
dependencies:
css-color-function "~1.3.3"
postcss-message-helpers "^2.0.0"
postcss-value-parser "^4.1.0"

postcss-custom-media@^9.0.1:
version "9.1.5"
resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-9.1.5.tgz#20c5822dd15155d768f8dd84e07a6ffd5d01b054"
Expand Down
Loading