0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2024-12-16 20:26:19 -05:00

refactor: remove AppInsights for React (#5742)

This commit is contained in:
Gao Sun 2024-04-18 15:20:24 +08:00 committed by GitHub
parent fec3c0d7ee
commit c1c746bca4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 88 additions and 955 deletions

View file

@ -0,0 +1,5 @@
---
"@logto/app-insights": major
---
remove application insights for react

View file

@ -12,10 +12,6 @@
"./*": {
"import": "./lib/*.js",
"types": "./lib/*.d.ts"
},
"./react": {
"import": "./lib/react/index.js",
"types": "./lib/react/index.d.ts"
}
},
"publishConfig": {
@ -34,17 +30,12 @@
},
"devDependencies": {
"@silverhand/eslint-config": "5.0.0",
"@silverhand/eslint-config-react": "5.0.0",
"@silverhand/ts-config": "5.0.0",
"@silverhand/ts-config-react": "5.0.0",
"@types/node": "^20.9.5",
"@types/react": "^18.0.31",
"@vitest/coverage-v8": "^1.4.0",
"eslint": "^8.44.0",
"history": "^5.3.0",
"lint-staged": "^15.0.0",
"prettier": "^3.0.0",
"react": "^18.0.0",
"typescript": "^5.3.3",
"vitest": "^1.4.0"
},
@ -52,28 +43,17 @@
"node": "^20.9.0"
},
"eslintConfig": {
"extends": "@silverhand/react"
"extends": "@silverhand"
},
"prettier": "@silverhand/eslint-config/.prettierrc",
"dependencies": {
"@microsoft/applicationinsights-clickanalytics-js": "^3.1.2",
"@microsoft/applicationinsights-react-js": "^17.1.2",
"@microsoft/applicationinsights-web": "^3.1.2",
"@silverhand/essentials": "^2.9.0",
"applicationinsights": "^2.9.5"
},
"peerDependencies": {
"history": "^5.3.0",
"react": "^18.0.0",
"tslib": "^2.4.1"
},
"peerDependenciesMeta": {
"history": {
"optional": true
},
"react": {
"optional": true
},
"tslib": {
"optional": true
}

View file

@ -1,48 +0,0 @@
import { type ReactNode, useContext, useEffect } from 'react';
import { AppInsightsContext, AppInsightsProvider } from './context.js';
import { getPrimaryDomain } from './utils.js';
type AppInsightsProps = {
cloudRole: string;
};
const AppInsights = ({ cloudRole }: AppInsightsProps) => {
const { needsSetup, setup } = useContext(AppInsightsContext);
useEffect(() => {
const run = async () => {
await setup(cloudRole, { cookieDomain: getPrimaryDomain() });
};
if (needsSetup) {
void run();
}
}, [cloudRole, needsSetup, setup]);
return null;
};
type Props = AppInsightsProps & {
children: ReactNode;
};
/**
* **CAUTION:** Make sure to put this component inside `<LogtoProvider />` or any other
* context providers that are render-sensitive, since we are lazy loading ApplicationInsights SDKs
* for better user experience.
*
* This component will trigger a render after the ApplicationInsights SDK is loaded which may
* cause issues for some context providers. For example, `useHandleSignInCallback` will be
* called twice if you use this component to wrap a `<LogtoProvider />`.
*/
const AppInsightsBoundary = ({ children, ...rest }: Props) => {
return (
<AppInsightsProvider>
<AppInsights {...rest} />
{children}
</AppInsightsProvider>
);
};
export default AppInsightsBoundary;

View file

@ -1,137 +0,0 @@
import { type ClickAnalyticsPlugin } from '@microsoft/applicationinsights-clickanalytics-js';
import type { ReactPlugin, withAITracking } from '@microsoft/applicationinsights-react-js';
import type { ApplicationInsights, ITelemetryPlugin } from '@microsoft/applicationinsights-web';
import { conditional, conditionalArray, type Optional } from '@silverhand/essentials';
import { type ComponentType } from 'react';
export type SetupConfig = {
connectionString?: string;
/**
* The config object for the ClickAnalytics plugin. If this is provided, the plugin will be
* automatically loaded when calling `.setup()`.
*
* Wait for {@link https://github.com/microsoft/ApplicationInsights-JS/issues/2106 | microsoft/ApplicationInsights-JS#2106}
* to be resolved to use a stronger type.
*
* @see {@link https://github.com/microsoft/ApplicationInsights-JS/tree/master/extensions/applicationinsights-clickanalytics-js#configuration | ClickAnalytics configuration}
*/
clickPlugin?: Record<string, unknown>;
cookieDomain?: string;
};
export class AppInsightsReact {
/**
* URL search parameters that start with `utm_`. It is an empty object until you call `.setup()`,
* which will read the URL search string and store parameters in this property.
*/
utmParameters: Record<string, string> = {};
protected reactPlugin?: ReactPlugin;
protected clickAnalyticsPlugin?: ClickAnalyticsPlugin;
protected withAITracking?: typeof withAITracking;
protected appInsights?: ApplicationInsights;
get instance(): Optional<ApplicationInsights> {
return this.appInsights;
}
get trackPageView(): Optional<ApplicationInsights['trackPageView']> {
return this.appInsights?.trackPageView.bind(this.appInsights);
}
async setup(cloudRole: string, config?: string | SetupConfig): Promise<boolean> {
const connectionStringFromConfig =
typeof config === 'string' ? config : config?.connectionString;
// The string needs to be normalized since it may contain '"'
const connectionString = (
connectionStringFromConfig ?? process.env.APPLICATIONINSIGHTS_CONNECTION_STRING
)?.replace(/^"?(.*)"?$/g, '$1');
if (!connectionString) {
return false;
}
if (this.appInsights?.config.connectionString === connectionString) {
return true;
}
try {
// Lazy load ApplicationInsights modules
const { ReactPlugin, withAITracking } = await import(
'@microsoft/applicationinsights-react-js'
);
const { ApplicationInsights } = await import('@microsoft/applicationinsights-web');
// Conditionally load ClickAnalytics plugin
const configObject = conditional(typeof config === 'object' && config) ?? {};
const { cookieDomain, clickPlugin } = configObject;
const initClickAnalyticsPlugin = async () => {
const { ClickAnalyticsPlugin } = await import(
'@microsoft/applicationinsights-clickanalytics-js'
);
return new ClickAnalyticsPlugin();
};
// Assign React props
// https://github.com/microsoft/applicationinsights-react-js#readme
this.withAITracking = withAITracking;
this.reactPlugin = new ReactPlugin();
// Assign ClickAnalytics prop
this.clickAnalyticsPlugin = conditional(clickPlugin && (await initClickAnalyticsPlugin()));
// Init ApplicationInsights instance
this.appInsights = new ApplicationInsights({
config: {
cookieDomain,
connectionString,
enableAutoRouteTracking: false,
extensions: conditionalArray<ITelemetryPlugin>(
this.reactPlugin,
this.clickAnalyticsPlugin
),
extensionConfig: conditional(
this.clickAnalyticsPlugin && {
[this.clickAnalyticsPlugin.identifier]: clickPlugin,
}
),
},
});
// Extract UTM parameters
const searchParams = [...new URLSearchParams(window.location.search).entries()];
this.utmParameters = Object.fromEntries(
searchParams.filter(([key]) => key.startsWith('utm_'))
);
this.appInsights.addTelemetryInitializer((item) => {
// @see https://github.com/microsoft/ApplicationInsights-JS#example-setting-cloud-role-name
// @see https://github.com/microsoft/ApplicationInsights-node.js/blob/a573e40fc66981c6a3106bdc5b783d1d94f64231/Schema/PublicSchema/ContextTagKeys.bond#L83
/* eslint-disable @silverhand/fp/no-mutation */
item.tags = { ...item.tags, 'ai.cloud.role': cloudRole };
/* eslint-enable @silverhand/fp/no-mutation */
});
this.appInsights.loadAppInsights();
} catch (error: unknown) {
console.error('Unable to init ApplicationInsights:');
console.error(error);
return false;
}
return true;
}
withAppInsights<P>(Component: ComponentType<P>): ComponentType<P> {
if (!this.reactPlugin || !this.withAITracking) {
return Component;
}
return this.withAITracking(this.reactPlugin, Component, undefined, 'appInsightsWrapper');
}
}
export const appInsightsReact = new AppInsightsReact();
export const withAppInsights = appInsightsReact.withAppInsights.bind(appInsightsReact);

View file

@ -1,47 +0,0 @@
import { type ICustomProperties } from '@microsoft/applicationinsights-web';
import { yes } from '@silverhand/essentials';
import { useContext, useEffect } from 'react';
import { getEventName, type Component, type EventType } from '../custom-event.js';
import { AppInsightsContext } from './context.js';
type Props<C extends Component> = {
component: C;
event: EventType<C>;
customProperties?: ICustomProperties;
};
const storageKeyPrefix = 'logto:insights:';
/** Track an event after AppInsights SDK is setup, but only once during the current session. */
const TrackOnce = <C extends Component>({ component, event, customProperties }: Props<C>) => {
const { isSetupFinished, appInsights } = useContext(AppInsightsContext);
useEffect(() => {
const eventName = getEventName(component, event);
const storageKey = `${storageKeyPrefix}${eventName}`;
const tracked = yes(sessionStorage.getItem(storageKey));
if (isSetupFinished && !tracked) {
appInsights.instance?.trackEvent(
{
name: getEventName(component, event),
},
{ ...appInsights.utmParameters, ...customProperties }
);
sessionStorage.setItem(storageKey, '1');
}
}, [
appInsights.instance,
appInsights.utmParameters,
component,
customProperties,
event,
isSetupFinished,
]);
return null;
};
export default TrackOnce;

View file

@ -1,61 +0,0 @@
import { type ReactNode, createContext, useMemo, useState, useCallback } from 'react';
import { type AppInsightsReact, appInsightsReact as appInsights } from './AppInsightsReact';
const notImplemented = () => {
throw new Error('Not implemented');
};
type Context = {
needsSetup: boolean;
isSetupFinished: boolean;
setup: (...args: Parameters<typeof appInsights.setup>) => Promise<void>;
appInsights: AppInsightsReact;
};
export const AppInsightsContext = createContext<Context>({
needsSetup: true,
isSetupFinished: false,
setup: notImplemented,
appInsights,
});
type Properties = {
children: ReactNode;
};
export type SetupStatus = 'none' | 'loading' | 'initialized' | 'failed';
export const AppInsightsProvider = ({ children }: Properties) => {
const [setupStatus, setSetupStatus] = useState<SetupStatus>('none');
const setup = useCallback(
async (...args: Parameters<typeof appInsights.setup>) => {
if (setupStatus !== 'none') {
return;
}
setSetupStatus('loading');
const result = await appInsights.setup(...args);
if (result) {
console.debug('Initialized ApplicationInsights');
setSetupStatus('initialized');
} else {
setSetupStatus('failed');
}
},
[setupStatus]
);
const context = useMemo<Context>(
() => ({
needsSetup: setupStatus === 'none',
isSetupFinished: setupStatus === 'initialized' || setupStatus === 'failed',
setup,
appInsights,
}),
[setup, setupStatus]
);
return <AppInsightsContext.Provider value={context}>{children}</AppInsightsContext.Provider>;
};

View file

@ -1,5 +0,0 @@
export { AppInsightsReact, type SetupConfig, withAppInsights } from './AppInsightsReact.js';
export * from './context.js';
export * from './utils.js';
export { default as AppInsightsBoundary } from './AppInsightsBoundary.js';
export { default as TrackOnce } from './TrackOnce.js';

View file

@ -1,5 +0,0 @@
/**
* **CAUTION:** This function takes the last two parts of the hostname which may cause issues for
* some second-level domains, e.g. `.co.uk`.
*/
export const getPrimaryDomain = () => window.location.hostname.split('.').slice(-2).join('.');

View file

@ -1,5 +1,5 @@
{
"extends": "@silverhand/ts-config-react/tsconfig.base",
"extends": "@silverhand/ts-config/tsconfig.base",
"compilerOptions": {
"outDir": "lib",
"types": ["node"],

View file

@ -26,7 +26,6 @@ const config: Config.InitialOptions = {
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@logto/app-insights/(.*)$': '<rootDir>/../app-insights/lib/$1',
'^@logto/shared/(.*)$': '<rootDir>/../shared/lib/$1',
'\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
},

View file

@ -21,7 +21,6 @@
},
"devDependencies": {
"@jest/types": "^29.5.0",
"@logto/app-insights": "workspace:^1.4.0",
"@logto/connector-kit": "workspace:^3.0.0",
"@logto/core-kit": "workspace:^2.4.0",
"@logto/language-kit": "workspace:^1.1.0",

View file

@ -1,4 +1,3 @@
import { AppInsightsBoundary } from '@logto/app-insights/react';
import { MfaFactor, experience } from '@logto/schemas';
import { Route, Routes, BrowserRouter } from 'react-router-dom';
@ -48,85 +47,83 @@ const App = () => {
<SettingsProvider>
<SingleSignOnContextProvider>
<AppBoundary>
<AppInsightsBoundary cloudRole="ui">
<Routes>
<Route element={<LoadingLayerProvider />}>
<Route path="springboard" element={<Springboard />} />
<Route path="callback/:connectorId" element={<Callback />} />
<Routes>
<Route element={<LoadingLayerProvider />}>
<Route path="springboard" element={<Springboard />} />
<Route path="callback/:connectorId" element={<Callback />} />
<Route
path="callback/social/:connectorId"
element={<SocialSignInWebCallback />}
/>
<Route path="direct/:method/:target?" element={<DirectSignIn />} />
<Route element={<AppLayout />}>
<Route
path="callback/social/:connectorId"
element={<SocialSignInWebCallback />}
path="unknown-session"
element={<ErrorPage message="error.invalid_session" />}
/>
<Route path="direct/:method/:target?" element={<DirectSignIn />} />
<Route element={<AppLayout />}>
<Route
path="unknown-session"
element={<ErrorPage message="error.invalid_session" />}
/>
{/* Sign-in */}
<Route path={experience.routes.signIn}>
<Route index element={<SignIn />} />
<Route path="password" element={<SignInPassword />} />
</Route>
{/* Register */}
<Route path={experience.routes.register}>
<Route index element={<Register />} />
<Route path="password" element={<RegisterPassword />} />
</Route>
{/* Forgot password */}
<Route path="forgot-password">
<Route index element={<ForgotPassword />} />
<Route path="reset" element={<ResetPassword />} />
</Route>
{/* Passwordless verification code */}
<Route path=":flow/verification-code" element={<VerificationCode />} />
{/* Mfa binding */}
<Route path={UserMfaFlow.MfaBinding}>
<Route index element={<MfaBinding />} />
<Route path={MfaFactor.TOTP} element={<TotpBinding />} />
<Route path={MfaFactor.WebAuthn} element={<WebAuthnBinding />} />
<Route path={MfaFactor.BackupCode} element={<BackupCodeBinding />} />
</Route>
{/* Mfa verification */}
<Route path={UserMfaFlow.MfaVerification}>
<Route index element={<MfaVerification />} />
<Route path={MfaFactor.TOTP} element={<TotpVerification />} />
<Route path={MfaFactor.WebAuthn} element={<WebAuthnVerification />} />
<Route path={MfaFactor.BackupCode} element={<BackupCodeVerification />} />
</Route>
{/* Continue set up missing profile */}
<Route path="continue">
<Route path=":method" element={<Continue />} />
</Route>
{/* Social sign-in pages */}
<Route path="social">
<Route path="link/:connectorId" element={<SocialLinkAccount />} />
<Route path="landing/:connectorId" element={<SocialLanding />} />
</Route>
{/* Single sign-on */}
<Route path={experience.routes.sso} element={<LoadingLayerProvider />}>
<Route path="email" element={<SingleSignOnEmail />} />
<Route path="connectors" element={<SingleSignOnConnectors />} />
</Route>
{/* Consent */}
<Route path="consent" element={<Consent />} />
<Route path="*" element={<ErrorPage />} />
{/* Sign-in */}
<Route path={experience.routes.signIn}>
<Route index element={<SignIn />} />
<Route path="password" element={<SignInPassword />} />
</Route>
{/* Register */}
<Route path={experience.routes.register}>
<Route index element={<Register />} />
<Route path="password" element={<RegisterPassword />} />
</Route>
{/* Forgot password */}
<Route path="forgot-password">
<Route index element={<ForgotPassword />} />
<Route path="reset" element={<ResetPassword />} />
</Route>
{/* Passwordless verification code */}
<Route path=":flow/verification-code" element={<VerificationCode />} />
{/* Mfa binding */}
<Route path={UserMfaFlow.MfaBinding}>
<Route index element={<MfaBinding />} />
<Route path={MfaFactor.TOTP} element={<TotpBinding />} />
<Route path={MfaFactor.WebAuthn} element={<WebAuthnBinding />} />
<Route path={MfaFactor.BackupCode} element={<BackupCodeBinding />} />
</Route>
{/* Mfa verification */}
<Route path={UserMfaFlow.MfaVerification}>
<Route index element={<MfaVerification />} />
<Route path={MfaFactor.TOTP} element={<TotpVerification />} />
<Route path={MfaFactor.WebAuthn} element={<WebAuthnVerification />} />
<Route path={MfaFactor.BackupCode} element={<BackupCodeVerification />} />
</Route>
{/* Continue set up missing profile */}
<Route path="continue">
<Route path=":method" element={<Continue />} />
</Route>
{/* Social sign-in pages */}
<Route path="social">
<Route path="link/:connectorId" element={<SocialLinkAccount />} />
<Route path="landing/:connectorId" element={<SocialLanding />} />
</Route>
{/* Single sign-on */}
<Route path={experience.routes.sso} element={<LoadingLayerProvider />}>
<Route path="email" element={<SingleSignOnEmail />} />
<Route path="connectors" element={<SingleSignOnConnectors />} />
</Route>
{/* Consent */}
<Route path="consent" element={<Consent />} />
<Route path="*" element={<ErrorPage />} />
</Route>
</Routes>
</AppInsightsBoundary>
</Route>
</Routes>
</AppBoundary>
</SingleSignOnContextProvider>
</SettingsProvider>

View file

@ -1,34 +1,16 @@
import { AppInsightsContext } from '@logto/app-insights/react';
import { type TFuncKey } from 'i18next';
import { useContext, useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';
import { useTranslation } from 'react-i18next';
import { shouldTrack } from '@/utils/cookies';
type Props = {
titleKey: TFuncKey;
titleKeyInterpolation?: Record<string, unknown>;
// eslint-disable-next-line react/boolean-prop-naming
trackPageView?: boolean;
};
const PageMeta = ({ titleKey, titleKeyInterpolation = {}, trackPageView = true }: Props) => {
const PageMeta = ({ titleKey, titleKeyInterpolation = {} }: Props) => {
const { t } = useTranslation();
const { isSetupFinished, appInsights } = useContext(AppInsightsContext);
const [pageViewTracked, setPageViewTracked] = useState(false);
const rawTitle = t(titleKey, { lng: 'en', ...titleKeyInterpolation });
const title = t(titleKey, titleKeyInterpolation);
useEffect(() => {
// Only track once for the same page
if (shouldTrack && isSetupFinished && trackPageView && !pageViewTracked) {
appInsights.trackPageView?.({ name: `Main flow: ${String(rawTitle)}` });
setPageViewTracked(true);
}
}, [appInsights, isSetupFinished, pageViewTracked, rawTitle, trackPageView]);
return <Helmet title={String(title)} />;
};

View file

@ -39,15 +39,6 @@ importers:
packages/app-insights:
dependencies:
'@microsoft/applicationinsights-clickanalytics-js':
specifier: ^3.1.2
version: 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-react-js':
specifier: ^17.1.2
version: 17.1.2(history@5.3.0)(react@18.2.0)(tslib@2.4.1)
'@microsoft/applicationinsights-web':
specifier: ^3.1.2
version: 3.1.2(tslib@2.4.1)
'@silverhand/essentials':
specifier: ^2.9.0
version: 2.9.0
@ -61,39 +52,24 @@ importers:
'@silverhand/eslint-config':
specifier: 5.0.0
version: 5.0.0(eslint@8.44.0)(prettier@3.0.0)(typescript@5.3.3)
'@silverhand/eslint-config-react':
specifier: 5.0.0
version: 5.0.0(eslint@8.44.0)(postcss@8.4.38)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3)
'@silverhand/ts-config':
specifier: 5.0.0
version: 5.0.0(typescript@5.3.3)
'@silverhand/ts-config-react':
specifier: 5.0.0
version: 5.0.0(typescript@5.3.3)
'@types/node':
specifier: ^20.9.5
version: 20.10.4
'@types/react':
specifier: ^18.0.31
version: 18.0.31
'@vitest/coverage-v8':
specifier: ^1.4.0
version: 1.4.0(vitest@1.4.0)
eslint:
specifier: ^8.44.0
version: 8.44.0
history:
specifier: ^5.3.0
version: 5.3.0
lint-staged:
specifier: ^15.0.0
version: 15.0.2
prettier:
specifier: ^3.0.0
version: 3.0.0
react:
specifier: ^18.0.0
version: 18.2.0
typescript:
specifier: ^5.3.3
version: 5.3.3
@ -3402,9 +3378,6 @@ importers:
'@jest/types':
specifier: ^29.5.0
version: 29.6.3
'@logto/app-insights':
specifier: workspace:^1.4.0
version: link:../app-insights
'@logto/connector-kit':
specifier: workspace:^3.0.0
version: link:../toolkit/connector-kit
@ -5544,7 +5517,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@azure/abort-controller': 1.1.0
tslib: 2.5.0
tslib: 2.6.2
dev: false
/@azure/logger@1.0.4:
@ -6032,6 +6005,7 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
dev: true
/@babel/runtime@7.21.0:
resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
@ -6507,25 +6481,11 @@ packages:
'@csstools/css-tokenizer': 2.0.1
dev: true
/@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4):
resolution: {integrity: sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
'@csstools/css-tokenizer': ^2.2.4
dependencies:
'@csstools/css-tokenizer': 2.2.4
dev: true
/@csstools/css-tokenizer@2.0.1:
resolution: {integrity: sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==}
engines: {node: ^14 || ^16 || >=18}
dev: true
/@csstools/css-tokenizer@2.2.4:
resolution: {integrity: sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==}
engines: {node: ^14 || ^16 || >=18}
dev: true
/@csstools/media-query-list-parser@2.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.0.1):
resolution: {integrity: sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==}
engines: {node: ^14 || ^16 || >=18}
@ -6537,17 +6497,6 @@ packages:
'@csstools/css-tokenizer': 2.0.1
dev: true
/@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4):
resolution: {integrity: sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
'@csstools/css-parser-algorithms': ^2.6.1
'@csstools/css-tokenizer': ^2.2.4
dependencies:
'@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4)
'@csstools/css-tokenizer': 2.2.4
dev: true
/@csstools/selector-specificity@2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.31):
resolution: {integrity: sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==}
engines: {node: ^14 || ^16 || >=18}
@ -6559,15 +6508,6 @@ packages:
postcss-selector-parser: 6.0.11
dev: true
/@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.16):
resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss-selector-parser: ^6.0.13
dependencies:
postcss-selector-parser: 6.0.16
dev: true
/@esbuild/aix-ppc64@0.19.12:
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
engines: {node: '>=12'}
@ -7488,164 +7428,10 @@ packages:
resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==}
dev: true
/@microsoft/applicationinsights-analytics-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-HIlptHMIX3cGqTOUrdVjWb5FpYvs1xmosrIf7pnU0Y0/BER382fHCb/4BAB5mU32h/UlPX8to/d6Q20fSCtYAw==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-cfgsync-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-tVrIYxu3SCB/vYGdwPg5Inc8Kr1I9PCbqb/mIp+qOJyIRiB90VIHde6qHsttb7/ZHJJbNlztUtY4UcD5jaCBoA==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-async': 0.5.1
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-channel-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-QyPxpOOhtohFzcl4tzfWp4seN6JaToF66DZ1qjsYkUmEyHAackWSsv9m7qvuaAcCB9WrUzW9y0mRXgGKsEJcAg==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-async': 0.5.1
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-clickanalytics-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-zlOip0roNUGyrNb0vnsNSYYs5kETbf6Tlgijueyy9nrY14RbWCcIv0AhIxfM4juLIxlnl6Lo0YYdRe41P9yjng==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-properties-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-common@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-ivu3s73xt6Owakepnx2mbrMCry1mVHrA/2TL4nKCRLad6O3IBK3MkruMoeb3hoWpECBhErFRVj+/b0Kh7dl/Lw==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-core-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-xsJAm52tV355S/MogTunV/m1wg6P6tFg9Yhi4AC2OE9p2aa0k/FYHzWmrCrsEAVimCd8n/iTXmMRSrQk5QpxiA==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-async': 0.5.1
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-dependencies-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-vFf/6s1ACvcmeDpAAMin2JefPQ+7lthfcNThLFOMPxRxsIKIsQMZ1rHhqd55xcZTNITCywhuK4dD+/YkwC9HPw==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-async': 0.5.1
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-properties-js@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-GK+o/7RyIfySxAIHvw2oba5ca4WyvjE40+1gnRL15Pd/qnRn8+6OIOTpJ4kT1wg2l8CTVtPrUmIK4zeN6MqocA==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-react-js@17.1.2(history@5.3.0)(react@18.2.0)(tslib@2.4.1):
resolution: {integrity: sha512-i98Ep/UQvuLeDWWCWOLuvpF1cACOR98gafpTcOVeZSPKYlUtvFAqx6Xkn7HjjqZklxP9h0Hqjs5dreu4D5nM2A==}
peerDependencies:
history: '>= 4.10.1'
react: '>= 17.0.1 || ^18.0.0'
tslib: '*'
dependencies:
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-utils': 0.11.2
history: 5.3.0
react: 18.2.0
tslib: 2.4.1
dev: false
/@microsoft/applicationinsights-shims@3.0.1:
resolution: {integrity: sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==}
dependencies:
'@nevware21/ts-utils': 0.11.2
dev: false
/@microsoft/applicationinsights-web-snippet@1.0.1:
resolution: {integrity: sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==}
dev: false
/@microsoft/applicationinsights-web@3.1.2(tslib@2.4.1):
resolution: {integrity: sha512-q+6RUtKChXrMf2+TN/dohK2p+LUTw8EIYKFtrujYG8/jh88fCdVqmgTCPk9bLb4wsH/dd5wLS+Aw7qVQtlYa9Q==}
peerDependencies:
tslib: '*'
dependencies:
'@microsoft/applicationinsights-analytics-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-cfgsync-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-channel-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-common': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-core-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-dependencies-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-properties-js': 3.1.2(tslib@2.4.1)
'@microsoft/applicationinsights-shims': 3.0.1
'@microsoft/dynamicproto-js': 2.0.3
'@nevware21/ts-async': 0.5.1
'@nevware21/ts-utils': 0.11.2
tslib: 2.4.1
dev: false
/@microsoft/dynamicproto-js@2.0.3:
resolution: {integrity: sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==}
dependencies:
'@nevware21/ts-utils': 0.11.2
dev: false
/@mischnic/json-sourcemap@0.1.0:
resolution: {integrity: sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==}
engines: {node: '>=12.0.0'}
@ -7725,16 +7511,6 @@ packages:
dev: true
optional: true
/@nevware21/ts-async@0.5.1:
resolution: {integrity: sha512-O2kN8n2HpDWJ7Oji+oTMnhITrCndmrNvrHbGDwAIBydx+FWvLE/vrw4QwnRRMvSCa2AJrcP59Ryklxv30KfkWQ==}
dependencies:
'@nevware21/ts-utils': 0.11.2
dev: false
/@nevware21/ts-utils@0.11.2:
resolution: {integrity: sha512-80W8BkS09kkGuUHJX50Fqq+QqAslxUaOQytH+3JhRacXs1EpEt2JOOkYKytqFZAYir3SeH9fahniEaDzIBxlUw==}
dev: false
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -9017,30 +8793,6 @@ packages:
- typescript
dev: true
/@silverhand/eslint-config-react@5.0.0(eslint@8.44.0)(postcss@8.4.38)(prettier@3.0.0)(stylelint@15.11.0)(typescript@5.3.3):
resolution: {integrity: sha512-ZHLke0twGmW73b23mPh1r38fw+4L+XL+9dedml21+OnXpftT3XM00igRocUgdfGTGxbGbQy1n5fLN5gizv5InQ==}
engines: {node: ^20.9.0}
peerDependencies:
stylelint: ^15.0.0
dependencies:
'@silverhand/eslint-config': 5.0.0(eslint@8.44.0)(prettier@3.0.0)(typescript@5.3.3)
eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.2)(eslint@8.44.0)
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.44.0)
eslint-plugin-react: 7.32.2(eslint@8.44.0)
eslint-plugin-react-hooks: 4.6.0(eslint@8.44.0)
stylelint: 15.11.0(typescript@5.3.3)
stylelint-config-xo-scss: 0.15.0(postcss@8.4.38)(stylelint@15.11.0)
transitivePeerDependencies:
- '@types/eslint'
- eslint
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- postcss
- prettier
- supports-color
- typescript
dev: true
/@silverhand/eslint-config@5.0.0(eslint@8.44.0)(prettier@3.0.0)(typescript@5.3.3):
resolution: {integrity: sha512-cVoe58TAtt2u5gvk9WpTGg2NlA3DVw6DeBOV1qxj3gnFGOtvUf6IMeX5gwcox3+zMNBOmVmOGljeVS7bSuJ80w==}
engines: {node: ^20.9.0}
@ -10299,7 +10051,6 @@ packages:
'@types/keygrip': 1.0.2
'@types/koa-compose': 3.2.5
'@types/node': 20.12.7
dev: false
/@types/koa__cors@5.0.0:
resolution: {integrity: sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==}
@ -10340,10 +10091,6 @@ packages:
resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
dev: true
/@types/minimist@1.2.5:
resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
dev: true
/@types/ms@0.7.31:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: true
@ -10385,10 +10132,6 @@ packages:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
/@types/normalize-package-data@2.4.4:
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
dev: true
/@types/oidc-provider@8.4.4:
resolution: {integrity: sha512-+SlmKc4qlCJLjpw6Du/8cXw18JsPEYyQwoy+xheLkiuNsCz1mPEYI/lRXLQHvfJD9TH6+2/WDTLZQ2UUJ5G4bw==}
dependencies:
@ -12229,11 +11972,6 @@ packages:
engines: {node: '>=12.22'}
dev: true
/css-functions-list@3.2.1:
resolution: {integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==}
engines: {node: '>=12 || >=16'}
dev: true
/css-select@4.3.0:
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
dependencies:
@ -12451,11 +12189,6 @@ packages:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'}
/decamelize@5.0.1:
resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
engines: {node: '>=10'}
dev: true
/decamelize@6.0.0:
resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -13760,13 +13493,6 @@ packages:
flat-cache: 3.0.4
dev: true
/file-entry-cache@7.0.2:
resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==}
engines: {node: '>=12.0.0'}
dependencies:
flat-cache: 3.2.0
dev: true
/file-selector@0.6.0:
resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==}
engines: {node: '>= 12'}
@ -13850,23 +13576,10 @@ packages:
rimraf: 3.0.2
dev: true
/flat-cache@3.2.0:
resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
flatted: 3.3.1
keyv: 4.5.4
rimraf: 3.0.2
dev: true
/flatted@3.2.7:
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
dev: true
/flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
dev: true
/follow-redirects@1.15.5:
resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
engines: {node: '>=4.0'}
@ -14519,6 +14232,7 @@ packages:
resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
dependencies:
'@babel/runtime': 7.19.4
dev: true
/hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
@ -14571,11 +14285,6 @@ packages:
engines: {node: '>=8'}
dev: true
/html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
dev: true
/html-url-attributes@3.0.0:
resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==}
dev: true
@ -14879,11 +14588,6 @@ packages:
engines: {node: '>=8'}
dev: true
/indent-string@5.0.0:
resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
engines: {node: '>=12'}
dev: true
/inflation@2.0.0:
resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==}
engines: {node: '>= 0.8.0'}
@ -16131,6 +15835,7 @@ packages:
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: true
/js-tokens@8.0.3:
resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==}
@ -16221,6 +15926,7 @@ packages:
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: false
/json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
@ -16357,6 +16063,7 @@ packages:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
dependencies:
json-buffer: 3.0.1
dev: false
/kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
@ -16377,10 +16084,6 @@ packages:
resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==}
dev: true
/known-css-properties@0.29.0:
resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==}
dev: true
/koa-body@6.0.1:
resolution: {integrity: sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==}
dependencies:
@ -16882,6 +16585,7 @@ packages:
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: true
/loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@ -17184,24 +16888,6 @@ packages:
resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
engines: {node: '>= 0.6'}
/meow@10.1.5:
resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
'@types/minimist': 1.2.5
camelcase-keys: 7.0.2
decamelize: 5.0.1
decamelize-keys: 1.1.1
hard-rejection: 2.1.0
minimist-options: 4.1.0
normalize-package-data: 3.0.3
read-pkg-up: 8.0.0
redent: 4.0.0
trim-newlines: 4.1.1
type-fest: 1.4.0
yargs-parser: 20.2.9
dev: true
/meow@12.1.1:
resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
engines: {node: '>=16.10'}
@ -18710,15 +18396,6 @@ packages:
postcss: 8.4.31
dev: true
/postcss-safe-parser@6.0.0(postcss@8.4.38):
resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.3.3
dependencies:
postcss: 8.4.38
dev: true
/postcss-scss@4.0.5(postcss@8.4.31):
resolution: {integrity: sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==}
engines: {node: '>=12.0'}
@ -18728,15 +18405,6 @@ packages:
postcss: 8.4.31
dev: true
/postcss-scss@4.0.5(postcss@8.4.38):
resolution: {integrity: sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.3.3
dependencies:
postcss: 8.4.38
dev: true
/postcss-selector-parser@6.0.11:
resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
engines: {node: '>=4'}
@ -18753,14 +18421,6 @@ packages:
util-deprecate: 1.0.2
dev: true
/postcss-selector-parser@6.0.16:
resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==}
engines: {node: '>=4'}
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
dev: true
/postcss-sorting@7.0.1(postcss@8.4.31):
resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==}
peerDependencies:
@ -18795,15 +18455,6 @@ packages:
source-map-js: 1.0.2
dev: true
/postcss@8.4.38:
resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.2.0
dev: true
/postgres-array@2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'}
@ -19513,6 +19164,7 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
dev: true
/reactcss@1.2.3(react@18.2.0):
resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==}
@ -19532,15 +19184,6 @@ packages:
type-fest: 0.8.1
dev: true
/read-pkg-up@8.0.0:
resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
engines: {node: '>=12'}
dependencies:
find-up: 5.0.0
read-pkg: 6.0.0
type-fest: 1.4.0
dev: true
/read-pkg@5.2.0:
resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
engines: {node: '>=8'}
@ -19551,16 +19194,6 @@ packages:
type-fest: 0.6.0
dev: true
/read-pkg@6.0.0:
resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==}
engines: {node: '>=12'}
dependencies:
'@types/normalize-package-data': 2.4.4
normalize-package-data: 3.0.3
parse-json: 5.2.0
type-fest: 1.4.0
dev: true
/read-yaml-file@1.1.0:
resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
engines: {node: '>=6'}
@ -19624,14 +19257,6 @@ packages:
strip-indent: 3.0.0
dev: true
/redent@4.0.0:
resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
engines: {node: '>=12'}
dependencies:
indent-string: 5.0.0
strip-indent: 4.0.0
dev: true
/redis@4.6.5:
resolution: {integrity: sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==}
dependencies:
@ -20296,11 +19921,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/source-map-js@1.2.0:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
dev: true
/source-map-support@0.5.13:
resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
dependencies:
@ -20592,13 +20212,6 @@ packages:
min-indent: 1.0.1
dev: true
/strip-indent@4.0.0:
resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
engines: {node: '>=12'}
dependencies:
min-indent: 1.0.1
dev: true
/strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@ -20648,20 +20261,6 @@ packages:
- postcss
dev: true
/stylelint-config-xo-scss@0.15.0(postcss@8.4.38)(stylelint@15.11.0):
resolution: {integrity: sha512-X9WD8cDofWFWy3uaKdwwm+DjEvgI/+h7AtlaPagkhNAeOWH/GFQoeciBvNvyJ8tB1p00SoIzCn2IIOIKXCbxYA==}
engines: {node: '>=12'}
peerDependencies:
stylelint: '>=14.5.1 || ^15.0.0'
dependencies:
postcss-scss: 4.0.5(postcss@8.4.38)
stylelint: 15.11.0(typescript@5.3.3)
stylelint-config-xo: 0.21.1(stylelint@15.11.0)
stylelint-scss: 4.3.0(stylelint@15.11.0)
transitivePeerDependencies:
- postcss
dev: true
/stylelint-config-xo@0.21.1(stylelint@15.0.0):
resolution: {integrity: sha512-ORyxhq/Yutg27NgYlStkbXhK+Lz1SqZJDqV9Y2oWcfRFcDdgVAyM6ic7frOW00UH+OFyuGpTdIbTNTtVgsWpcw==}
engines: {node: '>=12'}
@ -20673,17 +20272,6 @@ packages:
stylelint-order: 5.0.0(stylelint@15.0.0)
dev: true
/stylelint-config-xo@0.21.1(stylelint@15.11.0):
resolution: {integrity: sha512-ORyxhq/Yutg27NgYlStkbXhK+Lz1SqZJDqV9Y2oWcfRFcDdgVAyM6ic7frOW00UH+OFyuGpTdIbTNTtVgsWpcw==}
engines: {node: '>=12'}
peerDependencies:
stylelint: '>=14 || ^15.0.0'
dependencies:
stylelint: 15.11.0(typescript@5.3.3)
stylelint-declaration-block-no-ignored-properties: 2.5.0(stylelint@15.11.0)
stylelint-order: 5.0.0(stylelint@15.11.0)
dev: true
/stylelint-declaration-block-no-ignored-properties@2.5.0(stylelint@15.0.0):
resolution: {integrity: sha512-UNz5nUC5GMgMb6GPc/pHUTC0+ydxTdj2mUn7XcKRdwQoiUzzUmWWdSf1aFv2UzrW4x8JYNReE1u5JOj7g0ThJw==}
engines: {node: '>=6'}
@ -20693,15 +20281,6 @@ packages:
stylelint: 15.0.0
dev: true
/stylelint-declaration-block-no-ignored-properties@2.5.0(stylelint@15.11.0):
resolution: {integrity: sha512-UNz5nUC5GMgMb6GPc/pHUTC0+ydxTdj2mUn7XcKRdwQoiUzzUmWWdSf1aFv2UzrW4x8JYNReE1u5JOj7g0ThJw==}
engines: {node: '>=6'}
peerDependencies:
stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
dependencies:
stylelint: 15.11.0(typescript@5.3.3)
dev: true
/stylelint-order@5.0.0(stylelint@15.0.0):
resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==}
peerDependencies:
@ -20712,16 +20291,6 @@ packages:
stylelint: 15.0.0
dev: true
/stylelint-order@5.0.0(stylelint@15.11.0):
resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==}
peerDependencies:
stylelint: ^14.0.0 || ^15.0.0
dependencies:
postcss: 8.4.31
postcss-sorting: 7.0.1(postcss@8.4.31)
stylelint: 15.11.0(typescript@5.3.3)
dev: true
/stylelint-scss@4.3.0(stylelint@15.0.0):
resolution: {integrity: sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==}
peerDependencies:
@ -20735,19 +20304,6 @@ packages:
stylelint: 15.0.0
dev: true
/stylelint-scss@4.3.0(stylelint@15.11.0):
resolution: {integrity: sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==}
peerDependencies:
stylelint: ^14.5.1 || ^15.0.0
dependencies:
lodash: 4.17.21
postcss-media-query-parser: 0.2.3
postcss-resolve-nested-selector: 0.1.1
postcss-selector-parser: 6.0.13
postcss-value-parser: 4.2.0
stylelint: 15.11.0(typescript@5.3.3)
dev: true
/stylelint@15.0.0:
resolution: {integrity: sha512-K97Jgy0ZYMSs6gXoboXbWvc0KvvGnUftiI1Tiv70mQ/DpeDTHOlqQSk3o65Ien+ddYAJeLjzkYM0O6TWiHdoSg==}
engines: {node: ^14.13.1 || >=16.0.0}
@ -20799,56 +20355,6 @@ packages:
- supports-color
dev: true
/stylelint@15.11.0(typescript@5.3.3):
resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==}
engines: {node: ^14.13.1 || >=16.0.0}
hasBin: true
dependencies:
'@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4)
'@csstools/css-tokenizer': 2.2.4
'@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4)
'@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16)
balanced-match: 2.0.0
colord: 2.9.3
cosmiconfig: 8.3.6(typescript@5.3.3)
css-functions-list: 3.2.1
css-tree: 2.3.1
debug: 4.3.4
fast-glob: 3.3.2
fastest-levenshtein: 1.0.16
file-entry-cache: 7.0.2
global-modules: 2.0.0
globby: 11.1.0
globjoin: 0.1.4
html-tags: 3.3.1
ignore: 5.3.1
import-lazy: 4.0.0
imurmurhash: 0.1.4
is-plain-object: 5.0.0
known-css-properties: 0.29.0
mathml-tag-names: 2.1.3
meow: 10.1.5
micromatch: 4.0.5
normalize-path: 3.0.0
picocolors: 1.0.0
postcss: 8.4.38
postcss-resolve-nested-selector: 0.1.1
postcss-safe-parser: 6.0.0(postcss@8.4.38)
postcss-selector-parser: 6.0.16
postcss-value-parser: 4.2.0
resolve-from: 5.0.0
string-width: 4.2.3
strip-ansi: 6.0.1
style-search: 0.1.0
supports-hyperlinks: 3.0.0
svg-tags: 1.0.0
table: 6.8.2
write-file-atomic: 5.0.1
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/superagent@8.1.2:
resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==}
engines: {node: '>=6.4.0 <13 || >=14'}
@ -20910,14 +20416,6 @@ packages:
supports-color: 7.2.0
dev: true
/supports-hyperlinks@3.0.0:
resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==}
engines: {node: '>=14.18'}
dependencies:
has-flag: 4.0.0
supports-color: 7.2.0
dev: true
/supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@ -20976,17 +20474,6 @@ packages:
strip-ansi: 6.0.1
dev: true
/table@6.8.2:
resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
engines: {node: '>=10.0.0'}
dependencies:
ajv: 8.12.0
lodash.truncate: 4.4.2
slice-ansi: 4.0.0
string-width: 4.2.3
strip-ansi: 6.0.1
dev: true
/tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@ -21186,11 +20673,6 @@ packages:
engines: {node: '>=8'}
dev: true
/trim-newlines@4.1.1:
resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==}
engines: {node: '>=12'}
dev: true
/trim-trailing-lines@1.1.4:
resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==}
dev: true
@ -22112,14 +21594,6 @@ packages:
signal-exit: 3.0.7
dev: true
/write-file-atomic@5.0.1:
resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dependencies:
imurmurhash: 0.1.4
signal-exit: 4.1.0
dev: true
/ws@8.16.0:
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
engines: {node: '>=10.0.0'}