rename permissions and add admin image list

This commit is contained in:
rubikscraft
2022-05-04 21:25:52 +02:00
parent dce72d0680
commit 80b60595fe
22 changed files with 258 additions and 218 deletions

View File

@@ -3,22 +3,22 @@ import { InjectRepository } from '@nestjs/typeorm';
import * as bcrypt from 'bcrypt';
import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.dto';
import {
AsyncFailable,
Fail,
HasFailed,
HasSuccess
AsyncFailable,
Fail,
HasFailed,
HasSuccess
} from 'picsur-shared/dist/types';
import { makeUnique } from 'picsur-shared/dist/util/unique';
import { Repository } from 'typeorm';
import { Permissions } from '../../models/constants/permissions.const';
import {
DefaultRolesList,
SoulBoundRolesList
DefaultRolesList,
SoulBoundRolesList
} from '../../models/constants/roles.const';
import {
ImmutableUsersList,
LockedLoginUsersList,
UndeletableUsersList
ImmutableUsersList,
LockedLoginUsersList,
UndeletableUsersList
} from '../../models/constants/special-users.const';
import { EUserBackend } from '../../models/entities/user.entity';
import { GetCols } from '../../models/util/collection';

View File

@@ -1,7 +1,13 @@
import { SetMetadata, UseGuards } from '@nestjs/common';
import {
createParamDecorator,
ExecutionContext,
SetMetadata,
UseGuards
} from '@nestjs/common';
import { CombineFCDecorators } from 'picsur-shared/dist/util/decorator';
import { LocalAuthGuard } from '../managers/auth/guards/local-auth.guard';
import { Permissions } from '../models/constants/permissions.const';
import { Permission, Permissions } from '../models/constants/permissions.const';
import AuthFasityRequest from '../models/interfaces/authrequest.dto';
export const RequiredPermissions = (...permissions: Permissions) => {
return SetMetadata('permissions', permissions);
@@ -16,3 +22,27 @@ export const UseLocalAuth = (...permissions: Permissions) =>
RequiredPermissions(...permissions),
UseGuards(LocalAuthGuard),
);
export const HasPermission = createParamDecorator(
(data: Permission, ctx: ExecutionContext) => {
const req: AuthFasityRequest = ctx.switchToHttp().getRequest();
const permissions = req.userPermissions;
if (!permissions) {
throw new Error('Permissions are missing from request');
}
return permissions.includes(data);
},
);
export const GetPermissions = createParamDecorator(
(data: Permission, ctx: ExecutionContext) => {
const req: AuthFasityRequest = ctx.switchToHttp().getRequest();
const permissions = req.userPermissions;
if (!permissions) {
throw new Error('Permissions are missing from request');
}
return permissions;
},
);

View File

@@ -58,6 +58,8 @@ export class MainAuthGuard extends AuthGuard(['jwt', 'guest']) {
throw new InternalServerErrorException();
}
context.switchToHttp().getRequest().userPermissions = userPermissions;
if (permissions.every((permission) => userPermissions.includes(permission)))
return true;
else throw new ForbiddenException('Permission denied');

View File

@@ -1,7 +1,9 @@
import { FastifyRequest } from 'fastify';
import { EUser } from 'picsur-shared/dist/entities/user.entity';
import { Permissions } from '../constants/permissions.const';
// Add typing to FastifyRequest to make using the user object easier
export default interface AuthFasityRequest extends FastifyRequest {
user: EUser;
userPermissions?: Permissions;
}

View File

