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

feat(core): apply standard security headers 1/2 (#3590)

* feat(core): add some basic security headers

add some basic security headers

* chore(core): add some comments

add some comments

* chore(core): update the refererPolicy configs

update the refererPolicy configs

* chore(core): update helmet middleware

update helmet middleware

* feat(core): add csp headers to the mainflow and ac http requests 2/2 (#3613)

* feat(core): add csp headers to the mainflow requests

add csp headers to the mainflow requests

* chore(core): add ui and console security headers

add ui and console security headers

* fix(core): remove unused middleware

remove unused middleware

* fix(ui): set terms iframe sandbox

set terms iframe sandbox allow same origin

* fix(core): update security headers middleware

update security headers middleware

* chore(core): add changesets

* chore(core): address rebase conflict

address rebase conflict
This commit is contained in:
simeng-li 2023-04-03 10:24:50 +08:00 committed by GitHub
parent fc08fb5575
commit 1c431e7a59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 330 additions and 99 deletions

View file

@ -0,0 +1,21 @@
---
"@logto/console": patch
"@logto/core": patch
"@logto/shared": patch
"@logto/ui": patch
---
Apply security headers
Apply security headers to logto http request response using (helmetjs)[https://helmetjs.github.io/].
[x] crossOriginOpenerPolicy
[x] crossOriginEmbedderPolicy
[x] crossOriginResourcePolicy
[x] hidePoweredBy
[x] hsts
[x] ieNoOpen
[x] noSniff
[x] referrerPolicy
[x] xssFilter
[x] Content-Security-Policy

View file

@ -39,7 +39,14 @@ function ImageWithErrorFallback({
return (
<div className={containerClassName}>
<img className={className} src={src} alt={alt} onError={errorHandler} {...props} />
<img
className={className}
src={src}
alt={alt}
onError={errorHandler}
{...props}
crossOrigin="anonymous"
/>
</div>
);
}

View file

@ -27,6 +27,7 @@ function GithubRawImage({ src, alt }: HTMLProps<HTMLImageElement>) {
src={`${githubRawUrlPrefix}${src}`}
alt={alt}
width={`${width}px`}
crossOrigin="anonymous"
onLoad={onLoad}
/>
);

View file

@ -26,7 +26,7 @@ export type Props = Omit<FileUploaderProps, 'maxSize' | 'allowedMimeTypes'> & {
function ImageUploader({ name, value, onDelete, ...rest }: Props) {
return value ? (
<div className={styles.imageUploader}>
<img alt={name} src={value} />
<img alt={name} src={value} crossOrigin="anonymous" />
<IconButton
className={styles.delete}
onClick={() => {

View file

@ -56,6 +56,7 @@
"koa-body": "^5.0.0",
"koa-compose": "^4.1.0",
"koa-compress": "^5.1.0",
"koa-helmet": "^7.0.2",
"koa-logger": "^3.2.1",
"koa-mount": "^4.0.0",
"koa-proxies": "^0.12.1",

View file

@ -0,0 +1,124 @@
import { defaultTenantId } from '@logto/schemas';
import type { MiddlewareType } from 'koa';
import helmet from 'koa-helmet';
import { EnvSet, AdminApps, getTenantEndpoint } from '#src/env-set/index.js';
/**
* Apply security headers to the response using koa-helmet
* @see https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html for recommended headers
* @see https://helmetjs.github.io/ for more details
* @returns koa middleware
*/
export default function koaSecurityHeaders<StateT, ContextT, ResponseBodyT>(
mountedApps: string[],
tenantId: string
): MiddlewareType<StateT, ContextT, ResponseBodyT> {
type Middleware = MiddlewareType<StateT, ContextT, ResponseBodyT>;
type HelmetOptions = Parameters<typeof helmet>[0];
const { isProduction, isCloud, isMultiTenancy, adminUrlSet, cloudUrlSet } = EnvSet.values;
const adminOrigins = adminUrlSet.origins;
const cloudOrigins = isCloud ? cloudUrlSet.origins : [];
const tenantEndpointOrigin = getTenantEndpoint(
isMultiTenancy ? tenantId : defaultTenantId,
EnvSet.values
).origin;
const developmentOrigins = isProduction ? [] : ['ws:'];
/**
* Default Applied rules:
* - crossOriginOpenerPolicy: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#cross-origin-opener-policy-coop
* - crossOriginResourcePolicy: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#cross-origin-resource-policy-corp
* - crossOriginEmbedderPolicy: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#cross-origin-embedder-policy-coep
* - hidePoweredBy: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#x-powered-by
* - hsts: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#strict-transport-security-hsts
* - ieNoOpen: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#x-download-options
* - noSniff: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#x-content-type-options
* - permittedCrossDomainPolicies: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#x-permitted-cross-domain-policies
* - referrerPolicy: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#referrer-policy
* - xssFilter: https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html#x-xss-protection
* - originAgentCluster: https://whatpr.org/html/6214/origin.html#origin-keyed-agent-clusters
*/
const basicSecurityHeaderSettings: HelmetOptions = {
contentSecurityPolicy: false, // Exclusively set per app
expectCt: false, // Not recommended, will be deprecated by modern browsers
dnsPrefetchControl: false,
referrerPolicy: {
policy: 'strict-origin-when-cross-origin',
},
};
const mainFlowUiSecurityHeaderSettings: HelmetOptions = {
...basicSecurityHeaderSettings,
// WARNING: high risk Need to allow self hosted terms of use page loaded in an iframe
frameguard: false,
// Alow loaded by console preview iframe
crossOriginResourcePolicy: {
policy: 'cross-origin',
},
contentSecurityPolicy: {
useDefaults: true,
// Temporary set to report only to avoid breaking the app
reportOnly: true,
directives: {
imgSrc: ["'self'", 'data:', 'https:'],
connectSrc: ["'self'", ...adminOrigins, ...cloudOrigins, ...developmentOrigins],
// WARNING: high risk Need to allow self hosted terms of use page loaded in an iframe
frameSrc: ["'self'", 'https:'],
// Alow loaded by console preview iframe
frameAncestors: ["'self'", ...adminOrigins, ...cloudOrigins],
},
},
};
const consoleSecurityHeaderSettings: HelmetOptions = {
...basicSecurityHeaderSettings,
// Guarded by CSP header bellow
frameguard: false,
contentSecurityPolicy: {
useDefaults: true,
// Temporary set to report only to avoid breaking the app
reportOnly: true,
directives: {
imgSrc: ["'self'", 'data:', 'https:'],
connectSrc: [
"'self'",
tenantEndpointOrigin,
...adminOrigins,
...cloudOrigins,
...developmentOrigins,
],
// Allow Main Flow origin loaded in preview iframe
frameSrc: ["'self'", tenantEndpointOrigin],
},
},
};
const buildHelmetMiddleware: (options: HelmetOptions) => Middleware = (options) =>
helmet(options);
return async (ctx, next) => {
const requestPath = ctx.request.path;
// Admin Console
if (
requestPath.startsWith(`/${AdminApps.Console}`) ||
requestPath.startsWith(`/${AdminApps.Welcome}`)
) {
return buildHelmetMiddleware(consoleSecurityHeaderSettings)(ctx, next);
}
// Route has been handled by one of mounted apps
if (mountedApps.some((app) => app !== '' && requestPath.startsWith(`/${app}`))) {
return buildHelmetMiddleware(basicSecurityHeaderSettings)(ctx, next);
}
// Main flow UI
return buildHelmetMiddleware(mainFlowUiSecurityHeaderSettings)(ctx, next);
};
}

View file

@ -14,6 +14,7 @@ import koaConsoleRedirectProxy from '#src/middleware/koa-console-redirect-proxy.
import koaErrorHandler from '#src/middleware/koa-error-handler.js';
import koaI18next from '#src/middleware/koa-i18next.js';
import koaOIDCErrorHandler from '#src/middleware/koa-oidc-error-handler.js';
import koaSecurityHeaders from '#src/middleware/koa-security-headers.js';
import koaSlonikErrorHandler from '#src/middleware/koa-slonik-error-handler.js';
import koaSpaProxy from '#src/middleware/koa-spa-proxy.js';
import koaSpaSessionGuard from '#src/middleware/koa-spa-session-guard.js';
@ -69,6 +70,7 @@ export default class Tenant implements TenantContext {
app.use(koaConnectorErrorHandler());
app.use(koaI18next());
app.use(koaCompress());
app.use(koaSecurityHeaders(mountedApps, id));
// Mount OIDC
const provider = initOidc(id, envSet, queries, libraries);
@ -82,6 +84,7 @@ export default class Tenant implements TenantContext {
libraries,
envSet,
};
// Mount APIs
app.use(mount('/api', initApis(tenantContext)));
@ -126,6 +129,7 @@ export default class Tenant implements TenantContext {
this.provider = provider;
const { isPathBasedMultiTenancy, adminUrlSet } = EnvSet.values;
this.run =
isPathBasedMultiTenancy &&
// If admin URL Set is specified, consider that URL first

View file

@ -20,6 +20,10 @@ describe('UrlSet', () => {
new URL('https://localhost:3001'),
new URL('https://logto.mock'),
]);
expect(set1.origins).toStrictEqual([
new URL('https://localhost:3001').origin,
new URL('https://logto.mock').origin,
]);
expect(set1.port).toEqual(3001);
expect(set1.localhostUrl).toEqual(new URL('https://localhost:3001'));
expect(set1.endpoint).toEqual(new URL('https://logto.mock'));
@ -30,6 +34,10 @@ describe('UrlSet', () => {
new URL('http://localhost:3002/'),
new URL('https://admin.logto.mock/'),
]);
expect(set2.origins).toStrictEqual([
new URL('http://localhost:3002/').origin,
new URL('https://admin.logto.mock/').origin,
]);
expect(set2.port).toEqual(3002);
expect(set2.localhostUrl).toEqual(new URL('http://localhost:3002'));
expect(set2.endpoint).toEqual(new URL('https://admin.logto.mock'));
@ -44,6 +52,7 @@ describe('UrlSet', () => {
const set1 = new UrlSet(false, 3001);
expect(set1.deduplicated()).toStrictEqual([new URL('http://localhost:3001/')]);
expect(set1.origins).toStrictEqual([new URL('http://localhost:3001/').origin]);
expect(set1.port).toEqual(3001);
expect(set1.localhostUrl).toEqual(new URL('http://localhost:3001'));
expect(set1.endpoint).toEqual(new URL('http://localhost:3001'));
@ -59,6 +68,7 @@ describe('UrlSet', () => {
const set1 = new UrlSet(true, 3001);
expect(set1.deduplicated()).toStrictEqual([new URL('https://logto.mock/logto')]);
expect(set1.origins).toStrictEqual([new URL('https://logto.mock/logto').origin]);
expect(() => set1.port).toThrowError('Localhost has been disabled in this URL Set.');
expect(() => set1.localhostUrl).toThrowError('Localhost has been disabled in this URL Set.');
expect(set1.endpoint).toEqual(new URL('https://logto.mock/logto'));
@ -74,6 +84,7 @@ describe('UrlSet', () => {
const set1 = new UrlSet(false, 3002, 'ADMIN_');
expect(set1.deduplicated()).toStrictEqual([]);
expect(set1.origins).toStrictEqual([]);
expect(() => set1.port).toThrowError('Localhost has been disabled in this URL Set.');
expect(() => set1.localhostUrl).toThrowError('Localhost has been disabled in this URL Set.');
expect(() => set1.endpoint).toThrowError('No available endpoint in this URL Set.');

View file

@ -39,6 +39,10 @@ export default class UrlSet {
).map((value) => new URL(value));
}
public get origins(): string[] {
return this.deduplicated().map((url) => url.origin);
}
public get port(): number {
if (this.isLocalhostDisabled) {
throw new Error('Localhost has been disabled in this URL Set.');

View file

@ -52,8 +52,7 @@ const IframeModal = ({ className, title = '', href = '', onClose }: ModalProps)
<iframe
title={title}
src={href}
// Applies all restrictions
sandbox=""
sandbox="allow-same-origin"
className={conditional(isLoaded && styles.loaded)}
onLoad={() => {
setIsLoaded(true);

View file

@ -16,7 +16,7 @@ const BrandingHeader = ({ logo, headline, className }: Props) => {
return (
<div className={classNames(styles.container, className)}>
{logo && <img className={styles.logo} alt="app logo" src={logo} />}
{logo && <img className={styles.logo} alt="app logo" src={logo} crossOrigin="anonymous" />}
{headline && <div className={styles.headline}>{t(headline)}</div>}
</div>
);

View file

@ -35,7 +35,14 @@ const SocialLinkButton = ({ isDisabled, className, target, name, logo, onClick }
type="button"
onClick={onClick}
>
{logo && <img src={logo} alt={target} className={socialLinkButtonStyles.icon} />}
{logo && (
<img
src={logo}
alt={target}
className={socialLinkButtonStyles.icon}
crossOrigin="anonymous"
/>
)}
<div className={socialLinkButtonStyles.name}>
<div className={socialLinkButtonStyles.placeHolder} />
<span>{t('action.sign_in_with', { name: localName })}</span>

View file

@ -24,6 +24,7 @@ const SocialLanding = ({ className, connectorId, isLoading = false }: Props) =>
<img
src={theme === Theme.Dark ? connector.logoDark ?? connector.logo : connector.logo}
alt="logo"
crossOrigin="anonymous"
/>
) : (
connectorId

View file

@ -43,7 +43,9 @@ const Consent = () => {
return (
<div className={styles.viewBox}>
<div className={styles.container}>
{brandingLogo && <img alt="logo" className={styles.img} src={brandingLogo} />}
{brandingLogo && (
<img alt="logo" className={styles.img} src={brandingLogo} crossOrigin="anonymous" />
)}
<div className={styles.loadingWrapper}>{loading && <LoadingIcon />}</div>
</div>
</div>

View file

@ -656,6 +656,9 @@ importers:
koa-compress:
specifier: ^5.1.0
version: 5.1.0
koa-helmet:
specifier: ^7.0.2
version: 7.0.2
koa-logger:
specifier: ^3.2.1
version: 3.2.1
@ -1627,7 +1630,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@azure/abort-controller': 1.1.0
tslib: 2.4.1
tslib: 2.5.0
dev: false
/@azure/logger@1.0.4:
@ -1679,7 +1682,7 @@ packages:
convert-source-map: 1.9.0
debug: 4.3.4
gensync: 1.0.0-beta.2
json5: 2.2.3
json5: 2.2.1
lodash: 4.17.21
resolve: 1.22.1
semver: 5.7.1
@ -1705,7 +1708,7 @@ packages:
convert-source-map: 1.9.0
debug: 4.3.4
gensync: 1.0.0-beta.2
json5: 2.2.3
json5: 2.2.1
semver: 6.3.0
transitivePeerDependencies:
- supports-color
@ -2026,7 +2029,7 @@ packages:
resolution: {integrity: sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
regenerator-runtime: 0.13.9
/@babel/runtime@7.19.4:
resolution: {integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==}
@ -2463,8 +2466,18 @@ packages:
postcss-selector-parser: 6.0.11
dev: true
/@eslint-community/eslint-utils@4.3.0(eslint@8.34.0):
resolution: {integrity: sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==}
/@eslint-community/eslint-utils@4.1.2(eslint@8.34.0):
resolution: {integrity: sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
eslint: 8.34.0
eslint-visitor-keys: 3.3.0
dev: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.34.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@ -2473,8 +2486,8 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@eslint-community/regexpp@4.4.0:
resolution: {integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==}
/@eslint-community/regexpp@4.5.0:
resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
dev: true
@ -3171,7 +3184,6 @@ packages:
/@microsoft/applicationinsights-react-js@3.4.1(history@5.3.0)(react@18.2.0)(tslib@2.4.1):
resolution: {integrity: sha512-oosMkymmkkulUdFcUbqKc64Li0KpItmV/pClOr4DCLAxbitCjHDkKdxodvpUzMHVs1ko9cHP360oc1QVXprhXQ==}
requiresBuild: true
peerDependencies:
history: '>= 4.10.1'
react: '>= 17.0.1 || ^18.0.0'
@ -3196,7 +3208,6 @@ packages:
/@microsoft/applicationinsights-web@2.8.11(tslib@2.4.1):
resolution: {integrity: sha512-cLJl3MLQtvbwXU0hvFLl6S2/rIdoZKpZL8cvdaT0cXqd5XIiMbeUOxWHLf2hxT8IlIeVlu5nnFILeRYOFZowvw==}
requiresBuild: true
peerDependencies:
tslib: '*'
dependencies:
@ -3221,7 +3232,7 @@ packages:
dependencies:
'@lezer/common': 0.15.12
'@lezer/lr': 0.15.8
json5: 2.2.3
json5: 2.2.1
dev: true
/@msgpackr-extract/msgpackr-extract-darwin-arm64@2.2.0:
@ -3877,7 +3888,7 @@ packages:
'@parcel/source-map': 2.1.1
'@parcel/utils': 2.8.3
browserslist: 4.21.4
json5: 2.2.3
json5: 2.2.1
nullthrows: 1.1.1
semver: 5.7.1
transitivePeerDependencies:
@ -3954,7 +3965,7 @@ packages:
engines: {node: '>= 12.0.0', parcel: ^2.8.3}
dependencies:
'@parcel/plugin': 2.8.3(@parcel/core@2.8.3)
json5: 2.2.3
json5: 2.2.1
transitivePeerDependencies:
- '@parcel/core'
dev: true
@ -4151,7 +4162,7 @@ packages:
open: 8.4.0
picocolors: 1.0.0
tiny-glob: 0.2.9
tslib: 2.4.1
tslib: 2.5.0
dev: true
/@react-dnd/asap@5.0.0:
@ -4286,23 +4297,23 @@ packages:
prettier: ^2.8.2
dependencies:
'@silverhand/eslint-plugin-fp': 2.5.0(eslint@8.34.0)
'@typescript-eslint/eslint-plugin': 5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/eslint-plugin': 5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
eslint: 8.34.0
eslint-config-prettier: 8.8.0(eslint@8.34.0)
eslint-config-xo: 0.42.0(eslint@8.34.0)
eslint-config-xo-typescript: 0.56.0(@typescript-eslint/eslint-plugin@5.56.0)(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2)
eslint-import-resolver-typescript: 3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0)
eslint-config-xo-typescript: 0.56.0(@typescript-eslint/eslint-plugin@5.57.0)(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2)
eslint-import-resolver-typescript: 3.5.4(eslint-plugin-import@2.27.5)(eslint@8.34.0)
eslint-plugin-consistent-default-export-name: 0.0.15
eslint-plugin-eslint-comments: 3.2.0(eslint@8.34.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.56.0)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-typescript@3.5.4)(eslint@8.34.0)
eslint-plugin-no-use-extend-native: 0.5.0
eslint-plugin-node: 11.1.0(eslint@8.34.0)
eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.34.0)(prettier@2.8.4)
eslint-plugin-promise: 6.1.0(eslint@8.34.0)
eslint-plugin-sql: 2.1.0(eslint@8.34.0)
eslint-plugin-unicorn: 45.0.2(eslint@8.34.0)
eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.56.0)(eslint@8.34.0)
eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.57.0)(eslint@8.34.0)
prettier: 2.8.4
transitivePeerDependencies:
- eslint-import-resolver-webpack
@ -4585,7 +4596,7 @@ packages:
/@swc/helpers@0.4.14:
resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
dependencies:
tslib: 2.4.1
tslib: 2.5.0
dev: true
/@szmarczak/http-timer@5.0.1:
@ -4829,7 +4840,7 @@ packages:
/@types/is-ci@3.0.0:
resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==}
dependencies:
ci-info: 3.8.0
ci-info: 3.5.0
dev: true
/@types/istanbul-lib-coverage@2.0.4:
@ -5185,8 +5196,8 @@ packages:
dev: true
optional: true
/@typescript-eslint/eslint-plugin@5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==}
/@typescript-eslint/eslint-plugin@5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
'@typescript-eslint/parser': ^5.0.0
@ -5196,11 +5207,11 @@ packages:
typescript:
optional: true
dependencies:
'@eslint-community/regexpp': 4.4.0
'@typescript-eslint/parser': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/scope-manager': 5.56.0
'@typescript-eslint/type-utils': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/utils': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@eslint-community/regexpp': 4.5.0
'@typescript-eslint/parser': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/scope-manager': 5.57.0
'@typescript-eslint/type-utils': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/utils': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
debug: 4.3.4
eslint: 8.34.0
grapheme-splitter: 1.0.4
@ -5213,8 +5224,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@5.56.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==}
/@typescript-eslint/parser@5.57.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@ -5223,9 +5234,9 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 5.56.0
'@typescript-eslint/types': 5.56.0
'@typescript-eslint/typescript-estree': 5.56.0(typescript@5.0.2)
'@typescript-eslint/scope-manager': 5.57.0
'@typescript-eslint/types': 5.57.0
'@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2)
debug: 4.3.4
eslint: 8.34.0
typescript: 5.0.2
@ -5233,16 +5244,16 @@ packages:
- supports-color
dev: true
/@typescript-eslint/scope-manager@5.56.0:
resolution: {integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==}
/@typescript-eslint/scope-manager@5.57.0:
resolution: {integrity: sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.56.0
'@typescript-eslint/visitor-keys': 5.56.0
'@typescript-eslint/types': 5.57.0
'@typescript-eslint/visitor-keys': 5.57.0
dev: true
/@typescript-eslint/type-utils@5.56.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==}
/@typescript-eslint/type-utils@5.57.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: '*'
@ -5251,8 +5262,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 5.56.0(typescript@5.0.2)
'@typescript-eslint/utils': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2)
'@typescript-eslint/utils': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
debug: 4.3.4
eslint: 8.34.0
tsutils: 3.21.0(typescript@5.0.2)
@ -5261,13 +5272,13 @@ packages:
- supports-color
dev: true
/@typescript-eslint/types@5.56.0:
resolution: {integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==}
/@typescript-eslint/types@5.57.0:
resolution: {integrity: sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@typescript-eslint/typescript-estree@5.56.0(typescript@5.0.2):
resolution: {integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==}
/@typescript-eslint/typescript-estree@5.57.0(typescript@5.0.2):
resolution: {integrity: sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
@ -5275,8 +5286,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.56.0
'@typescript-eslint/visitor-keys': 5.56.0
'@typescript-eslint/types': 5.57.0
'@typescript-eslint/visitor-keys': 5.57.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
@ -5287,18 +5298,18 @@ packages:
- supports-color
dev: true
/@typescript-eslint/utils@5.56.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==}
/@typescript-eslint/utils@5.57.0(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.3.0(eslint@8.34.0)
'@eslint-community/eslint-utils': 4.4.0(eslint@8.34.0)
'@types/json-schema': 7.0.11
'@types/semver': 7.3.12
'@typescript-eslint/scope-manager': 5.56.0
'@typescript-eslint/types': 5.56.0
'@typescript-eslint/typescript-estree': 5.56.0(typescript@5.0.2)
'@typescript-eslint/scope-manager': 5.57.0
'@typescript-eslint/types': 5.57.0
'@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2)
eslint: 8.34.0
eslint-scope: 5.1.1
semver: 7.3.8
@ -5307,11 +5318,11 @@ packages:
- typescript
dev: true
/@typescript-eslint/visitor-keys@5.56.0:
resolution: {integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==}
/@typescript-eslint/visitor-keys@5.57.0:
resolution: {integrity: sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.56.0
'@typescript-eslint/types': 5.57.0
eslint-visitor-keys: 3.3.0
dev: true
@ -5579,6 +5590,16 @@ packages:
engines: {node: '>=8'}
dev: true
/array.prototype.flat@1.3.0:
resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.4
es-abstract: 1.20.4
es-shim-unscopables: 1.0.0
dev: true
/array.prototype.flat@1.3.1:
resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
engines: {node: '>= 0.4'}
@ -7113,8 +7134,8 @@ packages:
once: 1.4.0
dev: true
/enhanced-resolve@5.10.0:
resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==}
/enhanced-resolve@5.12.0:
resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==}
engines: {node: '>=10.13.0'}
dependencies:
graceful-fs: 4.2.10
@ -7264,7 +7285,7 @@ packages:
eslint-plugin-react-hooks: 4.6.0(eslint@8.34.0)
dev: true
/eslint-config-xo-typescript@0.56.0(@typescript-eslint/eslint-plugin@5.56.0)(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2):
/eslint-config-xo-typescript@0.56.0(@typescript-eslint/eslint-plugin@5.57.0)(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2):
resolution: {integrity: sha512-JOuV9M6R0BphdWome5SiolbsZFpw5DX83HgUaIUoEZwkk0hDv+fmPoHNc3KwmoON5QEkuBxlIbW0o3PifzPCuw==}
engines: {node: '>=12'}
peerDependencies:
@ -7273,8 +7294,8 @@ packages:
eslint: '>=8.0.0'
typescript: '>=4.4'
dependencies:
'@typescript-eslint/eslint-plugin': 5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/eslint-plugin': 5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
eslint: 8.34.0
typescript: 5.0.2
dev: true
@ -7299,27 +7320,27 @@ packages:
- supports-color
dev: true
/eslint-import-resolver-typescript@3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0):
resolution: {integrity: sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==}
/eslint-import-resolver-typescript@3.5.4(eslint-plugin-import@2.27.5)(eslint@8.34.0):
resolution: {integrity: sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
eslint: '*'
eslint-plugin-import: '*'
dependencies:
debug: 4.3.4
enhanced-resolve: 5.10.0
enhanced-resolve: 5.12.0
eslint: 8.34.0
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.56.0)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0)
get-tsconfig: 4.2.0
globby: 13.1.2
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-typescript@3.5.4)(eslint@8.34.0)
get-tsconfig: 4.5.0
globby: 13.1.3
is-core-module: 2.11.0
is-glob: 4.0.3
synckit: 0.8.4
synckit: 0.8.5
transitivePeerDependencies:
- supports-color
dev: true
/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.56.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0):
/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.4)(eslint@8.34.0):
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
@ -7340,11 +7361,11 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
debug: 3.2.7(supports-color@5.5.0)
eslint: 8.34.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 3.5.3(eslint-plugin-import@2.27.5)(eslint@8.34.0)
eslint-import-resolver-typescript: 3.5.4(eslint-plugin-import@2.27.5)(eslint@8.34.0)
transitivePeerDependencies:
- supports-color
dev: true
@ -7379,7 +7400,7 @@ packages:
ignore: 5.2.4
dev: true
/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.56.0)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0):
/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-typescript@3.5.4)(eslint@8.34.0):
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
engines: {node: '>=4'}
peerDependencies:
@ -7389,7 +7410,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.56.0(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/parser': 5.57.0(eslint@8.34.0)(typescript@5.0.2)
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
@ -7397,7 +7418,7 @@ packages:
doctrine: 2.1.0
eslint: 8.34.0
eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.56.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.3)(eslint@8.34.0)
eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.4)(eslint@8.34.0)
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
@ -7540,7 +7561,7 @@ packages:
eslint: '>=8.28.0'
dependencies:
'@babel/helper-validator-identifier': 7.19.1
'@eslint-community/eslint-utils': 4.3.0(eslint@8.34.0)
'@eslint-community/eslint-utils': 4.1.2(eslint@8.34.0)
ci-info: 3.8.0
clean-regexp: 1.0.0
eslint: 8.34.0
@ -7558,7 +7579,7 @@ packages:
strip-indent: 3.0.0
dev: true
/eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.56.0)(eslint@8.34.0):
/eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.57.0)(eslint@8.34.0):
resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7568,7 +7589,7 @@ packages:
'@typescript-eslint/eslint-plugin':
optional: true
dependencies:
'@typescript-eslint/eslint-plugin': 5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.34.0)(typescript@5.0.2)
'@typescript-eslint/eslint-plugin': 5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.34.0)(typescript@5.0.2)
eslint: 8.34.0
eslint-rule-composer: 0.3.0
dev: true
@ -8110,7 +8131,7 @@ packages:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
dependencies:
graceful-fs: 4.2.10
graceful-fs: 4.2.9
jsonfile: 6.1.0
universalify: 2.0.0
dev: true
@ -8232,8 +8253,8 @@ packages:
get-intrinsic: 1.1.3
dev: true
/get-tsconfig@4.2.0:
resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==}
/get-tsconfig@4.5.0:
resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==}
dev: true
/git-raw-commits@2.0.11:
@ -8366,8 +8387,8 @@ packages:
slash: 3.0.0
dev: true
/globby@13.1.2:
resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==}
/globby@13.1.3:
resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
dir-glob: 3.0.1
@ -8419,6 +8440,10 @@ packages:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: true
/graceful-fs@4.2.9:
resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==}
dev: true
/grapheme-splitter@1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
@ -8535,6 +8560,11 @@ packages:
space-separated-tokens: 1.1.5
dev: true
/helmet@6.0.1:
resolution: {integrity: sha512-8wo+VdQhTMVBMCITYZaGTbE4lvlthelPYSvoyNvk4RECTmrVjMerp9RfUOQXZWLvCcAn1pKj7ZRxK4lI9Alrcw==}
engines: {node: '>=14.0.0'}
dev: false
/hexoid@1.0.0:
resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==}
engines: {node: '>=8'}
@ -9046,7 +9076,13 @@ packages:
resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
hasBin: true
dependencies:
ci-info: 3.8.0
ci-info: 3.5.0
dev: true
/is-core-module@2.10.0:
resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
dependencies:
has: 1.0.3
dev: true
/is-core-module@2.11.0:
@ -9922,7 +9958,7 @@ packages:
'@jest/types': 29.5.0
'@types/node': 18.11.18
chalk: 4.1.2
ci-info: 3.5.0
ci-info: 3.8.0
graceful-fs: 4.2.10
picomatch: 2.3.1
dev: true
@ -10259,6 +10295,13 @@ packages:
koa-compose: 4.1.0
dev: false
/koa-helmet@7.0.2:
resolution: {integrity: sha512-AvzS6VuEfFgbAm0mTUnkk/BpMarMcs5A56g+f0sfrJ6m63wII48d2GDrnUQGp0Nj+RR950vNtgqXm9UJSe7GOg==}
engines: {node: '>= 14.0.0'}
dependencies:
helmet: 6.0.1
dev: false
/koa-is-json@1.0.0:
resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==}
dev: false
@ -10679,7 +10722,7 @@ packages:
/lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
dependencies:
tslib: 2.4.1
tslib: 2.5.0
dev: false
/lowercase-keys@1.0.1:
@ -11428,7 +11471,7 @@ packages:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
dependencies:
lower-case: 2.0.2
tslib: 2.4.1
tslib: 2.5.0
dev: false
/node-addon-api@3.2.1:
@ -11544,7 +11587,7 @@ packages:
engines: {node: '>=10'}
dependencies:
hosted-git-info: 4.1.0
is-core-module: 2.11.0
is-core-module: 2.10.0
semver: 7.3.8
validate-npm-package-license: 3.0.4
dev: true
@ -13224,6 +13267,9 @@ packages:
/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
/regenerator-runtime@0.13.9:
resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
/regexp-tree@0.1.24:
resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==}
hasBin: true
@ -13861,7 +13907,7 @@ packages:
engines: {node: '>=6'}
hasBin: true
dependencies:
array.prototype.flat: 1.3.1
array.prototype.flat: 1.3.0
breakword: 1.0.5
grapheme-splitter: 1.0.4
strip-ansi: 6.0.1
@ -14394,12 +14440,12 @@ packages:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
/synckit@0.8.4:
resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==}
/synckit@0.8.5:
resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
'@pkgr/utils': 2.3.1
tslib: 2.4.1
tslib: 2.5.0
dev: true
/table@5.4.6:
@ -14695,6 +14741,9 @@ packages:
/tslib@2.4.1:
resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
/tslib@2.5.0:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
/tsscmp@1.0.6:
resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
engines: {node: '>=0.6.x'}