@@ -1,17 +1,17 @@
import {
Body,
Controller,
Get,
InternalServerErrorException,
Logger,
Param,
Post
Body,
Controller,
Get,
InternalServerErrorException,
Logger,
Param,
Post
} from '@nestjs/common';
import {
GetPreferenceResponse,
MultiplePreferencesResponse,
UpdatePreferenceRequest,
UpdatePreferenceResponse
GetPreferenceResponse,
MultiplePreferencesResponse,
UpdatePreferenceRequest,
UpdatePreferenceResponse
} from 'picsur-shared/dist/dto/api/pref.dto';
import { HasFailed } from 'picsur-shared/dist/types';
import { SysPreferenceService } from '../../../collections/preference-db/sys-preference-db.service';
@@ -20,7 +20,7 @@ import { Returns } from '../../../decorators/returns.decorator';
import { Permission } from '../../../models/constants/permissions.const';
@Controller('api/pref/sys')
@RequiredPermissions(Permission.SysPrefManage)
@RequiredPermissions(Permission.SysPrefAdmin)
export class SysPrefController {
private readonly logger = new Logger('SysPrefController');

View File

@@ -1,22 +1,22 @@
import {
Body,
Controller,
Get,
InternalServerErrorException,
Logger,
Post
Body,
Controller,
Get,
InternalServerErrorException,
Logger,
Post
} from '@nestjs/common';
import {
RoleCreateRequest,
RoleCreateResponse,
RoleDeleteRequest,
RoleDeleteResponse,
RoleInfoRequest,
RoleInfoResponse,
RoleListResponse,
RoleUpdateRequest,
RoleUpdateResponse,
SpecialRolesResponse
RoleCreateRequest,
RoleCreateResponse,
RoleDeleteRequest,
RoleDeleteResponse,
RoleInfoRequest,
RoleInfoResponse,
RoleListResponse,
RoleUpdateRequest,
RoleUpdateResponse,
SpecialRolesResponse
} from 'picsur-shared/dist/dto/api/roles.dto';
import { HasFailed } from 'picsur-shared/dist/types';
import { RolesService } from '../../../collections/role-db/role-db.service';
@@ -25,15 +25,15 @@ import { RequiredPermissions } from '../../../decorators/permissions.decorator';
import { Returns } from '../../../decorators/returns.decorator';
import { Permission } from '../../../models/constants/permissions.const';
import {
DefaultRolesList,
ImmutableRolesList,
SoulBoundRolesList,
UndeletableRolesList
DefaultRolesList,
ImmutableRolesList,
SoulBoundRolesList,
UndeletableRolesList
} from '../../../models/constants/roles.const';
import { isPermissionsArray } from '../../../models/validators/permissions.validator';
@Controller('api/roles')
@RequiredPermissions(Permission.RoleManage)
@RequiredPermissions(Permission.RoleAdmin)
export class RolesController {
private readonly logger = new Logger('RolesController');

View File

@@ -6,7 +6,6 @@ import {
Logger,
Post
} from '@nestjs/common';
import { PagedRequest } from 'picsur-shared/dist/dto/api/common.dto';
import {
GetSpecialUsersResponse,
UserCreateRequest,
@@ -15,6 +14,7 @@ import {
UserDeleteResponse,
UserInfoRequest,
UserInfoResponse,
UserListRequest,
UserListResponse,
UserUpdateRequest,
UserUpdateResponse
@@ -32,15 +32,17 @@ import {
import { EUserBackend2EUser } from '../../../models/transformers/user.transformer';
@Controller('api/user')
@RequiredPermissions(Permission.UserManage)
export class UserManageController {
private readonly logger = new Logger('UserManageController');
@RequiredPermissions(Permission.UserAdmin)
export class UserAdminController {
private readonly logger = new Logger('UserAdminController');
constructor(private usersService: UsersService) {}
@Post('list')
@Returns(UserListResponse)
async listUsersPaged(@Body() body: PagedRequest): Promise<UserListResponse> {
async listUsersPaged(
@Body() body: UserListRequest,
): Promise<UserListResponse> {
const users = await this.usersService.findMany(body.count, body.page);
if (HasFailed(users)) {
this.logger.warn(users.getReason());

View File

@@ -1,10 +1,10 @@
import { Module } from '@nestjs/common';
import { AuthManagerModule } from '../../../managers/auth/auth.module';
import { UserManageController } from './user-manage.controller';
import { UserAdminController } from './user-manage.controller';
import { UserController } from './user.controller';
@Module({
imports: [AuthManagerModule],
controllers: [UserController, UserManageController],
controllers: [UserController, UserAdminController],
})
export class UserApiModule {}

View File

@@ -5,12 +5,18 @@ import {
Logger,
Post
} from '@nestjs/common';
import { PagedRequest } from 'picsur-shared/dist/dto/api/common.dto';
import { ImageListResponse, ImageUploadResponse } from 'picsur-shared/dist/dto/api/image-manage.dto';
import {
ImageListRequest,
ImageListResponse,
ImageUploadResponse
} from 'picsur-shared/dist/dto/api/image-manage.dto';
import { Permission } from 'picsur-shared/dist/dto/permissions.dto';
import { HasFailed } from 'picsur-shared/dist/types';
import { MultiPart } from '../../decorators/multipart/multipart.decorator';
import { RequiredPermissions } from '../../decorators/permissions.decorator';
import {
HasPermission,
RequiredPermissions
} from '../../decorators/permissions.decorator';
import { ReqUserID } from '../../decorators/request-user.decorator';
import { Returns } from '../../decorators/returns.decorator';
import { ImageManagerService } from '../../managers/image/image.service';
@@ -41,12 +47,17 @@ export class ImageManageController {
return image;
}
@Post('my/list')
@Post('list')
@Returns(ImageListResponse)
async listUsersPaged(
@Body() body: PagedRequest,
async listMyImagesPaged(
@Body() body: ImageListRequest,
@ReqUserID() userid: string,
@HasPermission(Permission.ImageAdmin) isImageAdmin: boolean,
): Promise<ImageListResponse> {
if (!isImageAdmin) {
body.user_id = userid;
}
const images = await this.imagesService.findMany(
body.count,
body.page,

View File

@@ -51,7 +51,9 @@ export class PermissionGuard implements CanActivate, CanActivateChild {
this.allPermissionsArray !== null &&
!isPermissionsArray(requiredPermissions, this.allPermissionsArray)
) {
this.logger.error(`Permissions array is invalid: ${requiredPermissions}`);
this.logger.error(
`Permissions array is invalid: "${requiredPermissions}" (available: ${this.allPermissionsArray})`
);
return false;
}

View File

@@ -12,8 +12,8 @@ export const UIFriendlyPermissions: {
[Permission.Settings]: 'View settings',
[Permission.ImageManage]: 'Manage All Images',
[Permission.UserManage]: 'Manage users',
[Permission.RoleManage]: 'Manage roles',
[Permission.SysPrefManage]: 'Manage system',
[Permission.ImageAdmin]: 'Image Admin',
[Permission.UserAdmin]: 'User Admin',
[Permission.RoleAdmin]: 'Role Admin',
[Permission.SysPrefAdmin]: 'System Admin',
};

View File

@@ -35,7 +35,7 @@ const SettingsRoutes: PRoutes = [
path: 'users',
loadChildren: () => SettingsUsersRouteModule,
data: {
permissions: [Permission.UserManage],
permissions: [Permission.UserAdmin],
page: {
title: 'Users',
icon: 'people_outline',
@@ -47,7 +47,7 @@ const SettingsRoutes: PRoutes = [
path: 'roles',
loadChildren: () => SettingsRolesRouteModule,
data: {
permissions: [Permission.RoleManage],
permissions: [Permission.RoleAdmin],
page: {
title: 'Roles',
icon: 'admin_panel_settings',
@@ -59,7 +59,7 @@ const SettingsRoutes: PRoutes = [
path: 'system',
loadChildren: () => SettingsSysprefRouteModule,
data: {
permissions: [Permission.SysPrefManage],
permissions: [Permission.SysPrefAdmin],
page: {
title: 'System Settings',
icon: 'tune',

View File

@@ -8,7 +8,7 @@ import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto';
import { UpdateUserControl } from 'src/app/models/forms/update-user.control';
import { RolesService } from 'src/app/services/api/roles.service';
import { StaticInfoService } from 'src/app/services/api/static-info.service';
import { UserManageService } from 'src/app/services/api/user-manage.service';
import { UserAdminService } from 'src/app/services/api/user-manage.service';
import { Logger } from 'src/app/services/logger/logger.service';
import { UtilService } from 'src/app/util/util-module/util.service';
@@ -45,7 +45,7 @@ export class SettingsUsersEditComponent implements OnInit {
constructor(
private route: ActivatedRoute,
private router: Router,
private userManageService: UserManageService,
private userManageService: UserAdminService,
private utilService: UtilService,
private rolesService: RolesService,
private staticInfo: StaticInfoService

View File

@@ -7,7 +7,7 @@ import { HasFailed } from 'picsur-shared/dist/types';
import { BehaviorSubject, Subject } from 'rxjs';
import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto';
import { StaticInfoService } from 'src/app/services/api/static-info.service';
import { UserManageService } from 'src/app/services/api/user-manage.service';
import { UserAdminService } from 'src/app/services/api/user-manage.service';
import { Logger } from 'src/app/services/logger/logger.service';
import { Throttle } from 'src/app/util/throttle';
import { UtilService } from 'src/app/util/util-module/util.service';
@@ -33,7 +33,7 @@ export class SettingsUsersComponent implements OnInit {
constructor(
public utilService: UtilService,
private userManageService: UserManageService,
private userManageService: UserAdminService,
private staticInfo: StaticInfoService,
private router: Router
) {}

View File

@@ -1,14 +1,13 @@
import { Injectable } from '@angular/core';
import {
ImageMetaResponse,
ImageUploadResponse
} from 'picsur-shared/dist/dto/api/image.dto';
import { ImageUploadResponse } from 'picsur-shared/dist/dto/api/image-manage.dto';
import { ImageMetaResponse } from 'picsur-shared/dist/dto/api/image.dto';
import { ImageLinks } from 'picsur-shared/dist/dto/image-links.dto';
import { Mime2Ext } from 'picsur-shared/dist/dto/mimes.dto';
import { AsyncFailable } from 'picsur-shared/dist/types';
import { Open } from 'picsur-shared/dist/types/failable';
import { ImageUploadRequest } from '../../models/dto/image-upload-request.dto';
import { ApiService } from './api.service';
@Injectable({
providedIn: 'root',
})

View File

@@ -1,15 +1,15 @@
import { Injectable } from '@angular/core';
import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator';
import {
GetPreferenceResponse,
MultiplePreferencesResponse,
UpdatePreferenceRequest,
UpdatePreferenceResponse
GetPreferenceResponse,
MultiplePreferencesResponse,
UpdatePreferenceRequest,
UpdatePreferenceResponse
} from 'picsur-shared/dist/dto/api/pref.dto';
import { Permission } from 'picsur-shared/dist/dto/permissions.dto';
import {
DecodedPref,
PrefValueType
DecodedPref,
PrefValueType
} from 'picsur-shared/dist/dto/preferences.dto';
import { AsyncFailable, Fail, HasFailed, Map } from 'picsur-shared/dist/types';
import { BehaviorSubject } from 'rxjs';
@@ -130,7 +130,7 @@ export class SysPrefService {
.pipe(Throttle(300))
.subscribe((permissions) => {
const oldHasPermission = this.hasPermission;
this.hasPermission = permissions.includes(Permission.SysPrefManage);
this.hasPermission = permissions.includes(Permission.SysPrefAdmin);
if (!this.hasPermission) {
this.flush();
}

View File

@@ -1,15 +1,15 @@
import { Injectable } from '@angular/core';
import {
UserCreateRequest,
UserCreateResponse,
UserDeleteRequest,
UserDeleteResponse,
UserInfoRequest,
UserInfoResponse,
UserListRequest,
UserListResponse,
UserUpdateRequest,
UserUpdateResponse
UserCreateRequest,
UserCreateResponse,
UserDeleteRequest,
UserDeleteResponse,
UserInfoRequest,
UserInfoResponse,
UserListRequest,
UserListResponse,
UserUpdateRequest,
UserUpdateResponse
} from 'picsur-shared/dist/dto/api/user-manage.dto';
import { EUser } from 'picsur-shared/dist/entities/user.entity';
import { AsyncFailable, Open } from 'picsur-shared/dist/types';
@@ -18,7 +18,7 @@ import { ApiService } from './api.service';
@Injectable({
providedIn: 'root',
})
export class UserManageService {
export class UserAdminService {
constructor(private api: ApiService) {}
public async getUser(id: string): AsyncFailable<EUser> {

View File

@@ -1,9 +0,0 @@
import { z } from 'zod';
import { createZodDto } from '../../util/create-zod-dto';
import { IsPosInt } from '../../validators/positive-int.validator';
export const PagedRequestSchema = z.object({
count: IsPosInt(),
page: IsPosInt(),
});
export class PagedRequest extends createZodDto(PagedRequestSchema) {}

View File

@@ -3,11 +3,23 @@ import { EImageSchema } from '../../entities/image.entity';
import { createZodDto } from '../../util/create-zod-dto';
import { IsPosInt } from '../../validators/positive-int.validator';
// Image upload
export const ImageUploadResponseSchema = EImageSchema;
export class ImageUploadResponse extends createZodDto(
ImageUploadResponseSchema,
) {}
// Image list
export const ImageListRequestSchema = z.object({
count: IsPosInt(),
page: IsPosInt(),
user_id: z.string().uuid().optional(),
});
export class ImageListRequest extends createZodDto(
ImageListRequestSchema,
) {}
export const ImageListResponseSchema = z.object({
images: z.array(EImageSchema),
count: IsPosInt(),

View File

@@ -8,6 +8,12 @@ import { IsStringList } from '../../validators/string-list.validator';
import { EntityIDObjectSchema } from '../id-object.dto';
// UserList
export const UserListRequestSchema = z.object({
count: IsPosInt(),
page: IsPosInt(),
});
export class UserListRequest extends createZodDto(UserListRequestSchema) {}
export const UserListResponseSchema = z.object({
users: z.array(EUserSchema),
count: IsPosInt(),

View File

@@ -12,8 +12,8 @@ export enum Permission {
Settings = 'settings', // Ability to view (personal) settings
ImageManage = 'image-manage', // Ability to manage everyones manage images
UserManage = 'user-manage', // Allow modification of users
RoleManage = 'role-manage', // Allow modification of roles
SysPrefManage = 'syspref-manage',
ImageAdmin = 'image-admin', // Ability to manage everyones manage images
UserAdmin = 'user-admin', // Allow modification of users
RoleAdmin = 'role-admin', // Allow modification of roles
SysPrefAdmin = 'syspref-admin',
}

211
yarn.lock
View File

@@ -1331,11 +1331,10 @@
secure-json-parse "^2.4.0"
stream-wormhole "^1.1.0"
"@fastify/static@^5.0.0", "fastify-static@npm:@fastify/static":
name fastify-static
version "5.0.1"
resolved "https://registry.yarnpkg.com/@fastify/static/-/static-5.0.1.tgz#6bb6b94c2b51d9fafb06261b79ed5da5038dd5a1"
integrity sha512-0lReUKWVOt2i5i1KoBLYsbcMBthq5eiEoUQrFceoXJkCv+OyA0iLl6hGxcmnMRxLsl/Netrzt1NNOpg4muCcuw==
"@fastify/static@^5.0.0", fastify-static@^4.7.0, "fastify-static@npm:@fastify/static":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@fastify/static/-/static-5.0.2.tgz#46cee887393b422f4b10a46a14e970a64dd086d4"
integrity sha512-HvyXZ5a7hUHoSBRq9jKUuKIUCkHMkCDcmiAeEmixXlGOx8pEWx3NYOIaiivcjWa6/NLvfdUT+t/jzfVQ2PA7Gw==
dependencies:
content-disposition "^0.5.3"
encoding-negotiator "^2.0.1"
@@ -1414,9 +1413,9 @@
integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==
"@jridgewell/sourcemap-codec@^1.4.10":
version "1.4.11"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
version "1.4.12"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz#7ed98f6fa525ffb7c56a2cbecb5f7bb91abd2baf"
integrity sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==
"@jridgewell/trace-mapping@^0.3.0", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.9"
@@ -1762,9 +1761,9 @@
"@types/estree" "*"
"@types/eslint@*":
version "8.4.1"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304"
integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==
version "8.4.2"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575"
integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -1794,9 +1793,9 @@
"@types/serve-static" "*"
"@types/http-proxy@^1.17.8":
version "1.17.8"
resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55"
integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==
version "1.17.9"
resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a"
integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==
dependencies:
"@types/node" "*"
@@ -1956,13 +1955,13 @@
"@types/node" "*"
"@typescript-eslint/eslint-plugin@^5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz#bfc22e0191e6404ab1192973b3b4ea0461c1e878"
integrity sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a"
integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==
dependencies:
"@typescript-eslint/scope-manager" "5.21.0"
"@typescript-eslint/type-utils" "5.21.0"
"@typescript-eslint/utils" "5.21.0"
"@typescript-eslint/scope-manager" "5.22.0"
"@typescript-eslint/type-utils" "5.22.0"
"@typescript-eslint/utils" "5.22.0"
debug "^4.3.2"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
@@ -1971,68 +1970,68 @@
tsutils "^3.21.0"
"@typescript-eslint/parser@^5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.21.0.tgz#6cb72673dbf3e1905b9c432175a3c86cdaf2071f"
integrity sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178"
integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==
dependencies:
"@typescript-eslint/scope-manager" "5.21.0"
"@typescript-eslint/types" "5.21.0"
"@typescript-eslint/typescript-estree" "5.21.0"
"@typescript-eslint/scope-manager" "5.22.0"
"@typescript-eslint/types" "5.22.0"
"@typescript-eslint/typescript-estree" "5.22.0"
debug "^4.3.2"
"@typescript-eslint/scope-manager@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz#a4b7ed1618f09f95e3d17d1c0ff7a341dac7862e"
integrity sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==
"@typescript-eslint/scope-manager@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24"
integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==
dependencies:
"@typescript-eslint/types" "5.21.0"
"@typescript-eslint/visitor-keys" "5.21.0"
"@typescript-eslint/types" "5.22.0"
"@typescript-eslint/visitor-keys" "5.22.0"
"@typescript-eslint/type-utils@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz#ff89668786ad596d904c21b215e5285da1b6262e"
integrity sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==
"@typescript-eslint/type-utils@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19"
integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==
dependencies:
"@typescript-eslint/utils" "5.21.0"
"@typescript-eslint/utils" "5.22.0"
debug "^4.3.2"
tsutils "^3.21.0"
"@typescript-eslint/types@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.21.0.tgz#8cdb9253c0dfce3f2ab655b9d36c03f72e684017"
integrity sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==
"@typescript-eslint/types@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0"
integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==
"@typescript-eslint/typescript-estree@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz#9f0c233e28be2540eaed3df050f0d54fb5aa52de"
integrity sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==
"@typescript-eslint/typescript-estree@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97"
integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==
dependencies:
"@typescript-eslint/types" "5.21.0"
"@typescript-eslint/visitor-keys" "5.21.0"
"@typescript-eslint/types" "5.22.0"
"@typescript-eslint/visitor-keys" "5.22.0"
debug "^4.3.2"
globby "^11.0.4"
is-glob "^4.0.3"
semver "^7.3.5"
tsutils "^3.21.0"
"@typescript-eslint/utils@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.21.0.tgz#51d7886a6f0575e23706e5548c7e87bce42d7c18"
integrity sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==
"@typescript-eslint/utils@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8"
integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==
dependencies:
"@types/json-schema" "^7.0.9"
"@typescript-eslint/scope-manager" "5.21.0"
"@typescript-eslint/types" "5.21.0"
"@typescript-eslint/typescript-estree" "5.21.0"
"@typescript-eslint/scope-manager" "5.22.0"
"@typescript-eslint/types" "5.22.0"
"@typescript-eslint/typescript-estree" "5.22.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
"@typescript-eslint/visitor-keys@5.21.0":
version "5.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz#453fb3662409abaf2f8b1f65d515699c888dd8ae"
integrity sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==
"@typescript-eslint/visitor-keys@5.22.0":
version "5.22.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c"
integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==
dependencies:
"@typescript-eslint/types" "5.21.0"
"@typescript-eslint/types" "5.22.0"
eslint-visitor-keys "^3.0.0"
"@webassemblyjs/ast@1.11.1":
@@ -2448,12 +2447,12 @@ atomic-sleep@^1.0.0:
integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
autoprefixer@^10.4.4:
version "10.4.6"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.6.tgz#ce6eba3aea7c03adf0f6a907bd594fd170b3f0b6"
integrity sha512-Rvzel0AZO9tJNm3ydySK80PpkWoEZTGC5bHUh/xbrP8qJCy08NFBwNGPcozy3d3SDIM0b2kNxw2K7jAIYFF01A==
version "10.4.7"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf"
integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==
dependencies:
browserslist "^4.20.3"
caniuse-lite "^1.0.30001334"
caniuse-lite "^1.0.30001335"
fraction.js "^4.2.0"
normalize-range "^0.1.2"
picocolors "^1.0.0"
@@ -2769,7 +2768,7 @@ camelcase@^5.3.1:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001334:
caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335:
version "1.0.30001335"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a"
integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==
@@ -3039,7 +3038,7 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.5.0:
cookie@0.5.0, cookie@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
@@ -3069,9 +3068,9 @@ copy-webpack-plugin@10.2.4:
serialize-javascript "^6.0.0"
core-js-compat@^3.20.2, core-js-compat@^3.21.0:
version "3.22.3"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.3.tgz#9b10d786052d042bc97ee8df9c0d1fb6a49c2005"
integrity sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==
version "3.22.4"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579"
integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==
dependencies:
browserslist "^4.20.3"
semver "7.0.0"
@@ -3185,9 +3184,9 @@ css@^3.0.0:
source-map-resolve "^0.6.0"
cssdb@^6.5.0:
version "6.6.0"
resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.0.tgz#e4562e2aaba5b23e7d9e6555ba64298990e1ba96"
integrity sha512-hXoXDYrxmAGNh+vgg39WJArCpFIaU3O2q7ud+bEobQ6Fbl2tjPasl3Wt8MKkxlNQEIZqieh0DBsz92eSKI4ghw==
version "6.6.1"
resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.1.tgz#2637fdc57eab452849488de7e8d961ec06f2fe8f"
integrity sha512-0/nZEYfp8SFEzJkMud8NxZJsGfD7RHDJti6GRBLZptIwAzco6RTx1KgwFl4mGWsYS0ZNbCrsY9QryhQ4ldF3Mg==
cssesc@^3.0.0:
version "3.0.0"
@@ -3403,9 +3402,9 @@ ee-first@1.1.1:
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.4.118:
version "1.4.129"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz#c675793885721beefff99da50f57c6525c2cd238"
integrity sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ==
version "1.4.132"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.132.tgz#b64599eb018221e52e2e4129de103b03a413c55d"
integrity sha512-JYdZUw/1068NWN+SwXQ7w6Ue0bWYGihvSUNNQwurvcDV/SM7vSiGZ3NuFvFgoEiCs4kB8xs3cX2an3wB7d4TBw==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -3958,27 +3957,6 @@ fastify-plugin@^3.0.0:
resolved "https://registry.yarnpkg.com/fastify-plugin/-/fastify-plugin-3.0.1.tgz#79e84c29f401020f38b524f59f2402103fd21ed2"
integrity sha512-qKcDXmuZadJqdTm6vlCqioEbyewF60b/0LOFCcYN1B6BIZGlYJumWWOYs70SFYLDAH4YqdE1cxH/RKMG7rFxgA==
"fastify-static-deprecated@npm:fastify-static@4.6.1":
version "4.6.1"
resolved "https://registry.yarnpkg.com/fastify-static/-/fastify-static-4.6.1.tgz#687131da76f1d4391fb8b47f71ea2118cdc85803"
integrity sha512-vy7N28U4AMhuOim12ZZWHulEE6OQKtzZbHgiB8Zj4llUuUQXPka0WHAQI3njm1jTCx4W6fixUHfpITxweMtAIA==
dependencies:
content-disposition "^0.5.3"
encoding-negotiator "^2.0.1"
fastify-plugin "^3.0.0"
glob "^7.1.4"
p-limit "^3.1.0"
readable-stream "^3.4.0"
send "^0.17.1"
fastify-static@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/fastify-static/-/fastify-static-4.7.0.tgz#e802658d69c1dcddb380b9afc2456d467a3494be"
integrity sha512-zZhCfJv/hkmud2qhWqpU3K9XVAuy3+IV8Tp9BC5J5U+GyA2XwoB6h8lh9GqpEIqdXOw01WyWQllV7dOWVyAlXg==
dependencies:
fastify-static-deprecated "npm:fastify-static@4.6.1"
process-warning "^1.0.0"
fastify@3.28.0:
version "3.28.0"
resolved "https://registry.yarnpkg.com/fastify/-/fastify-3.28.0.tgz#14d939a2f176b82af1094de7abcb0b2d83bcff8f"
@@ -4108,9 +4086,9 @@ flatted@^3.1.0:
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
follow-redirects@^1.0.0, follow-redirects@^1.14.8:
version "1.14.9"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
version "1.15.0"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4"
integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==
fork-ts-checker-webpack-plugin@7.2.3:
version "7.2.3"
@@ -4205,9 +4183,9 @@ functional-red-black-tree@^1.0.1:
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
fuse.js@^6.5.3:
version "6.5.3"
resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.5.3.tgz#7446c0acbc4ab0ab36fa602e97499bdb69452b93"
integrity sha512-sA5etGE7yD/pOqivZRBvUBd/NaL2sjAu6QuSaFoe1H2BrJSkH/T/UXAJ8CdXdw7DvY3Hs8CXKYkDWX7RiP5KOg==
version "6.6.0"
resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.0.tgz#9c0dd9337731ebc6541abf44aa3aa9bb6cb5acb6"
integrity sha512-4CvUk6GBo1b00xIcCLEoHQX3xwaYIwUX0lD8hDaYUavvSgE8aaySe9Z+fb4bdvzXXbYUfrllwN34U3wwUsG+oA==
gauge@^3.0.0:
version "3.0.2"
@@ -5071,7 +5049,7 @@ license-webpack-plugin@4.0.2:
dependencies:
webpack-sources "^3.0.0"
light-my-request@4.9.0, light-my-request@^4.2.0:
light-my-request@4.9.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.9.0.tgz#83559c7ce7e503466113e36f40a1d596a1886626"
integrity sha512-b1U3z4OVPoO/KanT14NRkXMr9rRtXAiq0ORqNrqhDyb5bGkZjAdEc6GRN1GWCfgaLBG+aq73qkCLDNeB3c2sLw==
@@ -5081,6 +5059,16 @@ light-my-request@4.9.0, light-my-request@^4.2.0:
process-warning "^1.0.0"
set-cookie-parser "^2.4.1"
light-my-request@^4.2.0:
version "4.10.1"
resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.10.1.tgz#09a93fa5af6a7b4339322b2e2b3f5d1c9679ed02"
integrity sha512-l+zWk0HXGhGzY7IYTZnYEqIpj3Mpcyk2f8+FkKUyREywvaiWCf2jyQVxpasKRsploY/nVpoqTlxx72CIeQNcIQ==
dependencies:
ajv "^8.1.0"
cookie "^0.5.0"
process-warning "^1.0.0"
set-cookie-parser "^2.4.1"
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@@ -5355,12 +5343,7 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
"minimist@npm:minimist-lite":
minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, "minimist@npm:minimist-lite":
version "2.2.1"
resolved "https://registry.yarnpkg.com/minimist-lite/-/minimist-lite-2.2.1.tgz#abb71db2c9b454d7cf4496868c03e9802de9934d"
integrity sha512-RSrWIRWGYoM2TDe102s7aIyeSipXMIXKb1fSHYx1tAbxAV0z4g2xR6ra3oPzkTqFb0EIUz1H3A/qvYYeDd+/qQ==
@@ -5492,9 +5475,9 @@ nan@^2.14.x:
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
nanoid@^3.3.1, nanoid@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
napi-build-utils@^1.0.1:
version "1.0.2"
@@ -5670,9 +5653,9 @@ npm-package-arg@9.0.2, npm-package-arg@^9.0.0, npm-package-arg@^9.0.1:
validate-npm-package-name "^4.0.0"
npm-packlist@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.0.2.tgz#a5eb2503faec92ad6853a2bbb2231dced6cfc549"
integrity sha512-jLhcNisUgpz6v2KC75qSeEYAM8UBMYjQ2OhlCOJjB4Ovu7XXnD25UqZ6hOQNeGShL/2ju3LL2E/zBbsuzkIQ8w==
version "5.0.3"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.0.3.tgz#0aec03bc2d6d488ca71396d7afb463563c3274f7"
integrity sha512-KuSbzgejxdsAWbNNyEs8EsyDHsO+nJF6k+9WuWzFbSNh5tFHs4lDApXw7kntKpuehfp8lKRzJkMtz0+WmGvTIw==
dependencies:
glob "^8.0.1"
ignore-walk "^5.0.1"