diff --git a/.yarn/versions/6db1bf03.yml b/.yarn/versions/6db1bf03.yml new file mode 100644 index 00000000..31906507 --- /dev/null +++ b/.yarn/versions/6db1bf03.yml @@ -0,0 +1,4 @@ +undecided: + - root-workspace-0b6124 + - picsur-backend + - picsur-frontend diff --git a/.yarnrc.yml b/.yarnrc.yml index 9d453bd3..4705dcfe 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -2,8 +2,8 @@ nodeLinker: node-modules plugins: - path: .yarn/plugins/@yarnpkg/plugin-version.cjs - spec: "@yarnpkg/plugin-version" + spec: '@yarnpkg/plugin-version' - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs - spec: "@yarnpkg/plugin-workspace-tools" + spec: '@yarnpkg/plugin-workspace-tools' yarnPath: .yarn/releases/yarn-berry.cjs diff --git a/README.md b/README.md index f4cd3712..d2d3557a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ But it does function, so feel free to give it a try. ## Demo -You can view a live demo here: +You can view a live demo here: The images are deleted every five minutes, and the maximum filesize is 16MB. But it should give you an indication of how it works. @@ -57,9 +57,9 @@ Every featured marked here should work in the latest release. - [x] Proper DB migrations - [x] Show own images in list - [x] Correct previews on chats -- [X] Expiring images -- [X] ShareX endpoint -- [X] Arm64 image +- [x] Expiring images +- [x] ShareX endpoint +- [x] ARM64 and AMD64 Docker image - [ ] White mode - [ ] Public gallery @@ -74,6 +74,12 @@ If you like this project, don't forget to give it a star. It tells me that I'm n ## Faq +### Is this project maintained? + +Yes it still is. If I were to stop maintaining it, I would archive the repository. + +However I do not have a lot of time on my hands, so updates are not always as frequent as I would like them to be. + ### Why do my images dissapear of the public instance? The public instance is only a demo, and therefore only keeps images for 5 minutes. This is to prevent the server from running out of disk space, and to prevent people from using it to host questionable images. @@ -150,6 +156,10 @@ volumes: picsur-data: ``` +## Thanks + +- @awg13 for donating 5$ + ## Api Here is a usually up to date documentation of the api: diff --git a/backend/package.json b/backend/package.json index 24c2f2a8..65e9566b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "picsur-backend", - "version": "0.4.1", + "version": "0.5.0", "description": "Backend for Picsur", "license": "GPL-3.0", "repository": "https://github.com/rubikscraft/Picsur", @@ -22,65 +22,69 @@ "purge": "rm -rf dist && rm -rf node_modules" }, "dependencies": { - "@fastify/helmet": "^10.0.1", - "@fastify/multipart": "^7.2.0", - "@fastify/static": "^6.5.0", - "@nestjs/common": "^9.1.4", + "@fastify/helmet": "^10.1.0", + "@fastify/multipart": "^7.3.0", + "@fastify/reply-from": "^8.3.1", + "@fastify/static": "^6.6.0", + "@nestjs/common": "^9.2.1", "@nestjs/config": "^2.2.0", - "@nestjs/core": "^9.1.4", + "@nestjs/core": "^9.2.1", "@nestjs/jwt": "^9.0.0", "@nestjs/passport": "^9.0.0", - "@nestjs/platform-fastify": "^9.1.4", + "@nestjs/platform-fastify": "^9.2.1", + "@nestjs/schedule": "^2.1.0", "@nestjs/serve-static": "^3.0.0", + "@nestjs/throttler": "^3.1.0", "@nestjs/typeorm": "^9.0.1", "bcrypt": "^5.1.0", "bmp-img": "^1.2.1", "cors": "^2.8.5", "file-type": "^18.0.0", + "is-docker": "^3.0.0", "ms": "^2.1.3", + "node-fetch": "^3.2.10", "p-timeout": "^6.0.0", "passport": "^0.6.0", "passport-headerapikey": "^1.2.2", - "passport-jwt": "^4.0.0", + "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "passport-strategy": "^1.0.0", "pg": "^8.8.0", "picsur-shared": "*", "posix.js": "^0.1.1", - "qoi-img": "^2.1.0", + "qoi-img": "^2.1.1", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.5.7", - "sharp": "^0.31.1", + "rxjs": "^7.8.0", + "sharp": "^0.31.3", "stream-parser": "^0.3.1", "thunks": "^4.9.6", - "typeorm": "0.3.10", - "zod": "^3.19.1" + "typeorm": "0.3.11", + "zod": "^3.20.2" }, "devDependencies": { - "@nestjs/cli": "^9.1.4", + "@nestjs/cli": "^9.1.5", "@nestjs/schematics": "^9.0.3", - "@nestjs/testing": "^9.1.4", + "@nestjs/testing": "^9.2.1", "@types/bcrypt": "^5.0.0", - "@types/cors": "^2.8.12", - "@types/ms": "^0.7.31", + "@types/cors": "^2.8.13", "@types/multer": "^1.4.7", - "@types/node": "^18.8.4", - "@types/passport-jwt": "^3.0.7", + "@types/node": "^18.11.17", + "@types/passport-jwt": "^3.0.8", "@types/passport-local": "^1.0.34", "@types/passport-strategy": "^0.2.35", "@types/sharp": "^0.31.0", "@types/supertest": "^2.0.12", - "@typescript-eslint/eslint-plugin": "^5.40.0", - "@typescript-eslint/parser": "^5.40.0", - "eslint": "^8.25.0", + "@typescript-eslint/eslint-plugin": "^5.47.0", + "@typescript-eslint/parser": "^5.47.0", + "eslint": "^8.30.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", + "prettier": "^2.8.1", "source-map-support": "^0.5.21", - "ts-loader": "^9.4.1", + "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "tsconfig-paths": "^4.1.0", - "typescript": "4.8.4" + "tsconfig-paths": "^4.1.1", + "typescript": "^4.9.4" } } diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index be513efd..2db11b06 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -1,13 +1,16 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; +import { ScheduleModule } from '@nestjs/schedule'; import { ServeStaticModule } from '@nestjs/serve-static'; import cors from 'cors'; import { IncomingMessage, ServerResponse } from 'http'; import { EarlyConfigModule } from './config/early/early-config.module'; import { ServeStaticConfigService } from './config/early/serve-static.config.service'; import { DatabaseModule } from './database/database.module'; +import { PicsurLayersModule } from './layers/PicsurLayers.module'; import { PicsurLoggerModule } from './logger/logger.module'; import { AuthManagerModule } from './managers/auth/auth.module'; import { DemoManagerModule } from './managers/demo/demo.module'; +import { UsageManagerModule } from './managers/usage/usage.module'; import { PicsurRoutesModule } from './routes/routes.module'; const mainCorsConfig = cors({ @@ -41,10 +44,13 @@ const imageCorsOverride = ( useExisting: ServeStaticConfigService, imports: [EarlyConfigModule], }), + ScheduleModule.forRoot(), DatabaseModule, AuthManagerModule, + UsageManagerModule, DemoManagerModule, PicsurRoutesModule, + PicsurLayersModule, ], }) export class AppModule implements NestModule { diff --git a/backend/src/collections/apikey-db/apikey-db.service.ts b/backend/src/collections/apikey-db/apikey-db.service.ts index 85d089b8..ae6a3197 100644 --- a/backend/src/collections/apikey-db/apikey-db.service.ts +++ b/backend/src/collections/apikey-db/apikey-db.service.ts @@ -5,7 +5,7 @@ import { FindResult } from 'picsur-shared/dist/types/find-result'; import { generateRandomString } from 'picsur-shared/dist/util/random'; import { Repository } from 'typeorm'; import { EApiKeyBackend } from '../../database/entities/apikey.entity'; -import { EUserBackend } from '../../database/entities/user.entity'; +import { EUserBackend } from '../../database/entities/users/user.entity'; @Injectable() export class ApiKeyDbService { diff --git a/backend/src/collections/image-db/image-db.module.ts b/backend/src/collections/image-db/image-db.module.ts index 48e51f53..c19ed1d4 100644 --- a/backend/src/collections/image-db/image-db.module.ts +++ b/backend/src/collections/image-db/image-db.module.ts @@ -1,8 +1,8 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { EImageDerivativeBackend } from '../../database/entities/image-derivative.entity'; -import { EImageFileBackend } from '../../database/entities/image-file.entity'; -import { EImageBackend } from '../../database/entities/image.entity'; +import { EImageDerivativeBackend } from '../../database/entities/images/image-derivative.entity'; +import { EImageFileBackend } from '../../database/entities/images/image-file.entity'; +import { EImageBackend } from '../../database/entities/images/image.entity'; import { ImageDBService } from './image-db.service'; import { ImageFileDBService } from './image-file-db.service'; diff --git a/backend/src/collections/image-db/image-db.service.ts b/backend/src/collections/image-db/image-db.service.ts index 2e0c473b..870b07ba 100644 --- a/backend/src/collections/image-db/image-db.service.ts +++ b/backend/src/collections/image-db/image-db.service.ts @@ -4,7 +4,7 @@ import { AsyncFailable, Fail, FT } from 'picsur-shared/dist/types'; import { FindResult } from 'picsur-shared/dist/types/find-result'; import { generateRandomString } from 'picsur-shared/dist/util/random'; import { In, LessThan, Repository } from 'typeorm'; -import { EImageBackend } from '../../database/entities/image.entity'; +import { EImageBackend } from '../../database/entities/images/image.entity'; @Injectable() export class ImageDBService { @@ -83,6 +83,14 @@ export class ImageDBService { } } + public async count(): AsyncFailable { + try { + return await this.imageRepo.count(); + } catch (e) { + return Fail(FT.Database, e); + } + } + public async update( id: string, userid: string | undefined, diff --git a/backend/src/collections/image-db/image-file-db.service.ts b/backend/src/collections/image-db/image-file-db.service.ts index dbf692b0..7991a39b 100644 --- a/backend/src/collections/image-db/image-file-db.service.ts +++ b/backend/src/collections/image-db/image-file-db.service.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { ImageEntryVariant } from 'picsur-shared/dist/dto/image-entry-variant.enum'; -import { AsyncFailable, Fail, FT } from 'picsur-shared/dist/types'; +import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types'; import { LessThan, Repository } from 'typeorm'; -import { EImageDerivativeBackend } from '../../database/entities/image-derivative.entity'; -import { EImageFileBackend } from '../../database/entities/image-file.entity'; +import { EImageDerivativeBackend } from '../../database/entities/images/image-derivative.entity'; +import { EImageFileBackend } from '../../database/entities/images/image-file.entity'; const A_DAY_IN_SECONDS = 24 * 60 * 60; @@ -57,6 +57,40 @@ export class ImageFileDBService { } } + public async migrateFile( + imageId: string, + sourceVariant: ImageEntryVariant, + targetVariant: ImageEntryVariant, + ): AsyncFailable { + try { + const sourceFile = await this.getFile(imageId, sourceVariant); + if (HasFailed(sourceFile)) return sourceFile; + + sourceFile.variant = targetVariant; + return await this.imageFileRepo.save(sourceFile); + } catch (e) { + return Fail(FT.Database, e); + } + } + + public async deleteFile( + imageId: string, + variant: ImageEntryVariant, + ): AsyncFailable { + try { + const found = await this.imageFileRepo.findOne({ + where: { image_id: imageId, variant: variant }, + }); + + if (!found) return Fail(FT.NotFound, 'Image not found'); + + await this.imageFileRepo.delete({ image_id: imageId, variant: variant }); + return found; + } catch (e) { + return Fail(FT.Database, e); + } + } + // This is useful because you dont have to pull the whole image file public async getFileTypes( imageId: string, @@ -129,7 +163,7 @@ export class ImageFileDBService { ): AsyncFailable { try { const result = await this.imageDerivativeRepo.delete({ - last_read: LessThan(new Date()), + last_read: LessThan(new Date(Date.now() - olderThanSeconds * 1000)), }); return result.affected ?? 0; diff --git a/backend/src/collections/preference-db/preference-common.service.ts b/backend/src/collections/preference-db/preference-common.service.ts index 484ee963..8c5b0520 100644 --- a/backend/src/collections/preference-db/preference-common.service.ts +++ b/backend/src/collections/preference-db/preference-common.service.ts @@ -17,8 +17,8 @@ type EnumValue = E[keyof E]; type PrefValueTypeType = { [key in EnumValue]: PrefValueTypeStrings; }; -type EncodedPref = { - key: string; +type EncodedPref = { + key: EnumValue; value: string; }; @@ -32,7 +32,7 @@ export class PreferenceCommonService { // E is either the SysPreference or the UsrPreference enum // the pref value types is the object containing the type of each key in E public DecodePref( - preference: EncodedPref, + preference: EncodedPref, prefType: E, prefValueTypes: PrefValueTypeType, ): Failable { @@ -69,7 +69,7 @@ export class PreferenceCommonService { value: PrefValueType, prefType: E, prefValueTypes: PrefValueTypeType, - ): AsyncFailable { + ): AsyncFailable> { const validatedKey = this.validatePrefKey(key, prefType); if (HasFailed(validatedKey)) return validatedKey; diff --git a/backend/src/collections/preference-db/preference-db.module.ts b/backend/src/collections/preference-db/preference-db.module.ts index 34ca89b8..8f932ed4 100644 --- a/backend/src/collections/preference-db/preference-db.module.ts +++ b/backend/src/collections/preference-db/preference-db.module.ts @@ -1,8 +1,8 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EarlyConfigModule } from '../../config/early/early-config.module'; -import { ESysPreferenceBackend } from '../../database/entities/sys-preference.entity'; -import { EUsrPreferenceBackend } from '../../database/entities/usr-preference.entity'; +import { ESysPreferenceBackend } from '../../database/entities/system/sys-preference.entity'; +import { EUsrPreferenceBackend } from '../../database/entities/system/usr-preference.entity'; import { PreferenceCommonService } from './preference-common.service'; import { PreferenceDefaultsService } from './preference-defaults.service'; import { SysPreferenceDbService } from './sys-preference-db.service'; diff --git a/backend/src/collections/preference-db/preference-defaults.service.ts b/backend/src/collections/preference-db/preference-defaults.service.ts index 98021a84..34105a6a 100644 --- a/backend/src/collections/preference-db/preference-defaults.service.ts +++ b/backend/src/collections/preference-db/preference-defaults.service.ts @@ -15,15 +15,17 @@ export class PreferenceDefaultsService { constructor(private readonly jwtConfigService: EarlyJwtConfigService) {} - public readonly usrDefaults: { - [key in UsrPreference]: () => PrefValueType; + private readonly usrDefaults: { + [key in UsrPreference]: (() => PrefValueType) | PrefValueType; } = { - [UsrPreference.KeepOriginal]: () => false, + [UsrPreference.KeepOriginal]: false, }; - public readonly sysDefaults: { - [key in SysPreference]: () => PrefValueType; + private readonly sysDefaults: { + [key in SysPreference]: (() => PrefValueType) | PrefValueType; } = { + [SysPreference.HostOverride]: '', + [SysPreference.JwtSecret]: () => { const envSecret = this.jwtConfigService.getJwtSecret(); if (envSecret) { @@ -37,13 +39,36 @@ export class PreferenceDefaultsService { }, [SysPreference.JwtExpiresIn]: () => this.jwtConfigService.getJwtExpiresIn() ?? '7d', - [SysPreference.BCryptStrength]: () => 12, + [SysPreference.BCryptStrength]: 10, + + [SysPreference.RemoveDerivativesAfter]: '7d', + [SysPreference.AllowEditing]: true, + + [SysPreference.ConversionTimeLimit]: '15s', + [SysPreference.ConversionMemoryLimit]: 512, - [SysPreference.RemoveDerivativesAfter]: () => '7d', - [SysPreference.SaveDerivatives]: () => true, - [SysPreference.AllowEditing]: () => true, + [SysPreference.EnableTracking]: false, + [SysPreference.TrackingUrl]: '', + [SysPreference.TrackingId]: '', - [SysPreference.ConversionTimeLimit]: () => '10s', - [SysPreference.ConversionMemoryLimit]: () => 512, + [SysPreference.EnableTelemetry]: true, }; + + public getSysDefault(pref: SysPreference): PrefValueType { + const value = this.sysDefaults[pref]; + if (typeof value === 'function') { + return value(); + } else { + return value; + } + } + + public getUsrDefault(pref: UsrPreference): PrefValueType { + const value = this.usrDefaults[pref]; + if (typeof value === 'function') { + return value(); + } else { + return value; + } + } } diff --git a/backend/src/collections/preference-db/sys-preference-db.service.ts b/backend/src/collections/preference-db/sys-preference-db.service.ts index b3305a3b..c893b159 100644 --- a/backend/src/collections/preference-db/sys-preference-db.service.ts +++ b/backend/src/collections/preference-db/sys-preference-db.service.ts @@ -5,17 +5,18 @@ import { PrefValueType, PrefValueTypeStrings, } from 'picsur-shared/dist/dto/preferences.dto'; -import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; +import { + SysPreference, + SysPreferenceList, + SysPreferenceValidators, + SysPreferenceValueTypes, +} from 'picsur-shared/dist/dto/sys-preferences.enum'; import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types'; import { Repository } from 'typeorm'; import { ESysPreferenceBackend, ESysPreferenceSchema, -} from '../../database/entities/sys-preference.entity'; -import { - SysPreferenceList, - SysPreferenceValueTypes, -} from '../../models/constants/syspreferences.const'; +} from '../../database/entities/system/sys-preference.entity'; import { MutexFallBack } from '../../util/mutex-fallback'; import { PreferenceCommonService } from './preference-common.service'; import { PreferenceDefaultsService } from './preference-defaults.service'; @@ -85,7 +86,7 @@ export class SysPreferenceDbService { // Return return this.prefCommon.DecodePref( - result.data, + result.data as any, SysPreference, SysPreferenceValueTypes, ); @@ -136,7 +137,7 @@ export class SysPreferenceDbService { private async saveDefault( key: SysPreference, // Force enum here because we dont validate ): AsyncFailable { - return this.setPreference(key, this.defaultsService.sysDefaults[key]()); + return this.setPreference(key, this.defaultsService.getSysDefault(key)); } private async encodeSysPref( @@ -151,6 +152,12 @@ export class SysPreferenceDbService { ); if (HasFailed(validated)) return validated; + const valueValidated = + SysPreferenceValidators[key as SysPreference].safeParse(value); + if (!valueValidated.success) { + return Fail(FT.UsrValidation, undefined, valueValidated.error); + } + let verifySysPreference = new ESysPreferenceBackend(); verifySysPreference.key = validated.key; verifySysPreference.value = validated.value; diff --git a/backend/src/collections/preference-db/usr-preference-db.service.ts b/backend/src/collections/preference-db/usr-preference-db.service.ts index b6145d35..392248ae 100644 --- a/backend/src/collections/preference-db/usr-preference-db.service.ts +++ b/backend/src/collections/preference-db/usr-preference-db.service.ts @@ -5,17 +5,18 @@ import { PrefValueType, PrefValueTypeStrings, } from 'picsur-shared/dist/dto/preferences.dto'; -import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.enum'; +import { + UsrPreference, + UsrPreferenceList, + UsrPreferenceValidators, + UsrPreferenceValueTypes, +} from 'picsur-shared/dist/dto/usr-preferences.enum'; import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types'; import { Repository } from 'typeorm'; import { EUsrPreferenceBackend, EUsrPreferenceSchema, -} from '../../database/entities/usr-preference.entity'; -import { - UsrPreferenceList, - UsrPreferenceValueTypes, -} from '../../models/constants/usrpreferences.const'; +} from '../../database/entities/system/usr-preference.entity'; import { MutexFallBack } from '../../util/mutex-fallback'; import { PreferenceCommonService } from './preference-common.service'; import { PreferenceDefaultsService } from './preference-defaults.service'; @@ -91,7 +92,7 @@ export class UsrPreferenceDbService { // Return const unpacked = this.prefCommon.DecodePref( - result.data, + result.data as any, UsrPreference, UsrPreferenceValueTypes, ); @@ -175,7 +176,7 @@ export class UsrPreferenceDbService { return this.setPreference( userid, key, - this.defaultsService.usrDefaults[key](), + this.defaultsService.getUsrDefault(key), ); } @@ -192,6 +193,12 @@ export class UsrPreferenceDbService { ); if (HasFailed(validated)) return validated; + const valueValidated = + UsrPreferenceValidators[key as UsrPreference].safeParse(value); + if (!valueValidated.success) { + return Fail(FT.UsrValidation, undefined, valueValidated.error); + } + let verifySysPreference = new EUsrPreferenceBackend(); verifySysPreference.key = validated.key; verifySysPreference.value = validated.value; diff --git a/backend/src/collections/role-db/role-db.module.ts b/backend/src/collections/role-db/role-db.module.ts index d7fa828b..a4af867f 100644 --- a/backend/src/collections/role-db/role-db.module.ts +++ b/backend/src/collections/role-db/role-db.module.ts @@ -3,7 +3,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { HasFailed } from 'picsur-shared/dist/types'; import { EarlyConfigModule } from '../../config/early/early-config.module'; import { HostConfigService } from '../../config/early/host.config.service'; -import { ERoleBackend } from '../../database/entities/role.entity'; +import { ERoleBackend } from '../../database/entities/users/role.entity'; import { ImmutableRolesList, SystemRoleDefaults, diff --git a/backend/src/collections/role-db/role-db.service.ts b/backend/src/collections/role-db/role-db.service.ts index 00b3c965..1d2cb0a4 100644 --- a/backend/src/collections/role-db/role-db.service.ts +++ b/backend/src/collections/role-db/role-db.service.ts @@ -10,7 +10,7 @@ import { } from 'picsur-shared/dist/types'; import { makeUnique } from 'picsur-shared/dist/util/unique'; import { In, Repository } from 'typeorm'; -import { ERoleBackend } from '../../database/entities/role.entity'; +import { ERoleBackend } from '../../database/entities/users/role.entity'; import { Permissions } from '../../models/constants/permissions.const'; import { ImmutableRolesList, diff --git a/backend/src/collections/system-state-db/system-state-db.module.ts b/backend/src/collections/system-state-db/system-state-db.module.ts new file mode 100644 index 00000000..b814b5db --- /dev/null +++ b/backend/src/collections/system-state-db/system-state-db.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ESystemStateBackend } from '../../database/entities/system/system-state.entity'; +import { SystemStateDbService } from './system-state-db.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([ESystemStateBackend])], + providers: [SystemStateDbService], + exports: [SystemStateDbService], +}) +export class SystemStateDbModule {} diff --git a/backend/src/collections/system-state-db/system-state-db.service.ts b/backend/src/collections/system-state-db/system-state-db.service.ts new file mode 100644 index 00000000..28a4be30 --- /dev/null +++ b/backend/src/collections/system-state-db/system-state-db.service.ts @@ -0,0 +1,42 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { AsyncFailable, Fail, FT } from 'picsur-shared/dist/types'; +import { Repository } from 'typeorm'; +import { ESystemStateBackend } from '../../database/entities/system/system-state.entity'; + +@Injectable() +export class SystemStateDbService { + private readonly logger = new Logger(SystemStateDbService.name); + + constructor( + @InjectRepository(ESystemStateBackend) + private readonly stateRepo: Repository, + ) {} + + async get(key: string): AsyncFailable { + try { + const state = await this.stateRepo.findOne({ where: { key } }); + return state?.value ?? null; + } catch (err) { + return Fail(FT.Database, err); + } + } + + async set(key: string, value: string): AsyncFailable { + try { + await this.stateRepo.save({ key, value }); + return true; + } catch (err) { + return Fail(FT.Database, err); + } + } + + async clear(key: string): AsyncFailable { + try { + await this.stateRepo.delete({ key }); + return true; + } catch (err) { + return Fail(FT.Database, err); + } + } +} diff --git a/backend/src/collections/user-db/user-db.module.ts b/backend/src/collections/user-db/user-db.module.ts index b8c71271..e405e114 100644 --- a/backend/src/collections/user-db/user-db.module.ts +++ b/backend/src/collections/user-db/user-db.module.ts @@ -4,7 +4,7 @@ import { HasFailed } from 'picsur-shared/dist/types'; import { generateRandomString } from 'picsur-shared/dist/util/random'; import { AuthConfigService } from '../../config/early/auth.config.service'; import { EarlyConfigModule } from '../../config/early/early-config.module'; -import { EUserBackend } from '../../database/entities/user.entity'; +import { EUserBackend } from '../../database/entities/users/user.entity'; import { PreferenceDbModule } from '../preference-db/preference-db.module'; import { RoleDbModule } from '../role-db/role-db.module'; import { UserDbService } from './user-db.service'; diff --git a/backend/src/collections/user-db/user-db.service.ts b/backend/src/collections/user-db/user-db.service.ts index 6d01dd11..0e2b3179 100644 --- a/backend/src/collections/user-db/user-db.service.ts +++ b/backend/src/collections/user-db/user-db.service.ts @@ -12,7 +12,7 @@ import { import { FindResult } from 'picsur-shared/dist/types/find-result'; import { makeUnique } from 'picsur-shared/dist/util/unique'; import { Repository } from 'typeorm'; -import { EUserBackend } from '../../database/entities/user.entity'; +import { EUserBackend } from '../../database/entities/users/user.entity'; import { Permissions } from '../../models/constants/permissions.const'; import { DefaultRolesList, @@ -263,6 +263,14 @@ export class UserDbService { } } + public async count(): AsyncFailable { + try { + return await this.usersRepository.count(); + } catch (e) { + return Fail(FT.Database, e); + } + } + public async exists(username: string): Promise { return HasSuccess(await this.findByUsername(username)); } diff --git a/backend/src/config/config.static.ts b/backend/src/config/config.static.ts index ecc71572..3cac5f22 100644 --- a/backend/src/config/config.static.ts +++ b/backend/src/config/config.static.ts @@ -1,6 +1,8 @@ import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; +export const ReportUrl = 'https://metrics.picsur.org'; +export const ReportInterval = 1000 * 60 * 60; export const EnvPrefix = 'PICSUR_'; export const DefaultName = 'picsur'; diff --git a/backend/src/config/early/early-config.module.ts b/backend/src/config/early/early-config.module.ts index 7e40d3f7..f2b95732 100644 --- a/backend/src/config/early/early-config.module.ts +++ b/backend/src/config/early/early-config.module.ts @@ -4,6 +4,7 @@ import { AuthConfigService } from './auth.config.service'; import { EarlyJwtConfigService } from './early-jwt.config.service'; import { HostConfigService } from './host.config.service'; import { MultipartConfigService } from './multipart.config.service'; +import { RedisConfigService } from './redis.config.service'; import { ServeStaticConfigService } from './serve-static.config.service'; import { TypeOrmConfigService } from './type-orm.config.service'; @@ -21,6 +22,7 @@ import { TypeOrmConfigService } from './type-orm.config.service'; HostConfigService, AuthConfigService, MultipartConfigService, + RedisConfigService, ], exports: [ ConfigModule, @@ -30,6 +32,7 @@ import { TypeOrmConfigService } from './type-orm.config.service'; HostConfigService, AuthConfigService, MultipartConfigService, + RedisConfigService, ], }) export class EarlyConfigModule {} diff --git a/backend/src/config/early/host.config.service.ts b/backend/src/config/early/host.config.service.ts index 32e2146a..cbc6978b 100644 --- a/backend/src/config/early/host.config.service.ts +++ b/backend/src/config/early/host.config.service.ts @@ -16,8 +16,15 @@ export class HostConfigService { this.logger.log('Verbose: ' + this.isVerbose()); this.logger.log('Host: ' + this.getHost()); this.logger.log('Port: ' + this.getPort()); - this.logger.log('Demo: ' + this.isDemo()); - this.logger.log('Demo Interval: ' + this.getDemoInterval() / 1000 + 's'); + + if (this.isDemo()) { + this.logger.log('Running in demo mode'); + this.logger.log('Demo Interval: ' + this.getDemoInterval() / 1000 + 's'); + } + + if (!this.isTelemetry()) { + this.logger.log('Telemetry disabled'); + } } public getHost(): string { @@ -47,6 +54,10 @@ export class HostConfigService { return ParseBool(this.configService.get(`${EnvPrefix}VERBOSE`), false); } + public isTelemetry() { + return ParseBool(this.configService.get(`${EnvPrefix}TELEMETRY`), true); + } + public getVersion() { return ParseString(this.configService.get(`npm_package_version`), '0.0.0'); } diff --git a/backend/src/config/early/multipart.config.service.ts b/backend/src/config/early/multipart.config.service.ts index a31902d4..12beb03f 100644 --- a/backend/src/config/early/multipart.config.service.ts +++ b/backend/src/config/early/multipart.config.service.ts @@ -18,12 +18,12 @@ export class MultipartConfigService { ); } - public getLimits() { + public getLimits(fileLimit?: number) { return { fieldNameSize: 128, fieldSize: 1024, - fields: 16, - files: 16, + fields: 20, + files: fileLimit ?? 20, fileSize: this.getMaxFileSize(), }; } diff --git a/backend/src/config/early/redis.config.service.ts b/backend/src/config/early/redis.config.service.ts new file mode 100644 index 00000000..e0e07e0f --- /dev/null +++ b/backend/src/config/early/redis.config.service.ts @@ -0,0 +1,20 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { ParseString } from 'picsur-shared/dist/util/parse-simple'; +import { EnvPrefix } from '../config.static'; + +@Injectable() +export class RedisConfigService { + private readonly logger = new Logger(RedisConfigService.name); + + constructor(private readonly configService: ConfigService) { + this.logger.log('Redis URL: ' + this.getRedisUrl()); + } + + public getRedisUrl(): string { + return ParseString( + this.configService.get(`${EnvPrefix}REDIS_URL`), + 'redis://localhost:6379', + ); + } +} diff --git a/backend/src/config/late/info.config.service.ts b/backend/src/config/late/info.config.service.ts new file mode 100644 index 00000000..891aadc9 --- /dev/null +++ b/backend/src/config/late/info.config.service.ts @@ -0,0 +1,25 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; +import { HasFailed } from 'picsur-shared/dist/types'; +import { SysPreferenceDbService } from '../../collections/preference-db/sys-preference-db.service'; + +@Injectable() +export class InfoConfigService { + private readonly logger = new Logger(InfoConfigService.name); + + constructor(private readonly prefService: SysPreferenceDbService) {} + + public async getHostnameOverride(): Promise { + const hostname = await this.prefService.getStringPreference( + SysPreference.HostOverride, + ); + if (HasFailed(hostname)) { + hostname.print(this.logger); + return undefined; + } + + if (hostname === '') return undefined; + + return hostname; + } +} diff --git a/backend/src/config/late/jwt.config.service.ts b/backend/src/config/late/jwt.config.service.ts index 98561272..966178d4 100644 --- a/backend/src/config/late/jwt.config.service.ts +++ b/backend/src/config/late/jwt.config.service.ts @@ -32,8 +32,8 @@ export class JwtConfigService implements JwtOptionsFactory { await this.prefService.getStringPreference('jwt_expires_in'), ); - let milliseconds = ms(expiresIn); - if (milliseconds === undefined) { + let milliseconds = ms(expiresIn as any); + if (isNaN(milliseconds)) { milliseconds = 1000 * 60 * 60 * 24; // 1 day } diff --git a/backend/src/config/late/late-config.module.ts b/backend/src/config/late/late-config.module.ts index 6d3edbcd..e81d2c8e 100644 --- a/backend/src/config/late/late-config.module.ts +++ b/backend/src/config/late/late-config.module.ts @@ -3,7 +3,9 @@ import { PreferenceDbModule } from '../../collections/preference-db/preference-d import { SysPreferenceDbService } from '../../collections/preference-db/sys-preference-db.service'; import { EarlyConfigModule } from '../early/early-config.module'; import { EarlyJwtConfigService } from '../early/early-jwt.config.service'; +import { InfoConfigService } from './info.config.service'; import { JwtConfigService } from './jwt.config.service'; +import { UsageConfigService } from './usage.config.service'; // This module contains all configservices that depend on the syspref module // The syspref module can only be used when connected to the database @@ -11,9 +13,14 @@ import { JwtConfigService } from './jwt.config.service'; // Otherwise we will create a circular depedency @Module({ - imports: [PreferenceDbModule, EarlyConfigModule], - providers: [JwtConfigService], - exports: [JwtConfigService, EarlyConfigModule], + imports: [EarlyConfigModule, PreferenceDbModule], + providers: [JwtConfigService, InfoConfigService, UsageConfigService], + exports: [ + EarlyConfigModule, + JwtConfigService, + InfoConfigService, + UsageConfigService, + ], }) export class LateConfigModule implements OnModuleInit { private readonly logger = new Logger(LateConfigModule.name); diff --git a/backend/src/config/late/usage.config.service.ts b/backend/src/config/late/usage.config.service.ts new file mode 100644 index 00000000..3ee05eec --- /dev/null +++ b/backend/src/config/late/usage.config.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@nestjs/common'; +import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; +import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types'; +import { URLRegex, UUIDRegex } from 'picsur-shared/dist/util/common-regex'; +import { SysPreferenceDbService } from '../../collections/preference-db/sys-preference-db.service'; +import { ReportInterval, ReportUrl } from '../config.static'; + +@Injectable() +export class UsageConfigService { + constructor(private readonly sysPref: SysPreferenceDbService) {} + + async getTrackingUrl(): AsyncFailable { + const trackingUrl = await this.sysPref.getStringPreference( + SysPreference.TrackingUrl, + ); + if (HasFailed(trackingUrl)) return trackingUrl; + + if (trackingUrl === '') return null; + + if (!URLRegex.test(trackingUrl)) { + return Fail(FT.UsrValidation, undefined, 'Invalid tracking URL'); + } + + return trackingUrl; + } + + async getTrackingID(): AsyncFailable { + const trackingID = await this.sysPref.getStringPreference( + SysPreference.TrackingId, + ); + if (HasFailed(trackingID)) return trackingID; + + if (trackingID === '') return null; + + if (!UUIDRegex.test(trackingID)) { + return Fail(FT.UsrValidation, undefined, 'Invalid tracking ID'); + } + + return trackingID; + } + + async getMetricsEnabled(): AsyncFailable { + return this.sysPref.getBooleanPreference(SysPreference.EnableTelemetry); + } + + async getMetricsInterval(): Promise { + return ReportInterval; + } + + async getMetricsUrl(): Promise { + return ReportUrl; + } +} diff --git a/backend/src/database/entities/apikey.entity.ts b/backend/src/database/entities/apikey.entity.ts index 32c1125e..3afee95b 100644 --- a/backend/src/database/entities/apikey.entity.ts +++ b/backend/src/database/entities/apikey.entity.ts @@ -7,7 +7,7 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; import { z } from 'zod'; -import { EUserBackend } from './user.entity'; +import { EUserBackend } from './users/user.entity'; const OverriddenEApiKeySchema = EApiKeySchema.omit({ user: true }).merge( z.object({ diff --git a/backend/src/database/entities/image-derivative.entity.ts b/backend/src/database/entities/images/image-derivative.entity.ts similarity index 100% rename from backend/src/database/entities/image-derivative.entity.ts rename to backend/src/database/entities/images/image-derivative.entity.ts diff --git a/backend/src/database/entities/image-file.entity.ts b/backend/src/database/entities/images/image-file.entity.ts similarity index 100% rename from backend/src/database/entities/image-file.entity.ts rename to backend/src/database/entities/images/image-file.entity.ts diff --git a/backend/src/database/entities/image.entity.ts b/backend/src/database/entities/images/image.entity.ts similarity index 100% rename from backend/src/database/entities/image.entity.ts rename to backend/src/database/entities/images/image.entity.ts diff --git a/backend/src/database/entities/index.ts b/backend/src/database/entities/index.ts index a8900fc0..9515ac2f 100644 --- a/backend/src/database/entities/index.ts +++ b/backend/src/database/entities/index.ts @@ -1,11 +1,12 @@ import { EApiKeyBackend } from './apikey.entity'; -import { EImageDerivativeBackend } from './image-derivative.entity'; -import { EImageFileBackend } from './image-file.entity'; -import { EImageBackend } from './image.entity'; -import { ERoleBackend } from './role.entity'; -import { ESysPreferenceBackend } from './sys-preference.entity'; -import { EUserBackend } from './user.entity'; -import { EUsrPreferenceBackend } from './usr-preference.entity'; +import { EImageDerivativeBackend } from './images/image-derivative.entity'; +import { EImageFileBackend } from './images/image-file.entity'; +import { EImageBackend } from './images/image.entity'; +import { ESysPreferenceBackend } from './system/sys-preference.entity'; +import { ESystemStateBackend } from './system/system-state.entity'; +import { EUsrPreferenceBackend } from './system/usr-preference.entity'; +import { ERoleBackend } from './users/role.entity'; +import { EUserBackend } from './users/user.entity'; export const EntityList = [ EImageBackend, @@ -16,4 +17,5 @@ export const EntityList = [ ESysPreferenceBackend, EUsrPreferenceBackend, EApiKeyBackend, + ESystemStateBackend, ]; diff --git a/backend/src/database/entities/sys-preference.entity.ts b/backend/src/database/entities/system/sys-preference.entity.ts similarity index 100% rename from backend/src/database/entities/sys-preference.entity.ts rename to backend/src/database/entities/system/sys-preference.entity.ts diff --git a/backend/src/database/entities/system/system-state.entity.ts b/backend/src/database/entities/system/system-state.entity.ts new file mode 100644 index 00000000..df2c0a36 --- /dev/null +++ b/backend/src/database/entities/system/system-state.entity.ts @@ -0,0 +1,14 @@ +import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class ESystemStateBackend { + @PrimaryGeneratedColumn('uuid') + id?: string; + + @Index() + @Column({ nullable: false, unique: true }) + key: string; + + @Column({ nullable: false }) + value: string; +} diff --git a/backend/src/database/entities/usr-preference.entity.ts b/backend/src/database/entities/system/usr-preference.entity.ts similarity index 94% rename from backend/src/database/entities/usr-preference.entity.ts rename to backend/src/database/entities/system/usr-preference.entity.ts index 55cf17a9..8f7dd7ac 100644 --- a/backend/src/database/entities/usr-preference.entity.ts +++ b/backend/src/database/entities/system/usr-preference.entity.ts @@ -9,7 +9,7 @@ import { Unique, } from 'typeorm'; import z from 'zod'; -import { EUserBackend } from './user.entity'; +import { EUserBackend } from '../users/user.entity'; export const EUsrPreferenceSchema = z.object({ id: IsEntityID().optional(), diff --git a/backend/src/database/entities/role.entity.ts b/backend/src/database/entities/users/role.entity.ts similarity index 83% rename from backend/src/database/entities/role.entity.ts rename to backend/src/database/entities/users/role.entity.ts index 9f7cc0da..14061834 100644 --- a/backend/src/database/entities/role.entity.ts +++ b/backend/src/database/entities/users/role.entity.ts @@ -1,6 +1,6 @@ import { ERole } from 'picsur-shared/dist/entities/role.entity'; import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; -import type { Permissions } from '../../models/constants/permissions.const'; +import type { Permissions } from '../../../models/constants/permissions.const'; @Entity() export class ERoleBackend implements ERole { diff --git a/backend/src/database/entities/user.entity.ts b/backend/src/database/entities/users/user.entity.ts similarity index 89% rename from backend/src/database/entities/user.entity.ts rename to backend/src/database/entities/users/user.entity.ts index 41407157..2bd6b94e 100644 --- a/backend/src/database/entities/user.entity.ts +++ b/backend/src/database/entities/users/user.entity.ts @@ -7,8 +7,8 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; import { z } from 'zod'; -import { EApiKeyBackend } from './apikey.entity'; -import { EUsrPreferenceBackend } from './usr-preference.entity'; +import { EApiKeyBackend } from '../apikey.entity'; +import { EUsrPreferenceBackend } from '../system/usr-preference.entity'; // Different data for public and private const OverriddenEUserSchema = EUserSchema.omit({ hashedPassword: true }).merge( diff --git a/backend/src/database/migrations/1672154027079-V_0_5_0_a.ts b/backend/src/database/migrations/1672154027079-V_0_5_0_a.ts new file mode 100644 index 00000000..55410639 --- /dev/null +++ b/backend/src/database/migrations/1672154027079-V_0_5_0_a.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class V050A1672154027079 implements MigrationInterface { + name = 'V050A1672154027079' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "e_system_state_backend" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "key" character varying NOT NULL, "value" character varying NOT NULL, CONSTRAINT "UQ_f11f1605928b497b24f4b3ecc1f" UNIQUE ("key"), CONSTRAINT "PK_097ea165dadc8c14237481afd64" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE INDEX "IDX_f11f1605928b497b24f4b3ecc1" ON "e_system_state_backend" ("key") `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "public"."IDX_f11f1605928b497b24f4b3ecc1"`); + await queryRunner.query(`DROP TABLE "e_system_state_backend"`); + } + +} diff --git a/backend/src/database/migrations/index.ts b/backend/src/database/migrations/index.ts index 07f9fd8c..f75529da 100644 --- a/backend/src/database/migrations/index.ts +++ b/backend/src/database/migrations/index.ts @@ -4,6 +4,7 @@ import { V040A1662314197741 } from './1662314197741-V_0_4_0_a'; import { V040B1662485374471 } from './1662485374471-V_0_4_0_b'; import { V040C1662535484200 } from './1662535484200-V_0_4_0_c'; import { V040D1662728275448 } from './1662728275448-V_0_4_0_d'; +import { V050A1672154027079 } from './1672154027079-V_0_5_0_a'; export const MigrationList: Function[] = [ V030A1661692206479, @@ -12,4 +13,5 @@ export const MigrationList: Function[] = [ V040B1662485374471, V040C1662535484200, V040D1662728275448, + V050A1672154027079, ]; diff --git a/backend/src/decorators/decorators.module.ts b/backend/src/decorators/decorators.module.ts index 021bf371..d03d9a5a 100644 --- a/backend/src/decorators/decorators.module.ts +++ b/backend/src/decorators/decorators.module.ts @@ -1,8 +1,8 @@ import { Module } from '@nestjs/common'; import { EarlyConfigModule } from '../config/early/early-config.module'; import { ImageIdPipe } from './image-id/image-id.pipe'; -import { MultiPartPipe } from './multipart/multipart.pipe'; import { PostFilePipe } from './multipart/postfile.pipe'; +import { MultiPartPipe } from './multipart/postfiles.pipe'; @Module({ imports: [EarlyConfigModule], diff --git a/backend/src/decorators/multipart/inject-request.decorator.ts b/backend/src/decorators/multipart/inject-request.decorator.ts index 591acfae..a9e467b5 100644 --- a/backend/src/decorators/multipart/inject-request.decorator.ts +++ b/backend/src/decorators/multipart/inject-request.decorator.ts @@ -3,6 +3,9 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common'; // Since pipes dont have direct access to the request object, we need this decorator to inject it export const InjectRequest = createParamDecorator( async (data: any, ctx: ExecutionContext) => { - return ctx.switchToHttp().getRequest(); + return { + data: data, + request: ctx.switchToHttp().getRequest(), + }; }, ); diff --git a/backend/src/decorators/multipart/multipart.decorator.ts b/backend/src/decorators/multipart/multipart.decorator.ts index 91056a03..e5d24862 100644 --- a/backend/src/decorators/multipart/multipart.decorator.ts +++ b/backend/src/decorators/multipart/multipart.decorator.ts @@ -1,7 +1,8 @@ import { InjectRequest } from './inject-request.decorator'; -import { MultiPartPipe } from './multipart.pipe'; import { PostFilePipe } from './postfile.pipe'; +import { MultiPartPipe } from './postfiles.pipe'; export const PostFile = () => InjectRequest(PostFilePipe); -export const MultiPart = () => InjectRequest(MultiPartPipe); +export const PostFiles = (maxFiles?: number) => + InjectRequest(maxFiles, MultiPartPipe); diff --git a/backend/src/decorators/multipart/multipart.pipe.ts b/backend/src/decorators/multipart/multipart.pipe.ts deleted file mode 100644 index 475c4acf..00000000 --- a/backend/src/decorators/multipart/multipart.pipe.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { MultipartFields, MultipartFile } from '@fastify/multipart'; -import { - ArgumentMetadata, - Injectable, - Logger, - PipeTransform, - Scope, -} from '@nestjs/common'; -import { FastifyRequest } from 'fastify'; -import { Fail, FT, HasFailed } from 'picsur-shared/dist/types'; -import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto'; -import { MultipartConfigService } from '../../config/early/multipart.config.service'; -import { - CreateMultiPartFieldDto, - CreateMultiPartFileDto, -} from '../../models/dto/multipart.dto'; - -@Injectable({ scope: Scope.REQUEST }) -export class MultiPartPipe implements PipeTransform { - private readonly logger = new Logger(MultiPartPipe.name); - - constructor( - private readonly multipartConfigService: MultipartConfigService, - ) {} - - async transform( - req: FastifyRequest, - metadata: ArgumentMetadata, - ) { - let zodSchema = (metadata?.metatype as ZodDtoStatic)?.zodSchema; - if (!zodSchema) { - this.logger.error('Invalid scheme on multipart body'); - throw Fail(FT.Internal, 'Invalid scheme on backend'); - } - - let multipartData = {}; - if (!req.isMultipart()) throw Fail(FT.UsrValidation, 'Invalid file'); - - // Fetch all fields from the request - let fields: MultipartFields | null = null; - try { - fields = - ( - await req.file({ - limits: this.multipartConfigService.getLimits(), - }) - )?.fields ?? null; - } catch (e) { - this.logger.warn(e); - } - if (!fields) throw Fail(FT.UsrValidation, 'Invalid file'); - - // Loop over every formfield that was sent - for (const key of Object.keys(fields)) { - // Ignore duplicate fields - if (Array.isArray(fields[key])) { - continue; - } - - // Use the value property to differentiate between a field and a file - // And then put the value into the correct property on the validatable class - if ((fields[key] as any).value) { - (multipartData as any)[key] = CreateMultiPartFieldDto( - fields[key] as MultipartFile, - ); - } else { - const file = await CreateMultiPartFileDto(fields[key] as MultipartFile); - if (HasFailed(file)) throw file; - (multipartData as any)[key] = file; - } - } - - // Now validate the class we made, if any properties were invalid, it will error here - const result = zodSchema.safeParse(multipartData); - if (!result.success) { - this.logger.warn(result.error); - throw Fail(FT.UsrValidation, 'Invalid file'); - } - - return result.data; - } -} diff --git a/backend/src/decorators/multipart/postfile.pipe.ts b/backend/src/decorators/multipart/postfile.pipe.ts index e29f1b8c..f14a3d79 100644 --- a/backend/src/decorators/multipart/postfile.pipe.ts +++ b/backend/src/decorators/multipart/postfile.pipe.ts @@ -1,4 +1,4 @@ -import { Multipart, MultipartFields, MultipartFile } from '@fastify/multipart'; +import { Multipart, MultipartFile } from '@fastify/multipart'; import { Injectable, Logger, PipeTransform, Scope } from '@nestjs/common'; import { FastifyRequest } from 'fastify'; import { Fail, FT } from 'picsur-shared/dist/types'; @@ -12,11 +12,11 @@ export class PostFilePipe implements PipeTransform { private readonly multipartConfigService: MultipartConfigService, ) {} - async transform({ req }: { req: FastifyRequest }) { - if (!req.isMultipart()) throw Fail(FT.UsrValidation, 'Invalid file'); + async transform({ request, data }: { data: any; request: FastifyRequest }) { + if (!request.isMultipart()) throw Fail(FT.UsrValidation, 'Invalid file'); // Only one file is allowed - const file = await req.file({ + const file = await request.file({ limits: { ...this.multipartConfigService.getLimits(), files: 1, @@ -30,13 +30,15 @@ export class PostFilePipe implements PipeTransform { ) as any; // Remove non-file fields - const files: MultipartFile[] = allFields.filter((entry) => (entry as any).file !== undefined) as MultipartFile[]; + const files: MultipartFile[] = allFields.filter( + (entry) => (entry as any).file !== undefined, + ) as MultipartFile[]; if (files.length !== 1) throw Fail(FT.UsrValidation, 'Invalid file'); // Return a buffer of the file try { - return await files[0]?.toBuffer(); + return await files[0].toBuffer(); } catch (e) { this.logger.warn(e); throw Fail(FT.Internal, 'Invalid file'); diff --git a/backend/src/decorators/multipart/postfiles.pipe.ts b/backend/src/decorators/multipart/postfiles.pipe.ts new file mode 100644 index 00000000..69766932 --- /dev/null +++ b/backend/src/decorators/multipart/postfiles.pipe.ts @@ -0,0 +1,37 @@ +import { MultipartFile } from '@fastify/multipart'; +import { + ArgumentMetadata, + Injectable, + Logger, + PipeTransform, + Scope, +} from '@nestjs/common'; +import { FastifyRequest } from 'fastify'; +import { Fail, FT } from 'picsur-shared/dist/types'; +import { MultipartConfigService } from '../../config/early/multipart.config.service'; + +export type FileIterator = AsyncIterableIterator; + +@Injectable({ scope: Scope.REQUEST }) +export class MultiPartPipe implements PipeTransform { + private readonly logger = new Logger(MultiPartPipe.name); + + constructor( + private readonly multipartConfigService: MultipartConfigService, + ) {} + + async transform( + { request, data }: { data: any; request: FastifyRequest }, + metadata: ArgumentMetadata, + ) { + const filesLimit = typeof data === 'number' ? data : undefined; + + if (!request.isMultipart()) throw Fail(FT.UsrValidation, 'Invalid files'); + + const files = request.files({ + limits: this.multipartConfigService.getLimits(filesLimit), + }); + + return files; + } +} diff --git a/backend/src/decorators/returns.decorator.ts b/backend/src/decorators/returns.decorator.ts index d9dcb553..3e32df7a 100644 --- a/backend/src/decorators/returns.decorator.ts +++ b/backend/src/decorators/returns.decorator.ts @@ -16,3 +16,7 @@ export function Returns( ): ReturnsMethodDecorator { return SetMetadata('returns', newable); } + +export function ReturnsAnything(): ReturnsMethodDecorator { + return SetMetadata('noreturns', true); +} diff --git a/backend/src/layers/PicsurLayers.module.ts b/backend/src/layers/PicsurLayers.module.ts new file mode 100644 index 00000000..c9d3ba9d --- /dev/null +++ b/backend/src/layers/PicsurLayers.module.ts @@ -0,0 +1,28 @@ +import { Module } from '@nestjs/common'; +import { ThrottlerModule } from '@nestjs/throttler'; +import { MainExceptionFilter } from './exception/exception.filter'; +import { SuccessInterceptor } from './success/success.interceptor'; +import { PicsurThrottlerGuard } from './throttler/PicsurThrottler.guard'; +import { ZodValidationPipe } from './validate/zod-validator.pipe'; + +@Module({ + imports: [ + ThrottlerModule.forRoot({ + ttl: 60, + limit: 60, + }), + ], + providers: [ + PicsurThrottlerGuard, + MainExceptionFilter, + SuccessInterceptor, + ZodValidationPipe, + ], + exports: [ + PicsurThrottlerGuard, + MainExceptionFilter, + SuccessInterceptor, + ZodValidationPipe, + ], +}) +export class PicsurLayersModule {} diff --git a/backend/src/layers/exception/exception.filter.ts b/backend/src/layers/exception/exception.filter.ts index a7de68a9..fa88be47 100644 --- a/backend/src/layers/exception/exception.filter.ts +++ b/backend/src/layers/exception/exception.filter.ts @@ -39,23 +39,7 @@ export class MainExceptionFilter implements ExceptionFilter { const status = exception.getCode(); const type = exception.getType(); - const message = exception.getReason(); - const logmessage = - message + - (exception.getDebugMessage() ? ' - ' + exception.getDebugMessage() : ''); - - if (exception.isImportant()) { - MainExceptionFilter.logger.error( - `${traceString} ${exception.getName()}: ${logmessage}`, - ); - if (exception.getStack()) { - MainExceptionFilter.logger.debug(exception.getStack()); - } - } else { - MainExceptionFilter.logger.warn( - `${traceString} ${exception.getName()}: ${logmessage}`, - ); - } + exception.print(MainExceptionFilter.logger, { prefix: traceString }); const toSend: ApiErrorResponse = { success: false, @@ -65,7 +49,7 @@ export class MainExceptionFilter implements ExceptionFilter { data: { type, - message, + message: exception.getReason(), }, }; diff --git a/backend/src/layers/success/success.interceptor.ts b/backend/src/layers/success/success.interceptor.ts index c130b871..b80c2b65 100644 --- a/backend/src/layers/success/success.interceptor.ts +++ b/backend/src/layers/success/success.interceptor.ts @@ -46,10 +46,29 @@ export class SuccessInterceptor implements NestInterceptor { return data; } }), + map((data) => { + const request = context.switchToHttp().getRequest(); + const response = context.switchToHttp().getResponse(); + const traceString = `(${request.ip} -> ${request.method} ${request.url})`; + + this.logger.verbose( + `Handled ${traceString} with ${response.statusCode} in ${Math.ceil( + response.getResponseTime(), + )}ms`, + SuccessInterceptor.name, + ); + + return data; + }), ); } private validate(context: ExecutionContext, data: unknown): unknown { + const canReturnAnything = + (this.reflector.get('noreturns', context.getHandler()) ?? false) === true; + + if (canReturnAnything) return data; + const schemaStatic = this.reflector.get( 'returns', context.getHandler(), diff --git a/backend/src/layers/throttler/PicsurThrottler.guard.ts b/backend/src/layers/throttler/PicsurThrottler.guard.ts new file mode 100644 index 00000000..bbfe2c7e --- /dev/null +++ b/backend/src/layers/throttler/PicsurThrottler.guard.ts @@ -0,0 +1,10 @@ +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { ThrottlerGuard } from '@nestjs/throttler'; +import { Fail, FT } from 'picsur-shared/dist/types'; + +@Injectable() +export class PicsurThrottlerGuard extends ThrottlerGuard { + protected override throwThrottlingException(context: ExecutionContext): void { + throw Fail(FT.RateLimit); + } +} diff --git a/backend/src/main.ts b/backend/src/main.ts index 40ed91ea..4a531b29 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -1,15 +1,16 @@ import fastifyHelmet from '@fastify/helmet'; import multipart from '@fastify/multipart'; -import { NestFactory, Reflector } from '@nestjs/core'; +import fastifyReplyFrom from '@fastify/reply-from'; +import { NestFactory } from '@nestjs/core'; import { FastifyAdapter, NestFastifyApplication, } from '@nestjs/platform-fastify'; import { AppModule } from './app.module'; -import { UserDbService } from './collections/user-db/user-db.service'; import { HostConfigService } from './config/early/host.config.service'; import { MainExceptionFilter } from './layers/exception/exception.filter'; import { SuccessInterceptor } from './layers/success/success.interceptor'; +import { PicsurThrottlerGuard } from './layers/throttler/PicsurThrottler.guard'; import { ZodValidationPipe } from './layers/validate/zod-validator.pipe'; import { PicsurLoggerService } from './logger/logger.service'; import { MainAuthGuard } from './managers/auth/guards/main.guard'; @@ -19,10 +20,18 @@ async function bootstrap() { const isProduction = process.env['PICSUR_PRODUCTION'] !== undefined; // Create fasify - const fastifyAdapter = new FastifyAdapter(); + const fastifyAdapter = new FastifyAdapter({ + trustProxy: [ + '127.0.0.0/8', + '10.0.0.0/8', + '172.16.0.0/12', + '192.168.0.0/16', + ], + }); // TODO: generic error messages await fastifyAdapter.register(multipart as any); await fastifyAdapter.register(fastifyHelmet as any, HelmetOptions); + await fastifyAdapter.register(fastifyReplyFrom as any); // Create nest app const app = await NestFactory.create( @@ -30,20 +39,19 @@ async function bootstrap() { fastifyAdapter, { bufferLogs: isProduction, + autoFlushLogs: true, }, ); // Configure logger app.useLogger(app.get(PicsurLoggerService)); - app.flushLogs(); - app.useGlobalFilters(new MainExceptionFilter()); - app.useGlobalInterceptors(new SuccessInterceptor(app.get(Reflector))); - app.useGlobalPipes(new ZodValidationPipe()); - app.useGlobalGuards( - new MainAuthGuard(app.get(Reflector), app.get(UserDbService)), - ); + app.useGlobalFilters(app.get(MainExceptionFilter)); + app.useGlobalInterceptors(app.get(SuccessInterceptor)); + app.useGlobalPipes(app.get(ZodValidationPipe)); + + app.useGlobalGuards(app.get(PicsurThrottlerGuard), app.get(MainAuthGuard)); // Start app const hostConfigService = app.get(HostConfigService); diff --git a/backend/src/managers/auth/auth.module.ts b/backend/src/managers/auth/auth.module.ts index 7343a1e7..2eca869f 100644 --- a/backend/src/managers/auth/auth.module.ts +++ b/backend/src/managers/auth/auth.module.ts @@ -13,7 +13,9 @@ import { AuthManagerService } from './auth.service'; import { ApiKeyStrategy } from './guards/apikey.strategy'; import { GuestStrategy } from './guards/guest.strategy'; import { JwtStrategy } from './guards/jwt.strategy'; +import { LocalAuthGuard } from './guards/local-auth.guard'; import { LocalAuthStrategy } from './guards/local-auth.strategy'; +import { MainAuthGuard } from './guards/main.guard'; import { GuestService } from './guest.service'; @Module({ @@ -30,13 +32,15 @@ import { GuestService } from './guest.service'; ], providers: [ AuthManagerService, + GuestService, + JwtSecretProvider, LocalAuthStrategy, JwtStrategy, GuestStrategy, - JwtSecretProvider, ApiKeyStrategy, - GuestService, + LocalAuthGuard, + MainAuthGuard, ], - exports: [UserDbModule, AuthManagerService], + exports: [UserDbModule, AuthManagerService, LocalAuthGuard, MainAuthGuard], }) export class AuthManagerModule {} diff --git a/backend/src/managers/auth/guest.service.ts b/backend/src/managers/auth/guest.service.ts index 7e677f1d..d81abcec 100644 --- a/backend/src/managers/auth/guest.service.ts +++ b/backend/src/managers/auth/guest.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { HasFailed } from 'picsur-shared/dist/types'; import { UserDbService } from '../../collections/user-db/user-db.service'; -import { EUserBackend } from '../../database/entities/user.entity'; +import { EUserBackend } from '../../database/entities/users/user.entity'; @Injectable() export class GuestService { diff --git a/backend/src/managers/demo/demo.module.ts b/backend/src/managers/demo/demo.module.ts index b2e5028a..e5b16a50 100644 --- a/backend/src/managers/demo/demo.module.ts +++ b/backend/src/managers/demo/demo.module.ts @@ -1,4 +1,5 @@ -import { Logger, Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; +import { Logger, Module, OnModuleInit } from '@nestjs/common'; +import { SchedulerRegistry } from '@nestjs/schedule'; import { ImageDBModule } from '../../collections/image-db/image-db.module'; import { RoleDbModule } from '../../collections/role-db/role-db.module'; import { EarlyConfigModule } from '../../config/early/early-config.module'; @@ -9,13 +10,13 @@ import { DemoManagerService } from './demo.service'; imports: [ImageDBModule, EarlyConfigModule, RoleDbModule], providers: [DemoManagerService], }) -export class DemoManagerModule implements OnModuleInit, OnModuleDestroy { +export class DemoManagerModule implements OnModuleInit { private readonly logger = new Logger(DemoManagerModule.name); - private interval: NodeJS.Timeout; constructor( private readonly demoManagerService: DemoManagerService, private readonly hostConfigService: HostConfigService, + private readonly schedulerRegistry: SchedulerRegistry, ) {} async onModuleInit() { @@ -27,14 +28,12 @@ export class DemoManagerModule implements OnModuleInit, OnModuleDestroy { private async setupDemoMode() { this.demoManagerService.setupRoles(); - this.interval = setInterval( + + const interval = setInterval( // Run demoManagerService.execute() every interval this.demoManagerService.execute.bind(this.demoManagerService), this.hostConfigService.getDemoInterval(), ); - } - - onModuleDestroy() { - if (this.interval) clearInterval(this.interval); + this.schedulerRegistry.addInterval('demo', interval); } } diff --git a/backend/src/managers/image/image-converter.service.ts b/backend/src/managers/image/image-converter.service.ts index 358fa962..a43c1783 100644 --- a/backend/src/managers/image/image-converter.service.ts +++ b/backend/src/managers/image/image-converter.service.ts @@ -57,7 +57,8 @@ export class ImageConverterService { if (HasFailed(memLimit) || HasFailed(timeLimit)) { return Fail(FT.Internal, 'Failed to get conversion limits'); } - const timeLimitMS = ms(timeLimit); + let timeLimitMS = ms(timeLimit as any); + if (isNaN(timeLimitMS) || timeLimitMS === 0) timeLimitMS = 15 * 1000; // 15 seconds const sharpWrapper = new SharpWrapper(timeLimitMS, memLimit); const sharpOptions: SharpOptions = { @@ -121,16 +122,4 @@ export class ImageConverterService { filetype: targetFiletype.identifier, }; } - - private async convertAnimation( - image: Buffer, - targetFiletype: FileType, - options: ImageRequestParams, - ): AsyncFailable { - // Apng and gif are stored as is for now - return { - image: image, - filetype: targetFiletype.identifier, - }; - } } diff --git a/backend/src/managers/image/image.module.ts b/backend/src/managers/image/image-manager.module.ts similarity index 73% rename from backend/src/managers/image/image.module.ts rename to backend/src/managers/image/image-manager.module.ts index 80605976..a4104cff 100644 --- a/backend/src/managers/image/image.module.ts +++ b/backend/src/managers/image/image-manager.module.ts @@ -1,4 +1,5 @@ -import { Logger, Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; +import { Logger, Module, OnModuleInit } from '@nestjs/common'; +import { Interval } from '@nestjs/schedule'; import ms from 'ms'; import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; import { HasFailed } from 'picsur-shared/dist/types'; @@ -18,11 +19,10 @@ import { ImageManagerService } from './image.service'; ImageProcessorService, ImageConverterService, ], - exports: [ImageManagerService], + exports: [ImageManagerService, ImageConverterService], }) -export class ImageManagerModule implements OnModuleInit, OnModuleDestroy { +export class ImageManagerModule implements OnModuleInit { private readonly logger = new Logger(ImageManagerModule.name); - private interval: NodeJS.Timeout; constructor( private readonly prefManager: SysPreferenceDbService, @@ -31,14 +31,10 @@ export class ImageManagerModule implements OnModuleInit, OnModuleDestroy { ) {} async onModuleInit() { - this.interval = setInterval( - // Run demoManagerService.execute() every interval - this.imageManagerCron.bind(this), - 1000 * 60, - ); await this.imageManagerCron(); } + @Interval(1000 * 60) private async imageManagerCron() { await this.cleanupDerivatives(); await this.cleanupExpired(); @@ -53,31 +49,30 @@ export class ImageManagerModule implements OnModuleInit, OnModuleDestroy { return; } - const after_ms = ms(remove_derivatives_after); - if (after_ms === 0) { + let after_ms = ms(remove_derivatives_after as any); + if (isNaN(after_ms) || after_ms === 0) { this.logger.log('remove_derivatives_after is 0, skipping cron'); return; } + if (after_ms < 60000) after_ms = 60000; const result = await this.imageFileDB.cleanupDerivatives(after_ms / 1000); if (HasFailed(result)) { - this.logger.warn(result.print()); + result.print(this.logger); } - this.logger.log(`Cleaned up ${result} derivatives`); + if (result > 0) this.logger.log(`Cleaned up ${result} derivatives`); } private async cleanupExpired() { const cleanedUp = await this.imageDB.cleanupExpired(); if (HasFailed(cleanedUp)) { - this.logger.warn(cleanedUp.print()); + cleanedUp.print(this.logger); + return; } - this.logger.log(`Cleaned up ${cleanedUp} expired images`); - } - - onModuleDestroy() { - if (this.interval) clearInterval(this.interval); + if (cleanedUp > 0) + this.logger.log(`Cleaned up ${cleanedUp} expired images`); } } diff --git a/backend/src/managers/image/image.service.ts b/backend/src/managers/image/image.service.ts index aafa75e2..7b5f245b 100644 --- a/backend/src/managers/image/image.service.ts +++ b/backend/src/managers/image/image.service.ts @@ -19,9 +19,9 @@ import { ImageDBService } from '../../collections/image-db/image-db.service'; import { ImageFileDBService } from '../../collections/image-db/image-file-db.service'; import { SysPreferenceDbService } from '../../collections/preference-db/sys-preference-db.service'; import { UsrPreferenceDbService } from '../../collections/preference-db/usr-preference-db.service'; -import { EImageDerivativeBackend } from '../../database/entities/image-derivative.entity'; -import { EImageFileBackend } from '../../database/entities/image-file.entity'; -import { EImageBackend } from '../../database/entities/image.entity'; +import { EImageDerivativeBackend } from '../../database/entities/images/image-derivative.entity'; +import { EImageFileBackend } from '../../database/entities/images/image-file.entity'; +import { EImageBackend } from '../../database/entities/images/image.entity'; import { MutexFallBack } from '../../util/mutex-fallback'; import { ImageConverterService } from './image-converter.service'; import { ImageProcessorService } from './image-processor.service'; @@ -145,19 +145,15 @@ export class ImageManagerService { const converted_key = this.getConvertHash({ mime: fileType, ...options }); - const [save_derivatives, allow_editing] = await Promise.all([ - this.sysPref.getBooleanPreference(SysPreference.SaveDerivatives), - this.sysPref.getBooleanPreference(SysPreference.AllowEditing), - ]); - if (HasFailed(save_derivatives)) return save_derivatives; + const allow_editing = await this.sysPref.getBooleanPreference( + SysPreference.AllowEditing, + ); if (HasFailed(allow_editing)) return allow_editing; return MutexFallBack( converted_key, () => { - if (save_derivatives) - return this.imageFilesService.getDerivative(imageId, converted_key); - else return Promise.resolve(null); + return this.imageFilesService.getDerivative(imageId, converted_key); }, async () => { const masterImage = await this.getMaster(imageId); @@ -181,21 +177,12 @@ export class ImageManagerService { } in ${Date.now() - startTime}ms`, ); - if (save_derivatives) { - return await this.imageFilesService.addDerivative( - imageId, - converted_key, - convertResult.filetype, - convertResult.image, - ); - } else { - const derivative = new EImageDerivativeBackend(); - derivative.filetype = convertResult.filetype; - derivative.data = convertResult.image; - derivative.image_id = imageId; - derivative.key = converted_key; - return derivative; - } + return await this.imageFilesService.addDerivative( + imageId, + converted_key, + convertResult.filetype, + convertResult.image, + ); }, ); } @@ -256,7 +243,7 @@ export class ImageManagerService { let mime: string | undefined; if (filetypeResult === undefined) { - if (IsQOI(image)) mime = 'image/qoi'; + if (IsQOI(image)) mime = 'image/x-qoi'; } else { mime = filetypeResult.mime; } diff --git a/backend/src/managers/usage/usage.module.ts b/backend/src/managers/usage/usage.module.ts new file mode 100644 index 00000000..dfe6f560 --- /dev/null +++ b/backend/src/managers/usage/usage.module.ts @@ -0,0 +1,43 @@ +import { Logger, Module, OnModuleInit } from '@nestjs/common'; +import { SchedulerRegistry } from '@nestjs/schedule'; +import { ImageDBModule } from '../../collections/image-db/image-db.module'; +import { SystemStateDbModule } from '../../collections/system-state-db/system-state-db.module'; +import { UserDbModule } from '../../collections/user-db/user-db.module'; +import { LateConfigModule } from '../../config/late/late-config.module'; +import { UsageConfigService } from '../../config/late/usage.config.service'; +import { UsageService } from './usage.service'; + +@Module({ + imports: [LateConfigModule, SystemStateDbModule, ImageDBModule, UserDbModule], + providers: [UsageService], + exports: [UsageService], +}) +export class UsageManagerModule implements OnModuleInit { + private readonly logger = new Logger(UsageManagerModule.name); + + constructor( + private readonly usageService: UsageService, + private readonly usageConfigService: UsageConfigService, + private readonly schedulerRegistry: SchedulerRegistry, + ) {} + + async onModuleInit() { + if (!(await this.usageConfigService.getMetricsEnabled())) { + this.logger.log('Telemetry is disabled'); + } + + const interval = setInterval( + this.cronJob.bind(this), + await this.usageConfigService.getMetricsInterval(), + ); + this.schedulerRegistry.addInterval('usage', interval); + + this.cronJob(); + } + + private cronJob() { + this.usageService.execute().catch((err) => { + this.logger.warn(err); + }); + } +} diff --git a/backend/src/managers/usage/usage.service.ts b/backend/src/managers/usage/usage.service.ts new file mode 100644 index 00000000..237f8429 --- /dev/null +++ b/backend/src/managers/usage/usage.service.ts @@ -0,0 +1,160 @@ +import { Injectable, Logger } from '@nestjs/common'; +import isDocker from 'is-docker'; +import fetch from 'node-fetch'; +import os from 'os'; +import { FallbackIfFailed, HasFailed } from 'picsur-shared/dist/types'; +import { UUIDRegex } from 'picsur-shared/dist/util/common-regex'; +import { ImageDBService } from '../../collections/image-db/image-db.service'; +import { SystemStateDbService } from '../../collections/system-state-db/system-state-db.service'; +import { UserDbService } from '../../collections/user-db/user-db.service'; +import { HostConfigService } from '../../config/early/host.config.service'; +import { UsageConfigService } from '../../config/late/usage.config.service'; + +interface UsageData { + id?: string; + + uptime: number; + version: string; + demo_active: boolean; + + users: number; + images: number; + + architecture: string; + cpu_count: number; + ram_total: number; + hostname: string; + + is_docker: boolean; + is_production: boolean; +} + +@Injectable() +export class UsageService { + private readonly logger = new Logger(UsageService.name); + + constructor( + private readonly systemState: SystemStateDbService, + private readonly hostConfig: HostConfigService, + private readonly usageConfig: UsageConfigService, + private readonly userRepo: UserDbService, + private readonly imageRepo: ImageDBService, + ) {} + + public async execute() { + if (!(await this.usageConfig.getMetricsEnabled())) return; + + const id = await this.getSystemID(); + + if (id === null) { + await this.sendInitialData(); + } else { + await this.sendUpdateData(id); + } + } + + private async sendInitialData() { + const url = + (await this.usageConfig.getMetricsUrl()) + '/api/install/create'; + + const result: any = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(await this.collectData()), + }).then((res) => res.json()); + + const id = result?.data?.id; + if (typeof id !== 'string') + return this.logger.warn( + 'Invalid response when sending initial data: ' + JSON.stringify(result), + ); + if (!UUIDRegex.test(id)) + return this.logger.warn('Invalid system ID: ' + id); + + await this.setSystemID(id); + } + + private async sendUpdateData(id: string) { + const url = + (await this.usageConfig.getMetricsUrl()) + '/api/install/update'; + + const body = await this.collectData(); + body.id = id; + + const result = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (result.status < 200 || result.status >= 300) { + const data: any = await result.json(); + + if (data?.type === 'notfound') { + this.logger.warn('System ID not found, clearing'); + await this.clearSystemID(); + } else { + this.logger.warn( + 'Failed to send update data: ' + JSON.stringify(await result.json()), + ); + } + } + } + + private async getSystemID(): Promise { + const result = await this.systemState.get('systemID'); + if (HasFailed(result)) { + this.logger.warn(result); + return null; + } + if (result === null) return null; + if (UUIDRegex.test(result)) return result; + this.logger.warn('Invalid system ID'); + return null; + } + + private async setSystemID(id: string) { + if (!UUIDRegex.test(id)) { + return this.logger.warn('Invalid system ID'); + } + const result = await this.systemState.set('systemID', id); + if (HasFailed(result)) { + this.logger.warn(result); + } + } + + private async clearSystemID() { + const result = await this.systemState.clear('systemID'); + if (HasFailed(result)) { + this.logger.warn(result); + } + } + + private async collectData(): Promise { + const users = FallbackIfFailed(await this.userRepo.count(), 0, this.logger); + const images = FallbackIfFailed( + await this.imageRepo.count(), + 0, + this.logger, + ); + + const data: UsageData = { + uptime: Math.floor(process.uptime()), + version: this.hostConfig.getVersion(), + demo_active: this.hostConfig.isDemo(), + users, + images, + architecture: process.arch, + cpu_count: os.cpus().length, + ram_total: Math.floor(os.totalmem() / 1024 / 1024), + hostname: os.hostname(), + is_docker: isDocker(), + is_production: this.hostConfig.isProduction(), + }; + return data; + } +} diff --git a/backend/src/models/constants/syspreferences.const.ts b/backend/src/models/constants/syspreferences.const.ts deleted file mode 100644 index 05934cd5..00000000 --- a/backend/src/models/constants/syspreferences.const.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PrefValueTypeStrings } from 'picsur-shared/dist/dto/preferences.dto'; -import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum'; - -export type SysPreferences = SysPreference[]; -export const SysPreferenceList: string[] = Object.values(SysPreference); - -// Syspref Value types -export const SysPreferenceValueTypes: { - [key in SysPreference]: PrefValueTypeStrings; -} = { - [SysPreference.JwtSecret]: 'string', - [SysPreference.JwtExpiresIn]: 'string', - [SysPreference.BCryptStrength]: 'number', - - [SysPreference.RemoveDerivativesAfter]: 'string', - [SysPreference.SaveDerivatives]: 'boolean', - [SysPreference.AllowEditing]: 'boolean', - - [SysPreference.ConversionTimeLimit]: 'string', - [SysPreference.ConversionMemoryLimit]: 'number', -}; diff --git a/backend/src/models/constants/usrpreferences.const.ts b/backend/src/models/constants/usrpreferences.const.ts deleted file mode 100644 index bd11ba73..00000000 --- a/backend/src/models/constants/usrpreferences.const.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { PrefValueTypeStrings } from 'picsur-shared/dist/dto/preferences.dto'; -import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.enum'; - -export type UsrPreferences = UsrPreference[]; -export const UsrPreferenceList: string[] = Object.values(UsrPreference); - -// Syspref Value types -export const UsrPreferenceValueTypes: { - [key in UsrPreference]: PrefValueTypeStrings; -} = { - [UsrPreference.KeepOriginal]: 'boolean', -}; diff --git a/backend/src/models/dto/image-upload.dto.ts b/backend/src/models/dto/image-upload.dto.ts deleted file mode 100644 index b7a80163..00000000 --- a/backend/src/models/dto/image-upload.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createZodDto } from 'picsur-shared/dist/util/create-zod-dto'; -import { z } from 'zod'; -import { MultiPartFileDtoSchema } from './multipart.dto'; - -// A validation class for form based file upload of an image -export const ImageUploadDtoSchema = z.object({ - image: MultiPartFileDtoSchema, -}); -export class ImageUploadDto extends createZodDto(ImageUploadDtoSchema) {} diff --git a/backend/src/models/dto/multipart.dto.ts b/backend/src/models/dto/multipart.dto.ts deleted file mode 100644 index d2180ee8..00000000 --- a/backend/src/models/dto/multipart.dto.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { MultipartFile } from '@fastify/multipart'; -import { AsyncFailable, Fail, FT } from 'picsur-shared/dist/types'; -import { z } from 'zod'; - -export const MultiPartFileDtoSchema = z.object({ - fieldname: z.string(), - encoding: z.string(), - filename: z.string(), - mimetype: z.string(), - buffer: z.any(), - file: z.any(), -}); -export type MultiPartFileDto = z.infer; - -export async function CreateMultiPartFileDto( - file: MultipartFile, -): AsyncFailable { - try { - const buffer = await file.toBuffer(); - return { - fieldname: file.fieldname, - encoding: file.encoding, - filename: file.filename, - mimetype: file.mimetype, - buffer, - file: file.file, - }; - } catch (e) { - return Fail(FT.Internal, e); - } -} - -export const MultiPartFieldDtoSchema = z.object({ - fieldname: z.string(), - encoding: z.string(), - value: z.string(), -}); -export type MultiPartFieldDto = z.infer; - -export function CreateMultiPartFieldDto( - file: MultipartFile, -): MultiPartFieldDto { - return { - fieldname: file.fieldname, - encoding: file.encoding, - value: (file as any).value, - }; -} diff --git a/backend/src/models/transformers/user.transformer.ts b/backend/src/models/transformers/user.transformer.ts index e16cb55f..a9c10c1c 100644 --- a/backend/src/models/transformers/user.transformer.ts +++ b/backend/src/models/transformers/user.transformer.ts @@ -1,5 +1,5 @@ import { EUser } from 'picsur-shared/dist/entities/user.entity'; -import { EUserBackend } from '../../database/entities/user.entity'; +import { EUserBackend } from '../../database/entities/users/user.entity'; export function EUserBackend2EUser(eUser: EUserBackend): EUser { if (eUser.hashed_password === undefined) return eUser as EUser; diff --git a/backend/src/routes/api/api.module.ts b/backend/src/routes/api/api.module.ts index 9ad8ccf4..13723330 100644 --- a/backend/src/routes/api/api.module.ts +++ b/backend/src/routes/api/api.module.ts @@ -4,6 +4,7 @@ import { ExperimentModule } from './experiment/experiment.module'; import { InfoModule } from './info/info.module'; import { PrefModule } from './pref/pref.module'; import { RolesApiModule } from './roles/roles.module'; +import { UsageApiModule } from './usage/usage.module'; import { UserApiModule } from './user/user.module'; @Module({ @@ -14,6 +15,7 @@ import { UserApiModule } from './user/user.module'; InfoModule, RolesApiModule, ApiKeysModule, + UsageApiModule, ], }) export class PicsurApiModule {} diff --git a/backend/src/routes/api/apikeys/apikeys.controller.ts b/backend/src/routes/api/apikeys/apikeys.controller.ts index 0c15fdea..02e58730 100644 --- a/backend/src/routes/api/apikeys/apikeys.controller.ts +++ b/backend/src/routes/api/apikeys/apikeys.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { ApiKeyCreateResponse, ApiKeyDeleteRequest, @@ -53,6 +54,7 @@ export class ApiKeysController { @Post('create') @Returns(ApiKeyCreateResponse) + @Throttle(10) async createApiKey( @ReqUserID() userID: string, ): Promise { diff --git a/backend/src/routes/api/experiment/experiment.controller.ts b/backend/src/routes/api/experiment/experiment.controller.ts index b43a2c12..4aeaeb4e 100644 --- a/backend/src/routes/api/experiment/experiment.controller.ts +++ b/backend/src/routes/api/experiment/experiment.controller.ts @@ -1,22 +1,18 @@ -import { Controller, Get, Request, Response } from '@nestjs/common'; -import type { FastifyReply } from 'fastify'; -import { UserInfoResponse } from 'picsur-shared/dist/dto/api/user-manage.dto'; +import { Controller } from '@nestjs/common'; import { NoPermissions } from '../../../decorators/permissions.decorator'; -import { Returns } from '../../../decorators/returns.decorator'; -import type AuthFastifyRequest from '../../../models/interfaces/authrequest.dto'; @Controller('api/experiment') @NoPermissions() export class ExperimentController { constructor() {} - @Get() - @Returns(UserInfoResponse) - async testRoute( - @Request() req: AuthFastifyRequest, - @Response({ passthrough: true }) res: FastifyReply, - ): Promise { - res.header('Location', '/error/delete-success'); - res.code(302); - return req.user; - } + // @Get() + // @Returns(UserInfoResponse) + // async testRoute( + // @Request() req: AuthFastifyRequest, + // @Response({ passthrough: true }) res: FastifyReply, + // ): Promise { + // res.header('Location', '/error/delete-success'); + // res.code(302); + // return req.user; + // } } diff --git a/backend/src/routes/api/info/info.controller.ts b/backend/src/routes/api/info/info.controller.ts index d853dc13..8d575b9c 100644 --- a/backend/src/routes/api/info/info.controller.ts +++ b/backend/src/routes/api/info/info.controller.ts @@ -10,7 +10,11 @@ import { SupportedAnimFileTypes, SupportedImageFileTypes, } from 'picsur-shared/dist/dto/mimes.dto'; +import { TrackingState } from 'picsur-shared/dist/dto/tracking-state.enum'; +import { FallbackIfFailed } from 'picsur-shared/dist/types'; import { HostConfigService } from '../../../config/early/host.config.service'; +import { InfoConfigService } from '../../../config/late/info.config.service'; +import { UsageConfigService } from '../../../config/late/usage.config.service'; import { NoPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; import { PermissionsList } from '../../../models/constants/permissions.const'; @@ -18,15 +22,29 @@ import { PermissionsList } from '../../../models/constants/permissions.const'; @Controller('api/info') @NoPermissions() export class InfoController { - constructor(private readonly hostConfig: HostConfigService) {} + constructor( + private readonly hostConfig: HostConfigService, + private readonly infoConfig: InfoConfigService, + private readonly usageService: UsageConfigService, + ) {} @Get() @Returns(InfoResponse) async getInfo(): Promise { + const trackingID = + FallbackIfFailed(await this.usageService.getTrackingID(), null) ?? + undefined; + const hostOverride = await this.infoConfig.getHostnameOverride(); + return { demo: this.hostConfig.isDemo(), production: this.hostConfig.isProduction(), version: this.hostConfig.getVersion(), + host_override: hostOverride, + tracking: { + id: trackingID, + state: TrackingState.Detailed, + }, }; } diff --git a/backend/src/routes/api/info/info.module.ts b/backend/src/routes/api/info/info.module.ts index 1f2c6b73..2a871817 100644 --- a/backend/src/routes/api/info/info.module.ts +++ b/backend/src/routes/api/info/info.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common'; -import { EarlyConfigModule } from '../../../config/early/early-config.module'; +import { LateConfigModule } from '../../../config/late/late-config.module'; import { InfoController } from './info.controller'; @Module({ - imports: [EarlyConfigModule], + imports: [LateConfigModule], controllers: [InfoController], }) export class InfoModule {} diff --git a/backend/src/routes/api/pref/sys-pref.controller.ts b/backend/src/routes/api/pref/sys-pref.controller.ts index 8c5e448c..8992c2c4 100644 --- a/backend/src/routes/api/pref/sys-pref.controller.ts +++ b/backend/src/routes/api/pref/sys-pref.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Logger, Param, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { GetPreferenceResponse, MultiplePreferencesResponse, @@ -20,6 +21,7 @@ export class SysPrefController { @Get() @Returns(MultiplePreferencesResponse) + @Throttle(20) async getAllSysPrefs(): Promise { const prefs = ThrowIfFailed(await this.prefService.getAllPreferences()); @@ -39,6 +41,7 @@ export class SysPrefController { @Post(':key') @Returns(UpdatePreferenceResponse) + @Throttle(30) async setSysPref( @Param('key') key: string, @Body() body: UpdatePreferenceRequest, diff --git a/backend/src/routes/api/pref/usr-pref.controller.ts b/backend/src/routes/api/pref/usr-pref.controller.ts index 33f33ff5..9451c564 100644 --- a/backend/src/routes/api/pref/usr-pref.controller.ts +++ b/backend/src/routes/api/pref/usr-pref.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Logger, Param, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { GetPreferenceResponse, MultiplePreferencesResponse, @@ -21,7 +22,8 @@ export class UsrPrefController { @Get() @Returns(MultiplePreferencesResponse) - async getAllSysPrefs( + @Throttle(20) + async getAllUsrPrefs( @ReqUserID() userid: string, ): Promise { const prefs = ThrowIfFailed( @@ -36,7 +38,7 @@ export class UsrPrefController { @Get(':key') @Returns(GetPreferenceResponse) - async getSysPref( + async getUsrPref( @Param('key') key: string, @ReqUserID() userid: string, ): Promise { @@ -49,7 +51,8 @@ export class UsrPrefController { @Post(':key') @Returns(UpdatePreferenceResponse) - async setSysPref( + @Throttle(30) + async setUsrPref( @Param('key') key: string, @ReqUserID() userid: string, @Body() body: UpdatePreferenceRequest, diff --git a/backend/src/routes/api/roles/roles.controller.ts b/backend/src/routes/api/roles/roles.controller.ts index 9b4d71df..9c28cfd9 100644 --- a/backend/src/routes/api/roles/roles.controller.ts +++ b/backend/src/routes/api/roles/roles.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Logger, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { RoleCreateRequest, RoleCreateResponse, @@ -56,6 +57,7 @@ export class RolesController { @Post('update') @Returns(RoleUpdateResponse) + @Throttle(20) async updateRole( @Body() body: RoleUpdateRequest, ): Promise { @@ -73,6 +75,7 @@ export class RolesController { @Post('create') @Returns(RoleCreateResponse) + @Throttle(10) async createRole( @Body() role: RoleCreateRequest, ): Promise { diff --git a/backend/src/routes/api/usage/usage.controller.ts b/backend/src/routes/api/usage/usage.controller.ts new file mode 100644 index 00000000..3321836a --- /dev/null +++ b/backend/src/routes/api/usage/usage.controller.ts @@ -0,0 +1,47 @@ +import { Controller, Logger, Post, Req, Res } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; +import type { FastifyReply, FastifyRequest } from 'fastify'; +import { Fail, FT, ThrowIfFailed } from 'picsur-shared/dist/types'; +import { UsageConfigService } from '../../../config/late/usage.config.service'; +import { NoPermissions } from '../../../decorators/permissions.decorator'; +import { ReturnsAnything } from '../../../decorators/returns.decorator'; + +@Controller('api/usage') +@NoPermissions() +export class UsageController { + private readonly logger = new Logger(UsageController.name); + + constructor(private readonly usageService: UsageConfigService) {} + + @Post(['report', 'report/*']) + @ReturnsAnything() + @Throttle(120) + async deleteRole( + @Req() req: FastifyRequest, + @Res({ + passthrough: true, + }) + res: FastifyReply, + ) { + const trackingUrl = ThrowIfFailed(await this.usageService.getTrackingUrl()); + + if (trackingUrl === null) { + throw Fail(FT.NotFound, undefined, 'Tracking URL not set'); + } + + await res.from(`${trackingUrl}/api`, { + rewriteRequestHeaders(request, headers) { + const req = request as any as FastifyRequest; + + // remove cookies + delete headers.cookie; + + // Add real ip, this should not work, but ackee uses a bad ip resolver + // So we might aswell use it + headers['X-Forwarded-For'] = req.ip; + + return headers; + }, + }); + } +} diff --git a/backend/src/routes/api/usage/usage.module.ts b/backend/src/routes/api/usage/usage.module.ts new file mode 100644 index 00000000..3d5b4703 --- /dev/null +++ b/backend/src/routes/api/usage/usage.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { LateConfigModule } from '../../../config/late/late-config.module'; +import { UsageController } from './usage.controller'; + +@Module({ + imports: [LateConfigModule], + controllers: [UsageController], +}) +export class UsageApiModule {} diff --git a/backend/src/routes/api/user/user-manage.controller.ts b/backend/src/routes/api/user/user-manage.controller.ts index 7bbb0c9b..865c531f 100644 --- a/backend/src/routes/api/user/user-manage.controller.ts +++ b/backend/src/routes/api/user/user-manage.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Logger, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { GetSpecialUsersResponse, UserCreateRequest, @@ -46,6 +47,7 @@ export class UserAdminController { @Post('create') @Returns(UserCreateResponse) + @Throttle(10) async register( @Body() create: UserCreateRequest, ): Promise { @@ -78,6 +80,7 @@ export class UserAdminController { @Post('update') @Returns(UserUpdateResponse) + @Throttle(20) async setPermissions( @Body() body: UserUpdateRequest, ): Promise { diff --git a/backend/src/routes/api/user/user.controller.ts b/backend/src/routes/api/user/user.controller.ts index c587b88c..19781a7e 100644 --- a/backend/src/routes/api/user/user.controller.ts +++ b/backend/src/routes/api/user/user.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Logger, Post } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import { UserCheckNameRequest, UserCheckNameResponse, @@ -34,6 +35,7 @@ export class UserController { @Post('login') @Returns(UserLoginResponse) @UseLocalAuth(Permission.UserLogin) + @Throttle(30, 300) async login(@ReqUser() user: EUser): Promise { const jwt_token = ThrowIfFailed(await this.authService.createToken(user)); @@ -43,6 +45,7 @@ export class UserController { @Post('register') @Returns(UserRegisterResponse) @RequiredPermissions(Permission.UserRegister) + @Throttle(5, 300) async register( @Body() register: UserRegisterRequest, ): Promise { @@ -56,6 +59,7 @@ export class UserController { @Post('checkname') @Returns(UserCheckNameResponse) @RequiredPermissions(Permission.UserRegister) + @Throttle(20) async checkName( @Body() checkName: UserCheckNameRequest, ): Promise { @@ -67,6 +71,7 @@ export class UserController { @Get('me') @Returns(UserMeResponse) @RequiredPermissions(Permission.UserKeepLogin) + @Throttle(10) async me(@ReqUserID() userid: string): Promise { const backenduser = ThrowIfFailed(await this.usersService.findOne(userid)); @@ -81,6 +86,7 @@ export class UserController { @Get('me/permissions') @Returns(UserMePermissionsResponse) @NoPermissions() + @Throttle(20) async refresh( @ReqUserID() userid: string, ): Promise { diff --git a/backend/src/routes/image/image-manage.controller.ts b/backend/src/routes/image/image-manage.controller.ts index cece5a51..765b0693 100644 --- a/backend/src/routes/image/image-manage.controller.ts +++ b/backend/src/routes/image/image-manage.controller.ts @@ -7,6 +7,7 @@ import { Post, Res, } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; import type { FastifyReply } from 'fastify'; import { ImageDeleteRequest, @@ -20,8 +21,9 @@ import { ImageUploadResponse, } from 'picsur-shared/dist/dto/api/image-manage.dto'; import { Permission } from 'picsur-shared/dist/dto/permissions.enum'; -import { HasFailed, ThrowIfFailed } from 'picsur-shared/dist/types'; -import { MultiPart } from '../../decorators/multipart/multipart.decorator'; +import { Fail, FT, HasFailed, ThrowIfFailed } from 'picsur-shared/dist/types'; +import { PostFiles } from '../../decorators/multipart/multipart.decorator'; +import type { FileIterator } from '../../decorators/multipart/postfiles.pipe'; import { HasPermission, RequiredPermissions, @@ -29,7 +31,7 @@ import { import { ReqUserID } from '../../decorators/request-user.decorator'; import { Returns } from '../../decorators/returns.decorator'; import { ImageManagerService } from '../../managers/image/image.service'; -import { ImageUploadDto } from '../../models/dto/image-upload.dto'; +import { GetNextAsync } from '../../util/iterator'; @Controller('api/image') @RequiredPermissions(Permission.ImageUpload) export class ImageManageController { @@ -39,16 +41,26 @@ export class ImageManageController { @Post('upload') @Returns(ImageUploadResponse) + @Throttle(20) async uploadImage( - @MultiPart() multipart: ImageUploadDto, + @PostFiles(1) multipart: FileIterator, @ReqUserID() userid: string, @HasPermission(Permission.ImageDeleteKey) withDeleteKey: boolean, ): Promise { + const file = ThrowIfFailed(await GetNextAsync(multipart)); + + let buffer: Buffer; + try { + buffer = await file.toBuffer(); + } catch (e) { + throw Fail(FT.Internal, e); + } + const image = ThrowIfFailed( await this.imagesService.upload( userid, - multipart.image.filename, - multipart.image.buffer, + file.filename, + buffer, withDeleteKey, ), ); diff --git a/backend/src/routes/image/image.controller.ts b/backend/src/routes/image/image.controller.ts index 0e3bb9d2..6dda3afd 100644 --- a/backend/src/routes/image/image.controller.ts +++ b/backend/src/routes/image/image.controller.ts @@ -1,4 +1,5 @@ import { Controller, Get, Head, Logger, Query, Res } from '@nestjs/common'; +import { SkipThrottle } from '@nestjs/throttler'; import type { FastifyReply } from 'fastify'; import { ImageMetaResponse, @@ -21,6 +22,7 @@ import { BrandMessageType, GetBrandMessage } from '../../util/branding'; // This is the only controller with CORS enabled @Controller('i') @RequiredPermissions(Permission.ImageView) +@SkipThrottle() export class ImageController { private readonly logger = new Logger(ImageController.name); diff --git a/backend/src/routes/image/image.module.ts b/backend/src/routes/image/image.module.ts index dd61c516..5249cf54 100644 --- a/backend/src/routes/image/image.module.ts +++ b/backend/src/routes/image/image.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { UserDbModule } from '../../collections/user-db/user-db.module'; import { DecoratorsModule } from '../../decorators/decorators.module'; -import { ImageManagerModule } from '../../managers/image/image.module'; +import { ImageManagerModule } from '../../managers/image/image-manager.module'; import { ImageManageController } from './image-manage.controller'; import { ImageController } from './image.controller'; diff --git a/backend/src/util/iterator.ts b/backend/src/util/iterator.ts new file mode 100644 index 00000000..58502cd7 --- /dev/null +++ b/backend/src/util/iterator.ts @@ -0,0 +1,9 @@ +import { AsyncFailable, Fail, FT } from 'picsur-shared/dist/types'; + +export async function GetNextAsync( + iterator: AsyncIterableIterator, +): AsyncFailable { + const { done, value } = await iterator.next(); + if (done) return Fail(FT.BadRequest); + return value; +} diff --git a/frontend/angular.json b/frontend/angular.json index 6e5764b0..5c78169f 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -41,7 +41,9 @@ "scripts": [], "allowedCommonJsDependencies": [ "ngx-auto-unsubscribe-decorator", - "moment" + "moment", + "platform", + "form-data" ], "optimization": true, "webWorkerTsConfig": "tsconfig.worker.json", @@ -54,7 +56,7 @@ "budgets": [ { "type": "initial", - "maximumWarning": "1500kb", + "maximumWarning": "1mb", "maximumError": "2mb" }, { @@ -102,6 +104,5 @@ } } } - }, - "defaultProject": "picsur-frontend" + } } diff --git a/frontend/custom-webpack.config.js b/frontend/custom-webpack.config.js index 0357b877..7e178769 100644 --- a/frontend/custom-webpack.config.js +++ b/frontend/custom-webpack.config.js @@ -1,5 +1,9 @@ import webpack from 'webpack'; +// import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; export default { - plugins: [new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/)], + plugins: [ + new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/), + // new BundleAnalyzerPlugin(), + ], }; diff --git a/frontend/package.json b/frontend/package.json index 0196e526..c1b5f72a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "picsur-frontend", - "version": "0.4.1", + "version": "0.5.0", "description": "Frontend for Picsur", "license": "GPL-3.0", "repository": "https://github.com/rubikscraft/Picsur", @@ -14,30 +14,34 @@ "purge": "rm -rf dist && rm -rf node_modules && rm -rf .angular" }, "devDependencies": { - "@angular-builders/custom-webpack": "^14.0.1", - "@angular-devkit/build-angular": "14.2.5", - "@angular/animations": "^14.2.5", - "@angular/cdk": "^14.2.4", - "@angular/cli": "^14.2.5", - "@angular/common": "^14.2.5", - "@angular/compiler": "^14.2.5", - "@angular/compiler-cli": "^14.2.5", - "@angular/core": "^14.2.5", - "@angular/forms": "^14.2.5", - "@angular/material": "^14.2.4", - "@angular/platform-browser": "^14.2.5", - "@angular/platform-browser-dynamic": "^14.2.5", - "@angular/router": "^14.2.5", + "@angular-builders/custom-webpack": "^15.0.0", + "@angular-devkit/build-angular": "^15.0.4", + "@angular/animations": "^15.0.4", + "@angular/cdk": "^15.0.3", + "@angular/cli": "^15.0.4", + "@angular/common": "^15.0.4", + "@angular/compiler": "^15.0.4", + "@angular/compiler-cli": "^15.0.4", + "@angular/core": "^15.0.4", + "@angular/forms": "^15.0.4", + "@angular/material": "^15.0.3", + "@angular/platform-browser": "^15.0.4", + "@angular/platform-browser-dynamic": "^15.0.4", + "@angular/router": "^15.0.4", "@fontsource/material-icons": "^4.5.4", "@fontsource/material-icons-outlined": "^4.5.4", "@fontsource/roboto": "^4.5.8", - "@ng-web-apis/common": "^2.0.1", + "@ng-web-apis/common": "^2.1.0", "@ng-web-apis/resize-observer": "^2.0.0", "@ngui/common": "^1.0.0", - "@types/node": "^18.8.4", + "@types/ackee-tracker": "^5.0.2", + "@types/node": "^18.11.17", "@types/resize-observer-browser": "^0.1.7", - "@types/validator": "^13.7.7", - "bootstrap": "^5.2.2", + "@types/validator": "^13.7.10", + "ackee-tracker": "^5.1.0", + "axios": "^1.2.1", + "bootstrap": "^5.2.3", + "caniuse-lite": "^1.0.30001441", "fuse.js": "^6.6.2", "jwt-decode": "^3.1.2", "moment": "^2.29.4", @@ -47,10 +51,11 @@ "ngx-moment": "^6.0.2", "picsur-shared": "*", "reflect-metadata": "^0.1.13", - "rxjs": "~7.5.7", - "tslib": "^2.4.0", - "typescript": "4.8.4", - "zod": "^3.19.1", - "zone.js": "~0.11.8" + "rxjs": "^7.8.0", + "tslib": "^2.4.1", + "typescript": "^4.9.4", + "webpack-bundle-analyzer": "^4.7.0", + "zod": "^3.20.2", + "zone.js": "^0.12.0" } } diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index c2a1feb6..bbf38e5c 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -1,6 +1,7 @@ diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 5e160b34..c82100f6 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -5,11 +5,13 @@ import { ActivatedRoute, NavigationEnd, NavigationError, + NavigationStart, Router, } from '@angular/router'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { RouteTransitionAnimations } from './app.animation'; import { PRouteData } from './models/dto/picsur-routes.dto'; +import { UsageService } from './services/usage/usage.service'; import { BootstrapService } from './util/bootstrap.service'; @Component({ @@ -23,6 +25,9 @@ export class AppComponent implements OnInit { @ViewChild(MatSidenav) sidebar: MatSidenav; + loading: boolean = false; + private loadingTimeout: number | null = null; + wrapContentWithContainer: boolean = true; sidebarPortal: Portal | undefined = undefined; @@ -33,7 +38,10 @@ export class AppComponent implements OnInit { private readonly router: Router, private readonly activatedRoute: ActivatedRoute, private readonly bootstrapService: BootstrapService, - ) {} + usageService: UsageService, + ) { + usageService; + } public getRouteAnimData() { // Everyone is doing shit with the activated route @@ -50,6 +58,12 @@ export class AppComponent implements OnInit { @AutoUnsubscribe() private subscribeRouter() { return this.router.events.subscribe((event) => { + if (event instanceof NavigationStart) { + this.loadingStart(); + } + if (event instanceof NavigationEnd) { + this.loadingEnd(); + } if (event instanceof NavigationEnd) this.onNavigationEnd(event); if (event instanceof NavigationError) this.onNavigationError(event); }); @@ -83,6 +97,21 @@ export class AppComponent implements OnInit { this.updateSidebar(); } + private loadingStart() { + if (this.loadingTimeout !== null) clearTimeout(this.loadingTimeout); + + this.loadingTimeout = window.setTimeout(() => { + this.loading = true; + }, 500); + } + + private loadingEnd() { + if (this.loadingTimeout !== null) clearTimeout(this.loadingTimeout); + this.loadingTimeout = null; + + this.loading = false; + } + private updateSidebar() { if (!this.sidebar) return; diff --git a/frontend/src/app/app.routing.module.ts b/frontend/src/app/app.routing.module.ts index 14e48423..dbccf159 100644 --- a/frontend/src/app/app.routing.module.ts +++ b/frontend/src/app/app.routing.module.ts @@ -1,13 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { PRoutes } from './models/dto/picsur-routes.dto'; -import { ErrorsRouteModule } from './routes/errors/errors.module'; -import { ImagesRouteModule } from './routes/images/images.module'; -import { ProcessingRouteModule } from './routes/processing/processing.module'; -import { SettingsRouteModule } from './routes/settings/settings.module'; -import { UploadRouteModule } from './routes/upload/upload.module'; -import { UserRouteModule } from './routes/user/user.module'; -import { ViewRouteModule } from './routes/view/view.module'; const routes: PRoutes = [ { @@ -17,31 +10,38 @@ const routes: PRoutes = [ }, { path: 'upload', - loadChildren: () => UploadRouteModule, + loadChildren: () => + import('./routes/upload/upload.module').then((m) => m.default), }, { path: 'processing', - loadChildren: () => ProcessingRouteModule, + loadChildren: () => + import('./routes/processing/processing.module').then((m) => m.default), }, { path: 'view', - loadChildren: () => ViewRouteModule, + loadChildren: () => + import('./routes/view/view.module').then((m) => m.default), }, { path: 'user', - loadChildren: () => UserRouteModule, + loadChildren: () => + import('./routes/user/user.module').then((m) => m.default), }, { path: 'images', - loadChildren: () => ImagesRouteModule, + loadChildren: () => + import('./routes/images/images.module').then((m) => m.default), }, { path: 'settings', - loadChildren: () => SettingsRouteModule, + loadChildren: () => + import('./routes/settings/settings.module').then((m) => m.default), }, { path: 'error', - loadChildren: () => ErrorsRouteModule, + loadChildren: () => + import('./routes/errors/errors.module').then((m) => m.default), }, ]; diff --git a/frontend/src/app/components/copy-field/copy-field.component.html b/frontend/src/app/components/copy-field/copy-field.component.html index d8a0dca1..c01dca8b 100644 --- a/frontend/src/app/components/copy-field/copy-field.component.html +++ b/frontend/src/app/components/copy-field/copy-field.component.html @@ -1,4 +1,8 @@ - + {{ label }} (); @Output('hide') onHide = new EventEmitter(); diff --git a/frontend/src/app/components/fab/normal/fab.component.ts b/frontend/src/app/components/fab/normal/fab.component.ts index ef537004..3264bd2d 100644 --- a/frontend/src/app/components/fab/normal/fab.component.ts +++ b/frontend/src/app/components/fab/normal/fab.component.ts @@ -7,7 +7,7 @@ import { Component, Input } from '@angular/core'; export class FabComponent { @Input('aria-label') ariaLabel: string = 'Floating Action Button'; @Input() icon: string = 'add'; - @Input() color: string = 'accent'; + @Input() color: string = 'primary'; @Input('tooltip') tooltip: string; @Input() onClick: () => void = () => {}; diff --git a/frontend/src/app/components/fab/speed-dial/speed-dial-option.directive.ts b/frontend/src/app/components/fab/speed-dial/speed-dial-option.directive.ts index 206abadd..8f03bff8 100644 --- a/frontend/src/app/components/fab/speed-dial/speed-dial-option.directive.ts +++ b/frontend/src/app/components/fab/speed-dial/speed-dial-option.directive.ts @@ -1,5 +1,5 @@ import { Directive, Host, Optional } from '@angular/core'; -import { MatButton } from '@angular/material/button'; +import { MatMiniFabButton } from '@angular/material/button'; import { MatTooltip } from '@angular/material/tooltip'; @Directive({ @@ -8,9 +8,9 @@ import { MatTooltip } from '@angular/material/tooltip'; export class SpeedDialOptionDirective { constructor( @Host() @Optional() tooltip?: MatTooltip, - @Host() @Optional() button?: MatButton, + @Host() @Optional() button?: MatMiniFabButton, ) { if (tooltip) tooltip.position = 'left'; - if (button) button.color = 'primary'; + if (button) button.color = 'accent'; } } diff --git a/frontend/src/app/components/fab/speed-dial/speed-dial.component.ts b/frontend/src/app/components/fab/speed-dial/speed-dial.component.ts index 8cbc90ea..36237623 100644 --- a/frontend/src/app/components/fab/speed-dial/speed-dial.component.ts +++ b/frontend/src/app/components/fab/speed-dial/speed-dial.component.ts @@ -13,7 +13,7 @@ export class SpeedDialComponent { @Input('icon') icon: string = 'add'; @Input('icon-hover') iconHover: string = 'close'; - @Input('color') color: string = 'accent'; + @Input('color') color: string = 'primary'; @Input('open-on-hover') openOnHover: boolean = false; @Input('tooltip') tooltip: string; diff --git a/frontend/src/app/components/footer/footer.component.scss b/frontend/src/app/components/footer/footer.component.scss index 73fb6bf2..1bf2a60e 100644 --- a/frontend/src/app/components/footer/footer.component.scss +++ b/frontend/src/app/components/footer/footer.component.scss @@ -3,7 +3,7 @@ footer { flex-direction: column; align-items: center; - margin-top: 16px; + margin-top: 1em; text-align: center; } diff --git a/frontend/src/app/components/header/header.component.html b/frontend/src/app/components/header/header.component.html index df891434..860bcfb0 100644 --- a/frontend/src/app/components/header/header.component.html +++ b/frontend/src/app/components/header/header.component.html @@ -1,4 +1,11 @@ - + + + + + {{ getErrorMessage() }} + + - -
-
-

{{ name }}

-
-
- - - -
+ +
+ + {{ name }} + + + + {{ getErrorMessage() }} + +
- -
-
-

{{ name }}

-
-
- -
+ +
+ + {{ name }} + + No + Yes + + + + {{ getErrorMessage() }} + +
diff --git a/frontend/src/app/components/pref-option/pref-option.component.scss b/frontend/src/app/components/pref-option/pref-option.component.scss index 1b541098..8b35c294 100644 --- a/frontend/src/app/components/pref-option/pref-option.component.scss +++ b/frontend/src/app/components/pref-option/pref-option.component.scss @@ -1,5 +1,6 @@ mat-form-field { min-width: 50%; + margin-block: 0.5rem; } .y-center { @@ -7,3 +8,11 @@ mat-form-field { display: flex; flex-direction: column; } + +h3 { + margin: 0; +} + +mat-slide-toggle { + margin-block: 1rem; +} diff --git a/frontend/src/app/components/pref-option/pref-option.component.ts b/frontend/src/app/components/pref-option/pref-option.component.ts index 22dfcddb..a53e56f0 100644 --- a/frontend/src/app/components/pref-option/pref-option.component.ts +++ b/frontend/src/app/components/pref-option/pref-option.component.ts @@ -1,15 +1,17 @@ import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl, FormControl, ValidationErrors } from '@angular/forms'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { DecodedPref, PrefValueType, } from 'picsur-shared/dist/dto/preferences.dto'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; -import { Subject } from 'rxjs'; +import { filter } from 'rxjs'; import { Required } from 'src/app/models/decorators/required.decorator'; import { Logger } from 'src/app/services/logger/logger.service'; import { ErrorService } from 'src/app/util/error-manager/error.service'; import { Throttle } from 'src/app/util/throttle'; +import { ZodTypeAny } from 'zod'; @Component({ selector: 'pref-option', @@ -19,16 +21,28 @@ import { Throttle } from 'src/app/util/throttle'; export class PrefOptionComponent implements OnInit { private readonly logger = new Logger(PrefOptionComponent.name); - @Input() @Required pref: DecodedPref; + public formControl = new FormControl(undefined, { + updateOn: 'blur', + validators: this.syncValidator.bind(this), + }); + + private pref: DecodedPref; + @Input('pref') set prefSet(pref: DecodedPref) { + this.pref = pref; + this.formControl.setValue(pref.value); + } + get type() { + return this.pref.type; + } + @Input('update') @Required updateFunction: ( key: string, pref: PrefValueType, ) => AsyncFailable; - @Input() @Required translator: { - [key in string]: string; - }; - private updateSubject = new Subject(); + @Input() @Required name: string = ''; + @Input() helpText: string = ''; + @Input() validator?: ZodTypeAny = undefined; constructor(private readonly errorService: ErrorService) {} @@ -36,44 +50,27 @@ export class PrefOptionComponent implements OnInit { this.subscribeUpdate(); } - get name(): string { - return this.translator[this.pref.key] ?? this.pref.key; - } - - get valString(): string { - if (this.pref.type !== 'string') { - throw new Error('Not a string preference'); + getErrorMessage() { + if (this.formControl.errors) { + const errors = this.formControl.errors; + if (errors['error']) { + return errors['error']; + } + return 'Invalid value'; } - return this.pref.value as string; + return ''; } - get valNumber(): number { - if (this.pref.type !== 'number') { - throw new Error('Not an int preference'); - } - return this.pref.value as number; - } + private syncValidator(control: AbstractControl): ValidationErrors | null { + if (!this.validator) return null; - get valBool(): boolean { - if (this.pref.type !== 'boolean') { - throw new Error('Not a boolean preference'); - } - return this.pref.value as boolean; - } - - update(value: any) { - this.updateSubject.next(value); - } + const result = this.validator.safeParse(control.value); - stringUpdateWrapper(e: Event) { - this.update((e.target as HTMLInputElement).value); - } - - numberUpdateWrapper(e: Event) { - const value = (e.target as HTMLInputElement).valueAsNumber; - if (isNaN(value)) return; + if (!result.success) { + return { error: result.error.issues[0]?.message ?? 'Invalid value' }; + } - this.update(value); + return null; } private async updatePreference(value: PrefValueType) { @@ -97,8 +94,11 @@ export class PrefOptionComponent implements OnInit { @AutoUnsubscribe() subscribeUpdate() { - return this.updateSubject - .pipe(Throttle(300)) + return this.formControl.valueChanges + .pipe( + filter((value) => this.formControl.errors === null), + Throttle(300), + ) .subscribe(this.updatePreference.bind(this)); } } diff --git a/frontend/src/app/components/pref-option/pref-option.module.ts b/frontend/src/app/components/pref-option/pref-option.module.ts index 27535c6c..7137851a 100644 --- a/frontend/src/app/components/pref-option/pref-option.module.ts +++ b/frontend/src/app/components/pref-option/pref-option.module.ts @@ -1,8 +1,12 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { ErrorManagerModule } from 'src/app/util/error-manager/error-manager.module'; import { PrefOptionComponent } from './pref-option.component'; @@ -11,9 +15,13 @@ import { PrefOptionComponent } from './pref-option.component'; CommonModule, ErrorManagerModule, + MatIconModule, + MatTooltipModule, + MatButtonModule, + ReactiveFormsModule, MatFormFieldModule, MatInputModule, - MatSlideToggleModule, + MatSelectModule, ], declarations: [PrefOptionComponent], exports: [PrefOptionComponent], diff --git a/frontend/src/app/components/values-picker/values-picker.component.html b/frontend/src/app/components/values-picker/values-picker.component.html index 6da4a073..73af6e7e 100644 --- a/frontend/src/app/components/values-picker/values-picker.component.html +++ b/frontend/src/app/components/values-picker/values-picker.component.html @@ -1,7 +1,7 @@ - + {{ nameCapMul }} - - + cancel - + - + :not(:first-of-type) { + margin-left: 1em; +} diff --git a/frontend/src/app/routes/images/images.module.ts b/frontend/src/app/routes/images/images.module.ts index a4c313c0..6b78689c 100644 --- a/frontend/src/app/routes/images/images.module.ts +++ b/frontend/src/app/routes/images/images.module.ts @@ -31,4 +31,4 @@ import { ImagesRoutingModule } from './images.routing.module'; PipesModule, ], }) -export class ImagesRouteModule {} +export default class ImagesRouteModule {} diff --git a/frontend/src/app/routes/processing/processing.component.html b/frontend/src/app/routes/processing/processing.component.html index 2432ba60..67ef4ee7 100644 --- a/frontend/src/app/routes/processing/processing.component.html +++ b/frontend/src/app/routes/processing/processing.component.html @@ -1,6 +1,6 @@

Processing

- +
diff --git a/frontend/src/app/routes/processing/processing.component.ts b/frontend/src/app/routes/processing/processing.component.ts index 0f6e3c22..114ec27d 100644 --- a/frontend/src/app/routes/processing/processing.component.ts +++ b/frontend/src/app/routes/processing/processing.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { Fail, FT, HasFailed } from 'picsur-shared/dist/types'; import { ProcessingViewMeta } from 'src/app/models/dto/processing-view-meta.dto'; +import { ApiService } from 'src/app/services/api/api.service'; import { ImageService } from 'src/app/services/api/image.service'; import { Logger } from 'src/app/services/logger/logger.service'; import { ErrorService } from 'src/app/util/error-manager/error.service'; @@ -16,11 +17,12 @@ export class ProcessingComponent implements OnInit { private readonly router: Router, private readonly imageService: ImageService, private readonly errorService: ErrorService, + private readonly apiService: ApiService, ) {} async ngOnInit() { const state = history.state as ProcessingViewMeta; - if (!state) { + if (!ProcessingViewMeta.is(state)) { return this.errorService.quitFailure( Fail(FT.UsrValidation, 'No state provided'), this.logger, @@ -29,7 +31,8 @@ export class ProcessingComponent implements OnInit { history.replaceState(null, ''); - const id = await this.imageService.UploadImage(state.imageFile); + const id = await this.imageService.UploadImage(state.imageFiles[0]); + if (HasFailed(id)) return this.errorService.quitFailure(id, this.logger); this.router.navigate([`/view/`, id], { replaceUrl: true }); diff --git a/frontend/src/app/routes/processing/processing.module.ts b/frontend/src/app/routes/processing/processing.module.ts index 116f4620..3547b150 100644 --- a/frontend/src/app/routes/processing/processing.module.ts +++ b/frontend/src/app/routes/processing/processing.module.ts @@ -14,4 +14,4 @@ import { ProcessingRoutingModule } from './processing.routing.module'; MatProgressSpinnerModule, ], }) -export class ProcessingRouteModule {} +export default class ProcessingRouteModule {} diff --git a/frontend/src/app/routes/settings/apikeys/apikey-editor/apikey-editor.component.html b/frontend/src/app/routes/settings/apikeys/apikey-editor/apikey-editor.component.html index 6438aba7..dba68106 100644 --- a/frontend/src/app/routes/settings/apikeys/apikey-editor/apikey-editor.component.html +++ b/frontend/src/app/routes/settings/apikeys/apikey-editor/apikey-editor.component.html @@ -1,4 +1,4 @@ - + Name {{ getErrorMessage() }} diff --git a/frontend/src/app/routes/settings/apikeys/settings-apikeys.component.html b/frontend/src/app/routes/settings/apikeys/settings-apikeys.component.html index 27d8eae2..18e6aaa9 100644 --- a/frontend/src/app/routes/settings/apikeys/settings-apikeys.component.html +++ b/frontend/src/app/routes/settings/apikeys/settings-apikeys.component.html @@ -54,7 +54,6 @@

Api Keys

Settings - - - +
+ + + +
diff --git a/frontend/src/app/routes/settings/general/settings-general.component.ts b/frontend/src/app/routes/settings/general/settings-general.component.ts index 7fb71591..3735b8c8 100644 --- a/frontend/src/app/routes/settings/general/settings-general.component.ts +++ b/frontend/src/app/routes/settings/general/settings-general.component.ts @@ -1,14 +1,26 @@ import { Component } from '@angular/core'; import { DecodedPref } from 'picsur-shared/dist/dto/preferences.dto'; import { Observable } from 'rxjs'; -import { UsrPreferenceFriendlyNames } from 'src/app/i18n/usr-pref.i18n'; +import { + UsrPreferenceFriendlyNames, + UsrPreferenceHelpText, +} from 'src/app/i18n/usr-pref.i18n'; import { UsrPrefService } from 'src/app/services/api/usr-pref.service'; @Component({ templateUrl: './settings-general.component.html', }) export class SettingsGeneralComponent { - public translator = UsrPreferenceFriendlyNames; + private readonly translator = UsrPreferenceFriendlyNames; + private readonly helpTranslator = UsrPreferenceHelpText; + + public getName(key: string) { + return (this.translator as any)[key] ?? key; + } + + public getHelpText(key: string) { + return (this.helpTranslator as any)[key] ?? ''; + } preferences: Observable; diff --git a/frontend/src/app/routes/settings/general/settings-general.module.ts b/frontend/src/app/routes/settings/general/settings-general.module.ts index 6c23a58e..68f0d3bf 100644 --- a/frontend/src/app/routes/settings/general/settings-general.module.ts +++ b/frontend/src/app/routes/settings/general/settings-general.module.ts @@ -8,4 +8,4 @@ import { SettingsGeneralRoutingModule } from './settings-general.routing.module' declarations: [SettingsGeneralComponent], imports: [CommonModule, SettingsGeneralRoutingModule, PrefOptionModule], }) -export class SettingsGeneralRouteModule {} +export default class SettingsGeneralRouteModule {} diff --git a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html index 3f1ed47d..7fff9cce 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html +++ b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html @@ -1,5 +1,5 @@ -

Editing {{ model.rolenameValue }}

+

Editing role "{{ model.rolenameValue }}"

Add new role

@@ -8,7 +8,7 @@

Add new role

- + Role name Add new role
-

Loading

- +
diff --git a/frontend/src/app/routes/settings/sharex/settings-sharex.component.ts b/frontend/src/app/routes/settings/sharex/settings-sharex.component.ts index d32d4088..2e106e89 100644 --- a/frontend/src/app/routes/settings/sharex/settings-sharex.component.ts +++ b/frontend/src/app/routes/settings/sharex/settings-sharex.component.ts @@ -7,6 +7,7 @@ import { HasFailed } from 'picsur-shared/dist/types'; import { BehaviorSubject } from 'rxjs'; import { scan } from 'rxjs/operators'; import { ApiKeysService } from 'src/app/services/api/apikeys.service'; +import { InfoService } from 'src/app/services/api/info.service'; import { PermissionService } from 'src/app/services/api/permission.service'; import { Logger } from 'src/app/services/logger/logger.service'; import { ErrorService } from 'src/app/util/error-manager/error.service'; @@ -41,6 +42,7 @@ export class SettingsShareXComponent implements OnInit { constructor( private readonly apikeysService: ApiKeysService, private readonly permissionService: PermissionService, + private readonly infoService: InfoService, private readonly utilService: UtilService, private readonly errorService: ErrorService, ) {} @@ -62,11 +64,11 @@ export class SettingsShareXComponent implements OnInit { const ext = FileType2Ext(this.selectedFormat); if (HasFailed(ext)) { - this.logger.error(ext.print()); + ext.print(this.logger); } const sharexConfig = BuildShareX( - this.utilService.getHost(), + this.infoService.getHostname(), this.key, '.' + ext, canUseDelete, diff --git a/frontend/src/app/routes/settings/sharex/settings-sharex.module.ts b/frontend/src/app/routes/settings/sharex/settings-sharex.module.ts index aa3c7fcb..05aa25b3 100644 --- a/frontend/src/app/routes/settings/sharex/settings-sharex.module.ts +++ b/frontend/src/app/routes/settings/sharex/settings-sharex.module.ts @@ -23,4 +23,4 @@ import { SettingsShareXRoutingModule } from './settings-sharex.routing.module'; MatProgressSpinnerModule, ], }) -export class SettingsShareXRouteModule {} +export default class SettingsShareXRouteModule {} diff --git a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html index 5d721e6e..e980f809 100644 --- a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html +++ b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html @@ -1,16 +1,16 @@ - Personal +
Personal
- + {{ route.data?.page?.icon }} - {{ route.data?.page?.title }} + {{ route.data?.page?.title }}
@@ -18,17 +18,17 @@ - System +
System
- + {{ route.data?.page?.icon }} - {{ route.data?.page?.title }} + {{ route.data?.page?.title }}
diff --git a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.html b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.html index ce4bf155..0ad1f1df 100644 --- a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.html +++ b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.html @@ -1,9 +1,17 @@

System Settings

- - + +

{{ category.category }}

+
+ + + +
diff --git a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.scss b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.ts b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.ts index d2e336ed..4669c839 100644 --- a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.ts +++ b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.component.ts @@ -1,18 +1,54 @@ import { Component } from '@angular/core'; import { DecodedPref } from 'picsur-shared/dist/dto/preferences.dto'; -import { Observable } from 'rxjs'; -import { SysPreferenceFriendlyNames } from 'src/app/i18n/sys-pref.i18n'; +import { + SysPreference, + SysPreferenceValidators, +} from 'picsur-shared/dist/dto/sys-preferences.enum'; +import { map, Observable } from 'rxjs'; +import { SysPreferenceUI } from 'src/app/i18n/sys-pref.i18n'; + +import { makeUnique } from 'picsur-shared/dist/util/unique'; import { SysPrefService } from 'src/app/services/api/sys-pref.service'; +import { z, ZodTypeAny } from 'zod'; @Component({ templateUrl: './settings-sys-pref.component.html', + styleUrls: ['./settings-sys-pref.component.scss'], }) export class SettingsSysprefComponent { - public readonly translator = SysPreferenceFriendlyNames; + public getName(key: string) { + return SysPreferenceUI[key as SysPreference]?.name ?? key; + } + + public getHelpText(key: string) { + return SysPreferenceUI[key as SysPreference]?.helpText ?? ''; + } + + public getCategory(key: string): null | string { + return SysPreferenceUI[key as SysPreference]?.category ?? null; + } + + public getValidator(key: string): ZodTypeAny { + return SysPreferenceValidators[key as SysPreference] ?? z.any(); + } - preferences: Observable; + preferences: Observable< + Array<{ category: string | null; prefs: DecodedPref[] }> + >; constructor(public readonly sysPrefService: SysPrefService) { - this.preferences = sysPrefService.live; + this.preferences = sysPrefService.live.pipe( + map((prefs) => { + const categories = makeUnique( + prefs.map((pref) => this.getCategory(pref.key)), + ); + return categories.map((category) => ({ + category, + prefs: prefs.filter( + (pref) => this.getCategory(pref.key) === category, + ), + })); + }), + ); } } diff --git a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.module.ts b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.module.ts index ca942f93..0008e832 100644 --- a/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.module.ts +++ b/frontend/src/app/routes/settings/sys-pref/settings-sys-pref.module.ts @@ -8,4 +8,4 @@ import { SettingsSysprefRoutingModule } from './settings-sys-pref.routing.module declarations: [SettingsSysprefComponent], imports: [CommonModule, SettingsSysprefRoutingModule, PrefOptionModule], }) -export class SettingsSysprefRouteModule {} +export default class SettingsSysprefRouteModule {} diff --git a/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html b/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html index dd5d6e34..8686ddb8 100644 --- a/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html +++ b/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html @@ -1,5 +1,5 @@ -

Editing {{ model.usernameValue }}

+

Editing user "{{ model.usernameValue }}"

Add new user

@@ -8,7 +8,7 @@

Add new user

- + Username Add new user
- + {{ editing ? 'New Password' : 'Password' }} Add new user

Effective Permissions

- + {{ permission }} - +
-
- + Username Login to your account
- + Password Login to your account
- + Username Register your new account
- + Password Register your new account
- + Confirm Password Register your new account
- + Format @@ -15,7 +15,7 @@

Customize Image

- + Height Customize Image
Width @@ -39,7 +39,7 @@

Customize Image

- + Rotation @@ -50,7 +50,7 @@

Customize Image

- + Quality % @@ -87,7 +87,11 @@

Customize Image

- +
diff --git a/frontend/src/app/routes/view/edit-dialog/edit-dialog.component.html b/frontend/src/app/routes/view/edit-dialog/edit-dialog.component.html index bc9fe457..b59c7bb1 100644 --- a/frontend/src/app/routes/view/edit-dialog/edit-dialog.component.html +++ b/frontend/src/app/routes/view/edit-dialog/edit-dialog.component.html @@ -5,7 +5,7 @@

Edit Image

- + Title Edit Image
- - + +
diff --git a/frontend/src/app/routes/view/view-speeddial/view-speeddial.component.ts b/frontend/src/app/routes/view/view-speeddial/view-speeddial.component.ts index 56a1030d..54b1632a 100644 --- a/frontend/src/app/routes/view/view-speeddial/view-speeddial.component.ts +++ b/frontend/src/app/routes/view/view-speeddial/view-speeddial.component.ts @@ -93,10 +93,7 @@ export class ViewSpeeddialComponent implements OnInit { if (this.image === null) return; this.downloadService.downloadFile( - this.imageService.CreateImageLinksFromID( - this.image?.id, - this.selectedFormat, - ).source, + this.imageService.GetImageURL(this.image?.id, this.selectedFormat), ); } @@ -104,10 +101,7 @@ export class ViewSpeeddialComponent implements OnInit { if (this.image === null) return; this.downloadService.shareFile( - this.imageService.CreateImageLinksFromID( - this.image?.id, - this.selectedFormat, - ).source, + this.imageService.GetImageURL(this.image?.id, this.selectedFormat), ); } diff --git a/frontend/src/app/routes/view/view.component.html b/frontend/src/app/routes/view/view.component.html index a9a1b163..75aa2ec8 100644 --- a/frontend/src/app/routes/view/view.component.html +++ b/frontend/src/app/routes/view/view.component.html @@ -26,7 +26,7 @@

- + Image Format diff --git a/frontend/src/app/routes/view/view.component.ts b/frontend/src/app/routes/view/view.component.ts index 6bdec21f..b7a4be60 100644 --- a/frontend/src/app/routes/view/view.component.ts +++ b/frontend/src/app/routes/view/view.component.ts @@ -85,12 +85,20 @@ export class ViewComponent implements OnInit, OnDestroy { ); } + private imageLinksCache: Record = {}; public get imageLinks(): ImageLinks { + if (this.imageLinksCache[this.selectedFormat] !== undefined) + return this.imageLinksCache[this.selectedFormat]; + const format = this.selectedFormat; - return this.imageService.CreateImageLinksFromID( + const links = this.imageService.CreateImageLinksFromID( this.id, format === 'original' ? null : format, + this.image?.file_name, ); + + this.imageLinksCache[format] = links; + return links; } async ngOnInit() { diff --git a/frontend/src/app/routes/view/view.module.ts b/frontend/src/app/routes/view/view.module.ts index ec148b90..0fc80a5f 100644 --- a/frontend/src/app/routes/view/view.module.ts +++ b/frontend/src/app/routes/view/view.module.ts @@ -52,4 +52,4 @@ import { ViewRoutingModule } from './view.routing.module'; PipesModule, ], }) -export class ViewRouteModule {} +export default class ViewRouteModule {} diff --git a/frontend/src/app/services/api/api.service.ts b/frontend/src/app/services/api/api.service.ts index 831e1476..de5917b0 100644 --- a/frontend/src/app/services/api/api.service.ts +++ b/frontend/src/app/services/api/api.service.ts @@ -1,28 +1,65 @@ import { Inject, Injectable } from '@angular/core'; import { WINDOW } from '@ng-web-apis/common'; +import axios, { + AxiosRequestConfig, + AxiosResponse, + AxiosResponseHeaders, +} from 'axios'; import { ApiResponseSchema } from 'picsur-shared/dist/dto/api/api.dto'; import { FileType2Ext } from 'picsur-shared/dist/dto/mimes.dto'; import { AsyncFailable, Fail, + Failure, FT, HasFailed, HasSuccess, } from 'picsur-shared/dist/types'; import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto'; import { ParseMime2FileType } from 'picsur-shared/dist/util/parse-mime'; -import { Subject } from 'rxjs'; +import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { ApiBuffer } from 'src/app/models/dto/api-buffer.dto'; import { ApiError } from 'src/app/models/dto/api-error.dto'; import { z } from 'zod'; import { MultiPartRequest } from '../../models/dto/multi-part-request.dto'; import { Logger } from '../logger/logger.service'; -import { KeyService } from '../storage/key.service'; +import { KeyStorageService } from '../storage/key-storage.service'; /* Proud of this, it works so smoooth */ +interface RunningRequest { + uploadProgress: Observable; + downloadProgress: Observable; + result: AsyncFailable; + cancel: () => void; +} + +function MapRunningRequest( + runningRequest: RunningRequest, + map: (r: R) => AsyncFailable, +): RunningRequest { + return { + ...runningRequest, + result: runningRequest.result.then(async (result) => { + if (HasFailed(result)) return result; + return map(result); + }), + }; +} + +function CreateFailedRunningRequest(failure: Failure) { + const subject = new Subject(); + subject.complete(); + return { + uploadProgress: subject.asObservable(), + downloadProgress: subject.asObservable(), + result: Promise.resolve(failure), + cancel: () => {}, + } as RunningRequest; +} + @Injectable({ providedIn: 'root', }) @@ -36,181 +73,200 @@ export class ApiService { } constructor( - private readonly keyService: KeyService, + private readonly keyService: KeyStorageService, @Inject(WINDOW) private readonly windowRef: Window, ) {} - public async get( + public get( type: ZodDtoStatic, url: string, - ): AsyncFailable> { + ): RunningRequest> { return this.fetchSafeJson(type, url, { method: 'GET' }); } - public async head(url: string): AsyncFailable { + public head(url: string): RunningRequest { return this.fetchHead(url, { method: 'HEAD' }); } - public async getBuffer(url: string): AsyncFailable { + public getBuffer(url: string): RunningRequest { return this.fetchBuffer(url, { method: 'GET' }); } - public async post( + public post( sendType: ZodDtoStatic, receiveType: ZodDtoStatic, url: string, data: z.infer, - ): AsyncFailable> { + ): RunningRequest> { const sendSchema = sendType.zodSchema; const validateResult = sendSchema.safeParse(data); if (!validateResult.success) { - return Fail( - FT.SysValidation, - 'Something went wrong', - validateResult.error, + return CreateFailedRunningRequest( + Fail(FT.SysValidation, 'Something went wrong', validateResult.error), ); } return this.fetchSafeJson(receiveType, url, { method: 'POST', - body: JSON.stringify(validateResult.data), + data: validateResult.data, }); } - public async postEmpty( + public postEmpty( type: ZodDtoStatic, url: string, - ): AsyncFailable> { + ): RunningRequest> { return this.fetchSafeJson(type, url, { method: 'POST' }); } - public async postForm( + public postForm( receiveType: ZodDtoStatic, url: string, data: MultiPartRequest, - ): AsyncFailable> { + ): RunningRequest> { return this.fetchSafeJson(receiveType, url, { method: 'POST', - body: data.createFormData(), + data: data.createFormData(), }); } - private async fetchSafeJson( + private fetchSafeJson( type: ZodDtoStatic, - url: RequestInfo, - options: RequestInit, - ): AsyncFailable> { + url: string, + options: AxiosRequestConfig, + ): RunningRequest> { const resultSchema = ApiResponseSchema(type.zodSchema as z.AnyZodObject); type resultType = z.infer; - let result = await this.fetchJsonAs(url, options); - if (HasFailed(result)) return result; + let result = this.fetchJsonAs(url, options); - const validateResult = resultSchema.safeParse(result); - if (!validateResult.success) { - return Fail( - FT.SysValidation, - 'Something went wrong', - validateResult.error, - ); - } + return MapRunningRequest(result, async (r) => { + const validateResult = resultSchema.safeParse(r); + if (!validateResult.success) { + return Fail( + FT.SysValidation, + 'Something went wrong', + validateResult.error, + ); + } - if (validateResult.data.success === false) - return Fail(FT.Unknown, result.data.message); + if (validateResult.data.success === false) + return Fail(FT.Unknown, r.data.message); - return validateResult.data.data; + return validateResult.data.data; + }); } - private async fetchJsonAs( - url: RequestInfo, - options: RequestInit, - ): AsyncFailable { - const response = await this.fetch(url, options); - if (HasFailed(response)) { - return response; - } - try { - return await response.json(); - } catch (e) { - return Fail(FT.Internal, e); - } - } + private fetchJsonAs( + url: string, + options: AxiosRequestConfig, + ): RunningRequest { + const response = this.fetch(url, { + ...options, + responseType: 'json', + }); - private async fetchBuffer( - url: RequestInfo, - options: RequestInit, - ): AsyncFailable { - const response = await this.fetch(url, options); - if (HasFailed(response)) return response; + return MapRunningRequest(response, async (r) => r.data); + } - if (!response.ok) return Fail(FT.Network, 'Recieved a non-ok response'); + private fetchBuffer( + url: string, + options: AxiosRequestConfig, + ): RunningRequest { + const response = this.fetch(url, { + ...options, + responseType: 'arraybuffer', + }); - const mimeType = response.headers.get('Content-Type') ?? 'other/unknown'; - let name = response.headers.get('Content-Disposition'); - if (!name) { - if (typeof url === 'string') { + return MapRunningRequest(response, async (r) => { + const mimeType = r.headers['Content-Type'] ?? 'other/unknown'; + let name = r.headers['Content-Disposition']; + if (!name) { name = url.split('/').pop() ?? 'unnamed'; - } else { - name = url.url.split('/').pop() ?? 'unnamed'; } - } - const filetype = ParseMime2FileType(mimeType); - if (HasSuccess(filetype)) { - const ext = FileType2Ext(filetype.identifier); - if (HasSuccess(ext)) { - if (!name.endsWith(ext)) { - name += '.' + ext; + const filetype = ParseMime2FileType(mimeType); + if (HasSuccess(filetype)) { + const ext = FileType2Ext(filetype.identifier); + if (HasSuccess(ext)) { + if (!name.endsWith(ext)) { + name += '.' + ext; + } } } - } - try { - const arrayBuffer = await response.arrayBuffer(); return { - buffer: arrayBuffer, + buffer: r.data, mimeType, name, }; - } catch (e) { - return Fail(FT.Internal, e); - } + }); } - private async fetchHead( - url: RequestInfo, - options: RequestInit, - ): AsyncFailable { - const response = await this.fetch(url, options); - if (HasFailed(response)) return response; - - if (!response.ok) return Fail(FT.Network, 'Recieved a non-ok response'); + private fetchHead( + url: string, + options: AxiosRequestConfig, + ): RunningRequest { + const response = this.fetch(url, options); - return response.headers; + return MapRunningRequest(response, async (r) => { + return r.headers as AxiosResponseHeaders; + }); } - private async fetch( - url: RequestInfo, - options: RequestInit, - ): AsyncFailable { - try { - const key = this.keyService.get(); - const isJSON = typeof options.body === 'string'; - - const headers: any = options.headers || {}; - if (key !== null) - headers['Authorization'] = `Bearer ${this.keyService.get()}`; - if (isJSON) headers['Content-Type'] = 'application/json'; - options.headers = headers; - - return await this.windowRef.fetch(url, options); - } catch (e) { - this.errorSubject.next({ - error: e, - url, - }); - return Fail(FT.Network, e); - } + private fetch( + url: string, + options: AxiosRequestConfig, + ): RunningRequest { + const key = this.keyService.get(); + const isJSON = typeof options.data === 'string'; + + const headers: any = options.headers || {}; + if (key !== null) + headers['Authorization'] = `Bearer ${this.keyService.get()}`; + if (isJSON) headers['Content-Type'] = 'application/json'; + options.headers = headers; + + const uploadProgress = new BehaviorSubject(0); + const downloadProgress = new BehaviorSubject(0); + const abortController = new AbortController(); + + const resultPromise: AsyncFailable = (async () => { + try { + const result = await axios.request({ + url, + onDownloadProgress: (e) => { + downloadProgress.next((e.loaded / (e.total ?? 1000000)) * 100); + }, + onUploadProgress: (e) => { + uploadProgress.next((e.loaded / (e.total ?? 1000000)) * 100); + }, + signal: abortController.signal, + ...options, + }); + + uploadProgress.complete(); + downloadProgress.complete(); + + if (result.status < 200 || result.status >= 300) { + return Fail(FT.Network, 'Recieved a non-ok response'); + } + return result; + } catch (e) { + return Fail(FT.Network, e); + } + })(); + + return { + result: resultPromise, + uploadProgress, + downloadProgress, + cancel: () => { + abortController.abort(); + uploadProgress.complete(); + downloadProgress.complete(); + }, + }; } } diff --git a/frontend/src/app/services/api/apikeys.service.ts b/frontend/src/app/services/api/apikeys.service.ts index c6b2d3c3..5796b6eb 100644 --- a/frontend/src/app/services/api/apikeys.service.ts +++ b/frontend/src/app/services/api/apikeys.service.ts @@ -26,7 +26,7 @@ export class ApiKeysService { page: number, userID?: string, ): AsyncFailable> { - const response = await this.api.post( + return await this.api.post( ApiKeyListRequest, ApiKeyListResponse, '/api/apikeys/list', @@ -35,9 +35,7 @@ export class ApiKeysService { page, user_id: userID, }, - ); - - return response; + ).result; } public async getApiKey(id: string): AsyncFailable { @@ -48,14 +46,12 @@ export class ApiKeysService { { id, }, - ); + ).result; } public async createApiKey(): AsyncFailable { - return await this.api.postEmpty( - ApiKeyCreateResponse, - '/api/apikeys/create', - ); + return await this.api.postEmpty(ApiKeyCreateResponse, '/api/apikeys/create') + .result; } public async updateApiKey(id: string, name: string): AsyncFailable { @@ -67,7 +63,7 @@ export class ApiKeysService { id, name, }, - ); + ).result; } public async deleteApiKey(id: string): AsyncFailable> { @@ -78,6 +74,6 @@ export class ApiKeysService { { id, }, - ); + ).result; } } diff --git a/frontend/src/app/services/api/image.service.ts b/frontend/src/app/services/api/image.service.ts index 03a12b82..4cb862c4 100644 --- a/frontend/src/app/services/api/image.service.ts +++ b/frontend/src/app/services/api/image.service.ts @@ -23,9 +23,10 @@ import { HasSuccess, Open, } from 'picsur-shared/dist/types/failable'; -import { UtilService } from 'src/app/util/util.service'; +import { ImagesUploadRequest } from 'src/app/models/dto/images-upload-request.dto'; import { ImageUploadRequest } from '../../models/dto/image-upload-request.dto'; import { ApiService } from './api.service'; +import { InfoService } from './info.service'; import { UserService } from './user.service'; @Injectable({ @@ -34,7 +35,7 @@ import { UserService } from './user.service'; export class ImageService { constructor( private readonly api: ApiService, - private readonly util: UtilService, + private readonly infoService: InfoService, private readonly userService: UserService, ) {} @@ -43,13 +44,28 @@ export class ImageService { ImageUploadResponse, '/api/image/upload', new ImageUploadRequest(image), - ); + ).result; return Open(result, 'id'); } + public async UploadImages(images: File[]): AsyncFailable { + console.log('Uploading images', images); + + // Split into chunks of 20 + const groups = this.chunks(images, 20); + + const result = await this.api.postForm( + ImageUploadResponse, + '/api/image/upload/bulk', + new ImagesUploadRequest(images), + ); + + return []; + } + public async GetImageMeta(image: string): AsyncFailable { - return await this.api.get(ImageMetaResponse, `/i/meta/${image}`); + return await this.api.get(ImageMetaResponse, `/i/meta/${image}`).result; } public async ListAllImages( @@ -66,7 +82,7 @@ export class ImageService { page, user_id: userID, }, - ); + ).result; } public async ListMyImages( @@ -93,7 +109,7 @@ export class ImageService { id, ...settings, }, - ); + ).result; } public async DeleteImages( @@ -106,7 +122,7 @@ export class ImageService { { ids: images, }, - ); + ).result; } public async DeleteImage(image: string): AsyncFailable { @@ -125,8 +141,13 @@ export class ImageService { // Non api calls - public GetImageURL(image: string, filetype: string | null): string { - const baseURL = this.util.getHost(); + // Use for native images + public GetImageURL( + image: string, + filetype: string | null, + allowOverride = false, + ): string { + const baseURL = this.infoService.getHostname(allowOverride); const extension = FileType2Ext(filetype ?? ''); return `${baseURL}/i/${image}${ @@ -134,12 +155,23 @@ export class ImageService { }`; } + // Use for user facing urls + public CreateImageLinks(imageURL: string, name?: string): ImageLinks { + return { + source: imageURL, + markdown: `![image](${imageURL})`, + html: `${name ?? 'image'}`, + rst: `.. image:: ${imageURL}`, + bbcode: `[img]${imageURL}[/img]`, + }; + } + public GetImageURLCustomized( image: string, filetype: string | null, options: ImageRequestParams, ): string { - const baseURL = this.GetImageURL(image, filetype); + const baseURL = this.GetImageURL(image, filetype, true); const betterOptions = ImageRequestParams.zodSchema.safeParse(options); if (!betterOptions.success) return baseURL; @@ -169,20 +201,20 @@ export class ImageService { return baseURL + '?' + queryParams.join('&'); } - public CreateImageLinks(imageURL: string): ImageLinks { - return { - source: imageURL, - markdown: `![image](${imageURL})`, - html: `image`, - rst: `.. image:: ${imageURL}`, - bbcode: `[img]${imageURL}[/img]`, - }; - } - public CreateImageLinksFromID( imageID: string, mime: string | null, + name?: string, ): ImageLinks { - return this.CreateImageLinks(this.GetImageURL(imageID, mime)); + return this.CreateImageLinks(this.GetImageURL(imageID, mime, true), name); + } + + private chunks(arr: T[], size: number): T[][] { + let result = []; + for (let i = 0; i < arr.length; i += size) { + result.push(arr.slice(i, size + i)); + } + + return result; } } diff --git a/frontend/src/app/services/api/info.service.ts b/frontend/src/app/services/api/info.service.ts index d23a65bc..8bd8e1e4 100644 --- a/frontend/src/app/services/api/info.service.ts +++ b/frontend/src/app/services/api/info.service.ts @@ -1,11 +1,13 @@ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; +import { LOCATION } from '@ng-web-apis/common'; import { InfoResponse } from 'picsur-shared/dist/dto/api/info.dto'; import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types'; import { SemVerRegex } from 'picsur-shared/dist/util/common-regex'; -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, filter, Observable, take } from 'rxjs'; import pkg from '../../../../package.json'; import { ServerInfo } from '../../models/dto/server-info.dto'; import { Logger } from '../logger/logger.service'; +import { InfoStorageService } from '../storage/info-storage.service'; import { ApiService } from './api.service'; @Injectable({ @@ -22,26 +24,52 @@ export class InfoService { return this.infoSubject.value; } - private infoSubject = new BehaviorSubject(new ServerInfo()); + private infoSubject = new BehaviorSubject( + this.infoStorage.get() ?? new ServerInfo(), + ); - constructor(private readonly api: ApiService) {} + constructor( + @Inject(LOCATION) private readonly location: Location, + private readonly api: ApiService, + private readonly infoStorage: InfoStorageService, + ) { + this.updateInfo().catch((e) => this.logger.warn(e)); + } - public async pollInfo(): AsyncFailable { - const response = await this.api.get(InfoResponse, '/api/info'); - if (HasFailed(response)) return response; + public async getLoadedSnapshot(): Promise { + if (this.isLoaded()) { + return this.snapshot; + } - this.infoSubject.next(response); - return response; + return new Promise((resolve) => { + const filtered = this.live.pipe( + filter((info) => info.version !== '0.0.0'), + take(1), + ); + (filtered as Observable).subscribe(resolve); + }); } public getFrontendVersion(): string { return pkg.version; } + public getHostname(allowOverride = false): string { + if (allowOverride) { + const info = this.snapshot; + + if (info.host_override !== undefined) { + return info.host_override; + } + } + + return this.location.protocol + '//' + this.location.host; + } + // If either version starts with 0. it has to be exactly the same // If both versions start with something else, they have to match the first part public async isCompatibleWithServer(): AsyncFailable { - const info = await this.pollInfo(); + const info = await this.getLoadedSnapshot(); if (HasFailed(info)) return info; const serverVersion = info.version; @@ -67,4 +95,17 @@ export class InfoService { return serverDecoded[0] === clientDecoded[0]; } } + + public isLoaded(): boolean { + return this.snapshot.version !== '0.0.0'; + } + + private async updateInfo(): AsyncFailable { + const response = await this.api.get(InfoResponse, '/api/info').result; + if (HasFailed(response)) return response; + + this.infoSubject.next(response); + this.infoStorage.set(response); + return response; + } } diff --git a/frontend/src/app/services/api/permission.service.ts b/frontend/src/app/services/api/permission.service.ts index 7c62ef14..9d6e192d 100644 --- a/frontend/src/app/services/api/permission.service.ts +++ b/frontend/src/app/services/api/permission.service.ts @@ -69,7 +69,7 @@ export class PermissionService { const got = await this.api.get( UserMePermissionsResponse, '/api/user/me/permissions', - ); + ).result; if (HasFailed(got)) return got; this.permissionsSubject.next(got.permissions); diff --git a/frontend/src/app/services/api/roles.service.ts b/frontend/src/app/services/api/roles.service.ts index 53d74f43..9a091e0c 100644 --- a/frontend/src/app/services/api/roles.service.ts +++ b/frontend/src/app/services/api/roles.service.ts @@ -22,7 +22,8 @@ export class RolesService { constructor(private readonly api: ApiService) {} public async getRoles(): AsyncFailable { - const response = await this.api.get(RoleListResponse, '/api/roles/list'); + const response = await this.api.get(RoleListResponse, '/api/roles/list') + .result; return Open(response, 'results'); } @@ -35,7 +36,7 @@ export class RolesService { { name, }, - ); + ).result; } public async createRole(role: RoleModel): AsyncFailable { @@ -44,7 +45,7 @@ export class RolesService { RoleCreateResponse, '/api/roles/create', role, - ); + ).result; } public async updateRole(role: RoleModel): AsyncFailable { @@ -53,7 +54,7 @@ export class RolesService { RoleUpdateResponse, '/api/roles/update', role, - ); + ).result; } public async deleteRole(name: string): AsyncFailable { @@ -64,6 +65,6 @@ export class RolesService { { name, }, - ); + ).result; } } diff --git a/frontend/src/app/services/api/static-info.service.ts b/frontend/src/app/services/api/static-info.service.ts index 29dd277f..590bba27 100644 --- a/frontend/src/app/services/api/static-info.service.ts +++ b/frontend/src/app/services/api/static-info.service.ts @@ -29,7 +29,7 @@ export class StaticInfoService { SoulBoundRoles: [], UndeletableRoles: [], }, - () => this.api.get(SpecialRolesResponse, '/api/roles/special'), + () => this.api.get(SpecialRolesResponse, '/api/roles/special').result, ); } @@ -41,7 +41,7 @@ export class StaticInfoService { LockedLoginUsersList: [], UndeletableUsersList: [], }, - () => this.api.get(GetSpecialUsersResponse, '/api/user/special'), + () => this.api.get(GetSpecialUsersResponse, '/api/user/special').result, ); } @@ -54,7 +54,7 @@ export class StaticInfoService { const res = await this.api.get( AllPermissionsResponse, '/api/info/permissions', - ); + ).result; return Open(res, 'permissions'); }, ); diff --git a/frontend/src/app/services/api/sys-pref.service.ts b/frontend/src/app/services/api/sys-pref.service.ts index c45904ce..1044d812 100644 --- a/frontend/src/app/services/api/sys-pref.service.ts +++ b/frontend/src/app/services/api/sys-pref.service.ts @@ -69,7 +69,7 @@ export class SysPrefService { const response = await this.api.get( MultiplePreferencesResponse, '/api/pref/sys', - ); + ).result; return Map(response, (pref) => { this.sysprefObservable.next(pref.results); @@ -89,7 +89,7 @@ export class SysPrefService { const response = await this.api.get( GetPreferenceResponse, `/api/pref/sys/${key}`, - ); + ).result; if (!HasFailed(response)) this.updatePrefArray(response); return response; @@ -110,7 +110,7 @@ export class SysPrefService { UpdatePreferenceResponse, `/api/pref/sys/${key}`, { value }, - ); + ).result; if (!HasFailed(response)) this.updatePrefArray(response); return response; diff --git a/frontend/src/app/services/api/user-manage.service.ts b/frontend/src/app/services/api/user-manage.service.ts index 44757b89..13e7b2bb 100644 --- a/frontend/src/app/services/api/user-manage.service.ts +++ b/frontend/src/app/services/api/user-manage.service.ts @@ -27,7 +27,7 @@ export class UserAdminService { UserInfoResponse, 'api/user/info', { id }, - ); + ).result; } public async getUsers( @@ -42,7 +42,7 @@ export class UserAdminService { count, page, }, - ); + ).result; } public async createUser(user: UserCreateRequest): AsyncFailable { @@ -51,7 +51,7 @@ export class UserAdminService { UserCreateResponse, '/api/user/create', user, - ); + ).result; } public async updateUser(user: UserUpdateRequest): AsyncFailable { @@ -60,7 +60,7 @@ export class UserAdminService { UserUpdateResponse, '/api/user/update', user, - ); + ).result; } public async deleteUser(id: string): AsyncFailable> { @@ -69,6 +69,6 @@ export class UserAdminService { UserDeleteResponse, '/api/user/delete', { id }, - ); + ).result; } } diff --git a/frontend/src/app/services/api/user.service.ts b/frontend/src/app/services/api/user.service.ts index 9a8ab90a..fe51b736 100644 --- a/frontend/src/app/services/api/user.service.ts +++ b/frontend/src/app/services/api/user.service.ts @@ -20,7 +20,7 @@ import { } from 'picsur-shared/dist/types'; import { BehaviorSubject } from 'rxjs'; import { Logger } from '../logger/logger.service'; -import { KeyService } from '../storage/key.service'; +import { KeyStorageService } from '../storage/key-storage.service'; import { ApiService } from './api.service'; @Injectable({ @@ -44,7 +44,7 @@ export class UserService { constructor( private readonly api: ApiService, - private readonly key: KeyService, + private readonly key: KeyStorageService, ) { this.init().catch(this.logger.error); } @@ -72,7 +72,7 @@ export class UserService { username, password, }, - ); + ).result; if (HasFailed(response)) return response; // Set the key so the apiservice can use it @@ -94,7 +94,7 @@ export class UserService { { username, }, - ), + ).result, 'available', ); } @@ -111,7 +111,7 @@ export class UserService { username, password, }, - ); + ).result; } public async logout(): AsyncFailable { @@ -147,7 +147,7 @@ export class UserService { // This actually fetches up to date information from the server private async fetchUser(): AsyncFailable { - const got = await this.api.get(UserMeResponse, '/api/user/me'); + const got = await this.api.get(UserMeResponse, '/api/user/me').result; if (HasFailed(got)) return got; this.key.set(got.token); diff --git a/frontend/src/app/services/api/usr-pref.service.ts b/frontend/src/app/services/api/usr-pref.service.ts index 3e7cbaf8..f527a522 100644 --- a/frontend/src/app/services/api/usr-pref.service.ts +++ b/frontend/src/app/services/api/usr-pref.service.ts @@ -69,7 +69,7 @@ export class UsrPrefService { const response = await this.api.get( MultiplePreferencesResponse, '/api/pref/usr', - ); + ).result; return Map(response, (pref) => { this.usrprefObservable.next(pref.results); @@ -89,7 +89,7 @@ export class UsrPrefService { const response = await this.api.get( GetPreferenceResponse, `/api/pref/usr/${key}`, - ); + ).result; if (!HasFailed(response)) this.updatePrefArray(response); return response; @@ -110,7 +110,7 @@ export class UsrPrefService { UpdatePreferenceResponse, `/api/pref/usr/${key}`, { value }, - ); + ).result; if (!HasFailed(response)) this.updatePrefArray(response); return response; diff --git a/frontend/src/app/services/storage/cache.service.ts b/frontend/src/app/services/storage/cache.service.ts index 25fc3030..7803b345 100644 --- a/frontend/src/app/services/storage/cache.service.ts +++ b/frontend/src/app/services/storage/cache.service.ts @@ -1,6 +1,7 @@ import { Inject, Injectable } from '@angular/core'; import { SESSION_STORAGE } from '@ng-web-apis/common'; import { AsyncFailable, Failable, HasFailed } from 'picsur-shared/dist/types'; +import { Logger } from '../logger/logger.service'; interface dataWrapper { data: T; @@ -11,6 +12,8 @@ interface dataWrapper { providedIn: 'root', }) export class CacheService { + private readonly logger = new Logger(CacheService.name); + private readonly cacheExpiresMS = 1000 * 60 * 60; private cacheVersion = '0.0.0'; @@ -41,7 +44,9 @@ export class CacheService { const safeKey = this.transformKey(key); try { - const data: dataWrapper = JSON.parse(this.storage.getItem(safeKey) ?? ''); + const data: dataWrapper = JSON.parse( + this.storage.getItem(safeKey) ?? '', + ); if (data && data.data && data.expires > Date.now()) { return data.data; } @@ -74,6 +79,35 @@ export class CacheService { return finalFallback; } + public getFallbackSync( + key: string, + finalFallback: T, + ...fallbacks: Array<(key: string) => AsyncFailable | Failable> + ): T { + const cached = this.get(key); + if (cached !== null) { + return cached; + } + + const background = async () => { + for (const fallback of fallbacks) { + const result = await fallback(key); + if (HasFailed(result)) { + continue; + } + + this.set(key, result); + return result; + } + + return finalFallback; + }; + + background().catch((e) => this.logger.error(e)); + + return finalFallback; + } + private transformKey(key: string): string { return `${this.cacheVersion}-${key}`; } diff --git a/frontend/src/app/services/storage/info-storage.service.ts b/frontend/src/app/services/storage/info-storage.service.ts new file mode 100644 index 00000000..7f678d62 --- /dev/null +++ b/frontend/src/app/services/storage/info-storage.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@angular/core'; +import { ServerInfo } from 'src/app/models/dto/server-info.dto'; +import { Logger } from '../logger/logger.service'; + +@Injectable({ + providedIn: 'root', +}) +export class InfoStorageService { + private readonly logger = new Logger(InfoStorageService.name); + + private readonly storageKey = 'server-info'; + private info: ServerInfo | null = null; + + constructor() { + this.load(); + } + + private load() { + try { + const hasRead = localStorage.getItem(this.storageKey); + if (hasRead === null) return; + + this.info = JSON.parse(hasRead); + } catch (e) { + this.logger.warn(e); + localStorage.removeItem(this.storageKey); + } + } + + private store() { + if (this.info) + localStorage.setItem(this.storageKey, JSON.stringify(this.info)); + else localStorage.removeItem(this.storageKey); + } + + public get() { + setTimeout(this.load.bind(this), 0); + return this.info; + } + + public set(info: ServerInfo) { + this.info = info; + this.store(); + } + + public clear() { + this.info = null; + this.store(); + } +} diff --git a/frontend/src/app/services/storage/key.service.ts b/frontend/src/app/services/storage/key-storage.service.ts similarity index 94% rename from frontend/src/app/services/storage/key.service.ts rename to frontend/src/app/services/storage/key-storage.service.ts index 50d0b15c..d60f1ed8 100644 --- a/frontend/src/app/services/storage/key.service.ts +++ b/frontend/src/app/services/storage/key-storage.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root', }) -export class KeyService { +export class KeyStorageService { private key: string | null = null; constructor() { diff --git a/frontend/src/app/services/usage/usage.service.ts b/frontend/src/app/services/usage/usage.service.ts new file mode 100644 index 00000000..525c7ccc --- /dev/null +++ b/frontend/src/app/services/usage/usage.service.ts @@ -0,0 +1,76 @@ +import { Inject, Injectable } from '@angular/core'; +import { NAVIGATOR } from '@ng-web-apis/common'; +import type { AckeeInstance, AckeeTrackingReturn } from 'ackee-tracker'; +import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; +import { TrackingState } from 'picsur-shared/dist/dto/tracking-state.enum'; +import { InfoService } from '../api/info.service'; +import { Logger } from '../logger/logger.service'; + +@Injectable({ + providedIn: 'root', +}) +export class UsageService { + private readonly logger = new Logger(UsageService.name); + + private doNotTrack = false; + + private instance?: AckeeInstance; + private tracker?: AckeeTrackingReturn; + + constructor( + @Inject(NAVIGATOR) private readonly navigator: Navigator, + private readonly hostInfo: InfoService, + ) { + this.doNotTrack = + this.navigator.doNotTrack === '1' || this.navigator.doNotTrack === 'yes'; + + if (this.doNotTrack) { + this.logger.verbose('Usage reporting disabled by DNT'); + return; + } + + this.subscribeInfo(); + } + + @AutoUnsubscribe() + private subscribeInfo() { + return this.hostInfo.live.subscribe((info) => { + if ( + info.tracking.state === TrackingState.Disabled || + info.tracking.id === undefined + ) { + this.stop(); + } else { + this.setup( + info.tracking.state === TrackingState.Detailed, + info.tracking.id, + ); + } + }); + } + + private async setup(detailed: boolean, id: string) { + this.logger.verbose( + `Tracking enabled with detailed=${detailed} and id=${id}`, + ); + + if (!this.instance) { + const ackee = await import('ackee-tracker'); + this.instance = ackee.create('/api/usage/report', { + ignoreLocalhost: false, + ignoreOwnVisits: false, + detailed, + }); + } + + if (this.tracker) { + this.stop(); + } + this.tracker = this.instance.record(id); + } + + private async stop() { + this.tracker?.stop(); + this.tracker = undefined; + } +} diff --git a/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.html b/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.html index 85e65a43..285104e2 100644 --- a/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.html +++ b/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.html @@ -1,4 +1,8 @@

Downloading {{ data.name }}...

- +
+
diff --git a/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.ts b/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.ts index 17e21705..32c9cfa4 100644 --- a/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.ts +++ b/frontend/src/app/util/dialog-manager/download-dialog/download-dialog.component.ts @@ -1,8 +1,10 @@ import { Component, Inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Observable } from 'rxjs'; export interface DownloadDialogData { name: string; + progress?: Observable; } @Component({ @@ -10,8 +12,12 @@ export interface DownloadDialogData { templateUrl: './download-dialog.component.html', }) export class DownloadDialogComponent { + public progress: Observable; + constructor( public readonly dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public readonly data: DownloadDialogData, - ) {} + ) { + this.progress = data.progress ?? new Observable(); + } } diff --git a/frontend/src/app/util/download-manager/download.service.ts b/frontend/src/app/util/download-manager/download.service.ts index 8e88218a..0c614730 100644 --- a/frontend/src/app/util/download-manager/download.service.ts +++ b/frontend/src/app/util/download-manager/download.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Fail, FT, HasFailed } from 'picsur-shared/dist/types'; +import { Observable } from 'rxjs'; import { ApiService } from 'src/app/services/api/api.service'; import { Logger } from 'src/app/services/logger/logger.service'; import { DownloadDialogComponent } from '../dialog-manager/download-dialog/download-dialog.component'; @@ -20,9 +21,12 @@ export class DownloadService { private readonly errorService: ErrorService, ) {} - public showDownloadDialog(filename: string): () => void { + public showDownloadDialog( + filename: string, + progress?: Observable, + ): () => void { const ref = this.dialog.open(DownloadDialogComponent, { - data: { name: filename }, + data: { name: filename, progress: progress }, disableClose: true, closeOnNavigation: false, }); @@ -31,11 +35,18 @@ export class DownloadService { } public async downloadFile(url: string) { - const closeDialog = this.showDownloadDialog('image'); + const request = this.api.getBuffer(url); + const closeDialog = this.showDownloadDialog( + 'image', + request.downloadProgress, + ); - const file = await this.api.getBuffer(url); - if (HasFailed(file)) + const file = await request.result; + + if (HasFailed(file)) { + closeDialog(); return this.errorService.showFailure(file, this.logger); + } this.util.downloadBuffer(file.buffer, file.name, file.mimeType); @@ -80,7 +91,7 @@ export class DownloadService { url, }; } else { - const image = await this.api.getBuffer(url); + const image = await this.api.getBuffer(url).result; if (HasFailed(image)) return this.errorService.showFailure(image, this.logger); diff --git a/frontend/src/app/util/error-manager/error.service.ts b/frontend/src/app/util/error-manager/error.service.ts index b6bbcb9d..93e3e26b 100644 --- a/frontend/src/app/util/error-manager/error.service.ts +++ b/frontend/src/app/util/error-manager/error.service.ts @@ -15,11 +15,7 @@ export class ErrorService { ) {} public showFailure(error: Failure, logger: Logger): void { - if (error.isImportant()) { - logger.error(error.print()); - } else { - logger.warn(error.print()); - } + error.print(logger); this.snackbar.showSnackBar( error.getReason(), diff --git a/frontend/src/app/util/util.service.ts b/frontend/src/app/util/util.service.ts index bf18354c..2bd6302d 100644 --- a/frontend/src/app/util/util.service.ts +++ b/frontend/src/app/util/util.service.ts @@ -1,5 +1,4 @@ -import { Inject, Injectable } from '@angular/core'; -import { LOCATION } from '@ng-web-apis/common'; +import { Injectable } from '@angular/core'; import { FileType2Ext, SupportedFileTypes, @@ -13,12 +12,6 @@ import { Logger } from '../services/logger/logger.service'; export class UtilService { private readonly logger = new Logger(UtilService.name); - constructor(@Inject(LOCATION) private readonly location: Location) {} - - public getHost(): string { - return this.location.protocol + '//' + this.location.host; - } - public downloadBuffer( buffer: ArrayBuffer | string, filename: string, diff --git a/frontend/src/app/workers/qoi-worker.service.ts b/frontend/src/app/workers/qoi-worker.service.ts index f3efe0c6..733510b8 100644 --- a/frontend/src/app/workers/qoi-worker.service.ts +++ b/frontend/src/app/workers/qoi-worker.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { AsyncFailable, Failure, HasFailed } from 'picsur-shared/dist/types'; -import { KeyService } from '../services/storage/key.service'; +import { KeyStorageService } from '../services/storage/key-storage.service'; import { QOIImage, QOIJob, QOIWorkerOut } from './qoi-worker.dto'; @Injectable({ @@ -10,7 +10,7 @@ export class QoiWorkerService { private worker: Worker | null = null; private job: Promise | null = null; - constructor(private readonly keyService: KeyService) { + constructor(private readonly keyService: KeyStorageService) { if (typeof Worker !== 'undefined') { this.worker = new Worker(new URL('./qoi.worker', import.meta.url)); } else { diff --git a/frontend/src/assets/css/loading.css b/frontend/src/assets/css/loading.css new file mode 100644 index 00000000..0b756907 --- /dev/null +++ b/frontend/src/assets/css/loading.css @@ -0,0 +1,10 @@ +.app-loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.app-loader h1 { + margin-inline: auto; +} diff --git a/frontend/src/assets/css/normalize.min.css b/frontend/src/assets/css/normalize.min.css new file mode 100644 index 00000000..5e1d9255 --- /dev/null +++ b/frontend/src/assets/css/normalize.min.css @@ -0,0 +1,146 @@ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +main { + display: block; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +pre { + font-family: monospace, monospace; + font-size: 1em; +} +a { + background-color: transparent; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} +b, +strong { + font-weight: bolder; +} +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +img { + border-style: none; +} +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +[type='button'], +[type='reset'], +[type='submit'], +button { + -webkit-appearance: button; +} +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + padding: 0.35em 0.75em 0.625em; +} +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +progress { + vertical-align: baseline; +} +textarea { + overflow: auto; +} +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; + padding: 0; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +details { + display: block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none; +} diff --git a/frontend/src/assets/image/spinner.svg b/frontend/src/assets/image/spinner.svg new file mode 100644 index 00000000..2ed5b61d --- /dev/null +++ b/frontend/src/assets/image/spinner.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/index.html b/frontend/src/index.html index 5744c4cb..27a8b1f4 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -11,7 +11,8 @@ - + + - + + +
+ +

Loading

+
+
diff --git a/frontend/src/scss/bootstrap.scss b/frontend/src/scss/bootstrap.scss index 2afef700..eda9b2a7 100644 --- a/frontend/src/scss/bootstrap.scss +++ b/frontend/src/scss/bootstrap.scss @@ -1,5 +1,5 @@ // Include bootstrap-grid.scss from node_modules -@use '../node_modules/bootstrap/scss/bootstrap-grid.scss' with ( +@use '../../../node_modules/bootstrap/scss/bootstrap-grid.scss' with ( $grid-breakpoints: ( xs: 0, sm: 576px, diff --git a/frontend/src/scss/fab.scss b/frontend/src/scss/fab.scss index b92be316..52e2b576 100644 --- a/frontend/src/scss/fab.scss +++ b/frontend/src/scss/fab.scss @@ -1,4 +1,4 @@ -@use '../node_modules/bootstrap/scss/bootstrap-grid.scss' as bs; +@use '../../../node_modules/bootstrap/scss/bootstrap-grid.scss' as bs; // Fabs .fab-wrapper { diff --git a/frontend/src/scss/material/material-theme.scss b/frontend/src/scss/material/material-theme.scss index 25977a9d..5f2d805f 100644 --- a/frontend/src/scss/material/material-theme.scss +++ b/frontend/src/scss/material/material-theme.scss @@ -2,41 +2,13 @@ @use '@angular/material' as mat; @use './material-theme-custom.scss' as custom-mat; -@include mat.core(); +mat.$theme-ignore-duplication-warnings: true; -$dark-primary-text: rgba(black, 0.87); -$light-primary-text: white; - -$mat-primary: ( - main: #272727, - lighter: #bebebe, - darker: #171717, - 200: #272727, - // For slide toggle, - contrast: - ( - main: $light-primary-text, - lighter: $dark-primary-text, - darker: $light-primary-text, - ), -); -$mat-accent: ( - main: #43a047, - lighter: #c7e3c8, - darker: #1b5e20, - 200: #43a047, - // For slide toggle, - contrast: - ( - main: $light-primary-text, - lighter: $dark-primary-text, - darker: $light-primary-text, - ), -); +@include mat.core(); -$picsur-primary: mat.define-palette($mat-primary, main, lighter, darker); -$picsur-accent: mat.define-palette($mat-accent, main, lighter, darker); -$picsur-warn: mat.define_palette(mat.$red-palette); +$picsur-primary: mat.define-palette(mat.$green-palette, 600, 100, 900); +$picsur-accent: mat.define-palette(mat.$blue-grey-palette, 600, 200, 800); +$picsur-warn: mat.define-palette(mat.$red-palette); // Light Theme Text $dark-text: #000000; @@ -135,7 +107,7 @@ $light-bg-alpha-12: rgba(#fafafa, 0.12); $mat-dark-theme-background-palette: ( background: $dark-background, status-bar: $dark-bg-lighter-20, - app-bar: $dark-bg-lighter-5, + app-bar: $dark-bg-lighter-10, hover: $light-bg-alpha-4, card: $dark-bg-lighter-5, dialog: $dark-bg-lighter-5, @@ -151,30 +123,36 @@ $mat-dark-theme-background-palette: ( ); $mat-theme: ( - primary: $picsur-primary, - accent: $picsur-accent, - warn: $picsur-warn, - is-dark: true, - background: $mat-dark-theme-background-palette, - foreground: $mat-dark-theme-foreground-palette, + color: ( + primary: $picsur-primary, + accent: $picsur-accent, + warn: $picsur-warn, + background: $mat-dark-theme-background-palette, + foreground: $mat-dark-theme-foreground-palette, + is-dark: true, + ), ); $mat-theme-light: ( - primary: $picsur-primary, - accent: $picsur-accent, - warn: $picsur-warn, - is-dark: false, - background: $mat-light-theme-background-palette, - foreground: $mat-light-theme-foreground-palette, + ( + color: ( + primary: $picsur-primary, + accent: $picsur-accent, + warn: $picsur-warn, + background: $mat-light-theme-background-palette, + foreground: $mat-light-theme-foreground-palette, + ), + ) ); @include mat.all-component-themes($mat-theme); +@include mat.all-component-typographies($mat-theme); @include custom-mat.custom-material($mat-theme); -.theme-alternate { - @include mat.all-component-themes($mat-theme-light); - @include custom-mat.custom-material($mat-theme-light); -} +// .theme-alternate { +// @include mat.all-component-colors($mat-theme-light); +// @include custom-mat.custom-material($mat-theme-light); +// } .mat-standard-chip { padding: 0.5em 0.85em; diff --git a/frontend/src/scss/snackbar.scss b/frontend/src/scss/snackbar.scss index 893f4148..52afc226 100644 --- a/frontend/src/scss/snackbar.scss +++ b/frontend/src/scss/snackbar.scss @@ -1,49 +1,57 @@ .snackbar { - background: #272727; - color: white; + & .mdc-snackbar__surface { + background: #272727; + & .mdc-snackbar__label { + color: white; + } + } - &.snack-success { + &.snack-success .mdc-snackbar__surface { background: #274e29; } - &.snack-error { + &.snack-error .mdc-snackbar__surface { background: #761919; } - &.snack-warning { + &.snack-warning .mdc-snackbar__surface { background: #934d06; } - &.snack-info { + &.snack-info .mdc-snackbar__surface { background: #125e87; } - &.snack-default { + &.snack-default .mdc-snackbar__surface { background: #272727; } } .theme-alternate .snackbar { - background: #f8f9fa; - color: black; + & .mdc-snackbar__surface { + background: #f8f9fa; + & .mdc-snackbar__label { + color: black; + } + } - &.snack-success { + &.snack-success .mdc-snackbar__surface { background: #28a745; } - &.snack-error { + &.snack-error .mdc-snackbar__surface { background: #dc3545; } - &.snack-warning { + &.snack-warning .mdc-snackbar__surface { background: #ffc107; } - &.snack-info { + &.snack-info .mdc-snackbar__surface { background: #007bff; } - &.snack-default { + &.snack-default .mdc-snackbar__surface { background: #f8f9fa; } } diff --git a/package.json b/package.json index 8c7e5bd7..48f84194 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "0.4.1", + "version": "0.5.0", "workspaces": [ "shared", "backend", @@ -10,7 +10,7 @@ "devdb:start": "docker-compose -f ./support/dev.docker-compose.yml up -d", "devdb:stop": "docker-compose -f ./support/dev.docker-compose.yml down", "devdb:restart": "docker-compose -f ./support/dev.docker-compose.yml restart", - "devdb:remove": "docker-compose -f ./support/dev.docker-compose.yml down --rm all --volumes", + "devdb:remove": "docker-compose -f ./support/dev.docker-compose.yml down --volumes", "build": "./support/build.sh", "setversion": "./support/setversion.sh", "purge": "rm -rf ./node_modules", @@ -21,13 +21,14 @@ "fastify": ">=4.8.1", "terser": ">=5.14.2", "typeorm": ">=0.3.9", - "typescript": "4.7.4", + "typescript": "~4.8.2", + "ms": "3.0.0-canary.1", "fastify-static": "npm:@fastify/static@*", "fastify-formbody": "npm:@fastify/formbody@*", "minimist": "npm:minimist-lite@*" }, "devDependencies": { - "prettier": "^2.7.1", + "prettier": "^2.8.1", "prettier-plugin-sh": "^0.12.8" }, "packageManager": "yarn@3.2.2" diff --git a/shared/package.json b/shared/package.json index 67427a67..1d5b1d11 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "picsur-shared", - "version": "0.4.1", + "version": "0.5.0", "description": "Shared libraries for Picsur", "license": "GPL-3.0", "repository": "https://github.com/rubikscraft/Picsur", @@ -8,12 +8,12 @@ "type": "module", "main": "./dist/index.js", "dependencies": { - "zod": "^3.19.1" + "zod": "^3.20.2" }, "devDependencies": { - "@types/node": "^18.8.4", - "tsc-watch": "^5.0.3", - "typescript": "4.8.4" + "@types/node": "^18.11.17", + "tsc-watch": "^6.0.0", + "typescript": "^4.9.4" }, "scripts": { "clean": "rm -rf ./dist", diff --git a/shared/src/dto/api/info.dto.ts b/shared/src/dto/api/info.dto.ts index f3868374..4653f7b3 100644 --- a/shared/src/dto/api/info.dto.ts +++ b/shared/src/dto/api/info.dto.ts @@ -1,12 +1,19 @@ import { string, z } from 'zod'; import { SemVerRegex } from '../../util/common-regex'; import { createZodDto } from '../../util/create-zod-dto'; +import { IsEntityID } from '../../validators/entity-id.validator'; import { IsStringList } from '../../validators/string-list.validator'; +import { TrackingStateSchema } from '../tracking-state.enum'; export const InfoResponseSchema = z.object({ production: z.boolean(), demo: z.boolean(), version: string().regex(SemVerRegex), + host_override: z.string().optional(), + tracking: z.object({ + state: TrackingStateSchema, + id: IsEntityID().optional(), + }), }); export class InfoResponse extends createZodDto(InfoResponseSchema) {} diff --git a/shared/src/dto/image-entry-variant.enum.ts b/shared/src/dto/image-entry-variant.enum.ts index e9c77b62..dea38dd2 100644 --- a/shared/src/dto/image-entry-variant.enum.ts +++ b/shared/src/dto/image-entry-variant.enum.ts @@ -1,4 +1,5 @@ export enum ImageEntryVariant { ORIGINAL = 'original', MASTER = 'master', + INGEST = 'ingest', } diff --git a/shared/src/dto/sys-preferences.enum.ts b/shared/src/dto/sys-preferences.enum.ts index f758118c..93953df2 100644 --- a/shared/src/dto/sys-preferences.enum.ts +++ b/shared/src/dto/sys-preferences.enum.ts @@ -1,13 +1,75 @@ +import { z } from 'zod'; +import { URLRegex } from '../util/common-regex'; +import { IsEntityID } from '../validators/entity-id.validator'; +import { IsValidMS } from '../validators/ms.validator'; +import { IsPosInt } from '../validators/positive-int.validator'; +import { PrefValueTypeStrings } from './preferences.dto'; + // This enum is only here to make accessing the values easier, and type checking in the backend export enum SysPreference { + HostOverride = 'host_override', + JwtSecret = 'jwt_secret', JwtExpiresIn = 'jwt_expires_in', BCryptStrength = 'bcrypt_strength', - SaveDerivatives = 'save_derivatives', RemoveDerivativesAfter = 'remove_derivatives_after', AllowEditing = 'allow_editing', ConversionTimeLimit = 'conversion_time_limit', ConversionMemoryLimit = 'conversion_memory_limit', + + EnableTracking = 'enable_tracking', + TrackingUrl = 'tracking_url', + TrackingId = 'tracking_id', + + EnableTelemetry = 'enable_telemetry', } + +export type SysPreferences = SysPreference[]; +export const SysPreferenceList: string[] = Object.values(SysPreference); + +// Syspref Value types +export const SysPreferenceValueTypes: { + [key in SysPreference]: PrefValueTypeStrings; +} = { + [SysPreference.HostOverride]: 'string', + + [SysPreference.JwtSecret]: 'string', + [SysPreference.JwtExpiresIn]: 'string', + [SysPreference.BCryptStrength]: 'number', + + [SysPreference.RemoveDerivativesAfter]: 'string', + [SysPreference.AllowEditing]: 'boolean', + + [SysPreference.ConversionTimeLimit]: 'string', + [SysPreference.ConversionMemoryLimit]: 'number', + + [SysPreference.EnableTracking]: 'boolean', + [SysPreference.TrackingUrl]: 'string', + [SysPreference.TrackingId]: 'string', + + [SysPreference.EnableTelemetry]: 'boolean', +}; + +export const SysPreferenceValidators: { + [key in SysPreference]: z.ZodTypeAny; +} = { + [SysPreference.HostOverride]: z.string().regex(URLRegex).or(z.literal('')), + + [SysPreference.JwtSecret]: z.string(), + [SysPreference.JwtExpiresIn]: IsValidMS(), + + [SysPreference.BCryptStrength]: IsPosInt(), + [SysPreference.RemoveDerivativesAfter]: IsValidMS(60000), + + [SysPreference.AllowEditing]: z.boolean(), + [SysPreference.ConversionTimeLimit]: IsValidMS(), + [SysPreference.ConversionMemoryLimit]: IsPosInt(), + + [SysPreference.EnableTracking]: z.boolean(), + [SysPreference.TrackingUrl]: z.string().regex(URLRegex).or(z.literal('')), + [SysPreference.TrackingId]: IsEntityID().or(z.literal('')), + + [SysPreference.EnableTelemetry]: z.boolean(), +}; diff --git a/shared/src/dto/tracking-state.enum.ts b/shared/src/dto/tracking-state.enum.ts new file mode 100644 index 00000000..00749dd9 --- /dev/null +++ b/shared/src/dto/tracking-state.enum.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; + +export enum TrackingState { + Disabled = 'disabled', + Normal = 'normal', + Detailed = 'detailed', +} + +export const TrackingStateSchema = z.nativeEnum(TrackingState); diff --git a/shared/src/dto/usr-preferences.enum.ts b/shared/src/dto/usr-preferences.enum.ts index 4eae68e8..e30c5c28 100644 --- a/shared/src/dto/usr-preferences.enum.ts +++ b/shared/src/dto/usr-preferences.enum.ts @@ -1,4 +1,23 @@ +import { z } from 'zod'; +import { PrefValueTypeStrings } from './preferences.dto'; + // This enum is only here to make accessing the values easier, and type checking in the backend export enum UsrPreference { KeepOriginal = 'keep_original', } + +export type UsrPreferences = UsrPreference[]; +export const UsrPreferenceList: string[] = Object.values(UsrPreference); + +// Syspref Value types +export const UsrPreferenceValueTypes: { + [key in UsrPreference]: PrefValueTypeStrings; +} = { + [UsrPreference.KeepOriginal]: 'boolean', +}; + +export const UsrPreferenceValidators: { + [key in UsrPreference]: z.ZodTypeAny; +} = { + [UsrPreference.KeepOriginal]: z.boolean(), +}; diff --git a/shared/src/types/failable.ts b/shared/src/types/failable.ts index af549d62..eb521a6e 100644 --- a/shared/src/types/failable.ts +++ b/shared/src/types/failable.ts @@ -9,7 +9,9 @@ export enum FT { Database = 'database', SysValidation = 'sysvalidation', UsrValidation = 'usrvalidation', + BadRequest = 'badrequest', Permission = 'permission', + RateLimit = 'ratelimit', NotFound = 'notfound', RouteNotFound = 'routenotfound', Conflict = 'conflict', @@ -19,6 +21,12 @@ export enum FT { Network = 'network', } +interface ILogger { + error: (message: string) => void; + warn: (message: string) => void; + debug: (message: string) => void; +} + interface FTProp { important: boolean; code: number; @@ -58,11 +66,21 @@ const FTProps: { code: 400, message: 'Validation of user input failed', }, + [FT.BadRequest]: { + important: false, + code: 400, + message: 'Bad request', + }, [FT.Permission]: { important: false, code: 403, message: 'Permission denied', }, + [FT.RateLimit]: { + important: false, + code: 429, + message: 'Rate limit exceeded', + }, [FT.NotFound]: { important: false, code: 404, @@ -130,10 +148,42 @@ export class Failure { return FTProps[this.type].important; } - print(): string { - return `${this.getName()}: ${this.getReason()}\n(${ - this.debugMessage - })\n${this.getStack()}`; + print( + logger: ILogger, + options?: { + notImportant?: boolean; + prefix?: string; + }, + ): void { + const message = this.getReason(); + const logmessage = + message + (this.getDebugMessage() ? ' - ' + this.getDebugMessage() : ''); + + const prefix = options?.prefix ? options.prefix + ' ' : ''; + const logline = `${prefix}${this.getName()}: ${logmessage}`; + + if (this.isImportant() && options?.notImportant !== true) { + logger.error(logline); + const stack = this.getStack(); + if (stack) { + logger.debug(stack); + } + } else { + logger.warn(logline); + } + } + + toString(): string { + return ( + `${this.getName()}: ${this.getReason()} - (${this.debugMessage})` + + (this.isImportant() ? '\n' + this.stack : '') + ); + } + + toError(): Error { + const error = new Error(); + (error as any).message = this; + return error; } static deserialize(data: any): Failure { @@ -219,6 +269,7 @@ export type AsyncFailable = Promise>; export function HasFailed(failable: Failable): failable is Failure { if (failable instanceof Promise) throw new Error('Invalid use of HasFailed'); + if (!(failable instanceof Object)) return false; return (failable as any).__68351953531423479708__id_failure === 1148363914; } @@ -235,6 +286,19 @@ export function ThrowIfFailed(failable: Failable): V { return failable; } +export function FallbackIfFailed( + failable: Failable, + fallback: V, + logger?: ILogger, +): V { + if (HasFailed(failable)) { + if (logger) failable.print(logger, { notImportant: true }); + return fallback; + } + + return failable; +} + export function Map( failable: Failable, mapper: (value: T) => U, diff --git a/shared/src/util/common-regex.ts b/shared/src/util/common-regex.ts index 2dd7f5dd..e8b71168 100644 --- a/shared/src/util/common-regex.ts +++ b/shared/src/util/common-regex.ts @@ -5,3 +5,5 @@ export const URLRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/; export const UUIDRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +export const HostNameRegex = + /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$/; diff --git a/shared/src/validators/ms.validator.ts b/shared/src/validators/ms.validator.ts new file mode 100644 index 00000000..3192aae5 --- /dev/null +++ b/shared/src/validators/ms.validator.ts @@ -0,0 +1,21 @@ +import ms from 'ms'; +import { z } from 'zod'; + +export const IsValidMS = (min = 0) => + z.preprocess( + (v: any) => { + try { + return ms(v); + } catch (e) { + return NaN; + } + }, + z + .number({ + errorMap: () => ({ + message: 'Invalid duration value', + }), + }) + .int() + .min(min), + ); diff --git a/support/build.sh b/support/build.sh index 813c633a..92989213 100755 --- a/support/build.sh +++ b/support/build.sh @@ -23,19 +23,34 @@ VERSION=$(cat ../package.json | grep version | head -1 | awk -F: '{ print $2 }' echo "Building version $VERSION" -docker buildx create --append --use --name picsur +# Allow host networking for buildx +docker buildx create --append --use --name picsur --driver-opt network=host docker buildx build \ --push \ + --network host \ -t "$PACKAGE_URL-stage1:$VERSION" \ -t "$PACKAGE_URL-stage1:latest" \ -f ./picsur-stage1.Dockerfile .. +# Exit if stage1 build failed +if [ $? -ne 0 ]; then + echo "Stage1 build failed" + exit 1 +fi + docker buildx build \ --platform linux/amd64,linux/arm64 \ --push \ + --network host \ -t "$PACKAGE_URL:$VERSION" \ -t "$PACKAGE_URL:latest" \ -f ./picsur-stage2.Dockerfile .. +# Exit if stage2 build failed +if [ $? -ne 0 ]; then + echo "Stage2 build failed" + exit 1 +fi + echo "Done pushing $PACKAGE_URL:$VERSION" diff --git a/support/picsur-stage1.Dockerfile b/support/picsur-stage1.Dockerfile index d12597c7..d7414cd9 100644 --- a/support/picsur-stage1.Dockerfile +++ b/support/picsur-stage1.Dockerfile @@ -1,6 +1,6 @@ # This dockerfile only builds the javascript part of the project, so tsc and angular compilation -FROM node:latest AS BUILDER_STAGE1 +FROM node:18 AS BUILDER_STAGE1 SHELL ["/bin/bash", "-c"] diff --git a/support/picsur-stage2.Dockerfile b/support/picsur-stage2.Dockerfile index d45f5d8d..ea00a0c2 100644 --- a/support/picsur-stage2.Dockerfile +++ b/support/picsur-stage2.Dockerfile @@ -3,7 +3,7 @@ # Always fetch amd64 image FROM ghcr.io/rubikscraft/picsur-alpha-stage1:latest AS BUILDER_STAGE1 -FROM node:alpine AS BUILDER_STAGE2 +FROM node:18-alpine AS BUILDER_STAGE2 RUN apk add python3 build-base @@ -12,7 +12,7 @@ COPY --from=BUILDER_STAGE1 /picsur ./ RUN yarn workspaces focus -A --production -FROM node:alpine +FROM node:18-alpine ENV PICSUR_PRODUCTION=true diff --git a/yarn.lock b/yarn.lock index b9313afd..3c35778e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@adobe/css-tools@npm:^4.0.1": - version: 4.0.1 - resolution: "@adobe/css-tools@npm:4.0.1" - checksum: 80226e2229024c21da9ffa6b5cd4a34b931f071e06f45aba4777ade071d7a6c94605cf73b13718b0c4b34e8b124c65c607b82eaa53a326d3eb73d9682a04a593 - languageName: node - linkType: hard - "@ampproject/remapping@npm:2.2.0, @ampproject/remapping@npm:^2.1.0": version: 2.2.0 resolution: "@ampproject/remapping@npm:2.2.0" @@ -22,115 +15,115 @@ __metadata: languageName: node linkType: hard -"@angular-builders/custom-webpack@npm:^14.0.1": - version: 14.0.1 - resolution: "@angular-builders/custom-webpack@npm:14.0.1" +"@angular-builders/custom-webpack@npm:^15.0.0": + version: 15.0.0 + resolution: "@angular-builders/custom-webpack@npm:15.0.0" dependencies: - "@angular-devkit/architect": ">=0.1400.0 < 0.1500.0" - "@angular-devkit/build-angular": ^14.0.0 - "@angular-devkit/core": ^14.0.0 + "@angular-devkit/architect": ">=0.1500.0 < 0.1600.0" + "@angular-devkit/build-angular": ^15.0.0 + "@angular-devkit/core": ^15.0.0 lodash: ^4.17.15 ts-node: ^10.0.0 - tsconfig-paths: ^3.9.0 + tsconfig-paths: ^4.1.0 webpack-merge: ^5.7.3 peerDependencies: - "@angular/compiler-cli": ^14.0.0 - checksum: 6cae568d4f010588f251a5acb9dbf66584e7850243eba3c5c14059b73b48310d1c98a4e1d8b1789bf6d7c1ab2dcf434d3252fdde6a668670c1730a21c56d4150 + "@angular/compiler-cli": ^15.0.0 + checksum: 3f69163c7893c1f5eadccfad76c8432ca8b38066cf43f54c16645b8435d73b30db20d5499d30f0dea620893daa68f32bc1eef1e7d08bdb6e19cf2245f4e13448 languageName: node linkType: hard -"@angular-devkit/architect@npm:0.1402.5, @angular-devkit/architect@npm:>=0.1400.0 < 0.1500.0": - version: 0.1402.5 - resolution: "@angular-devkit/architect@npm:0.1402.5" +"@angular-devkit/architect@npm:0.1500.4, @angular-devkit/architect@npm:>=0.1500.0 < 0.1600.0": + version: 0.1500.4 + resolution: "@angular-devkit/architect@npm:0.1500.4" dependencies: - "@angular-devkit/core": 14.2.5 + "@angular-devkit/core": 15.0.4 rxjs: 6.6.7 - checksum: 6934853df05b2a7279574b97ce2cf5fb7419344fda353fb10a05f46acfa9e993d3c2d093faa2c768adae54602ee4b932c002eb8c4f49997b797b91a517d8d3b3 + checksum: 80900e0ac44b8c5e84ea2c8edb5ca1469b75a7e2cbbbb5da7a9a833f423bcbd208a10d41346e19dfc0092a257275fc90bbde26c6fe8a3ee6d03b4cb24fb2b195 languageName: node linkType: hard -"@angular-devkit/build-angular@npm:14.2.5, @angular-devkit/build-angular@npm:^14.0.0": - version: 14.2.5 - resolution: "@angular-devkit/build-angular@npm:14.2.5" +"@angular-devkit/build-angular@npm:^15.0.0, @angular-devkit/build-angular@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular-devkit/build-angular@npm:15.0.4" dependencies: "@ampproject/remapping": 2.2.0 - "@angular-devkit/architect": 0.1402.5 - "@angular-devkit/build-webpack": 0.1402.5 - "@angular-devkit/core": 14.2.5 - "@babel/core": 7.18.10 - "@babel/generator": 7.18.12 + "@angular-devkit/architect": 0.1500.4 + "@angular-devkit/build-webpack": 0.1500.4 + "@angular-devkit/core": 15.0.4 + "@babel/core": 7.20.2 + "@babel/generator": 7.20.4 "@babel/helper-annotate-as-pure": 7.18.6 - "@babel/plugin-proposal-async-generator-functions": 7.18.10 + "@babel/plugin-proposal-async-generator-functions": 7.20.1 "@babel/plugin-transform-async-to-generator": 7.18.6 - "@babel/plugin-transform-runtime": 7.18.10 - "@babel/preset-env": 7.18.10 - "@babel/runtime": 7.18.9 + "@babel/plugin-transform-runtime": 7.19.6 + "@babel/preset-env": 7.20.2 + "@babel/runtime": 7.20.1 "@babel/template": 7.18.10 "@discoveryjs/json-ext": 0.5.7 - "@ngtools/webpack": 14.2.5 + "@ngtools/webpack": 15.0.4 ansi-colors: 4.1.3 - babel-loader: 8.2.5 + autoprefixer: 10.4.13 + babel-loader: 9.1.0 babel-plugin-istanbul: 6.1.1 - browserslist: ^4.9.1 - cacache: 16.1.2 + browserslist: 4.21.4 + cacache: 17.0.2 + chokidar: 3.5.3 copy-webpack-plugin: 11.0.0 critters: 0.0.16 - css-loader: 6.7.1 - esbuild: 0.15.5 - esbuild-wasm: 0.15.5 + css-loader: 6.7.3 + esbuild: 0.15.13 + esbuild-wasm: 0.15.13 glob: 8.0.3 https-proxy-agent: 5.0.1 inquirer: 8.2.4 - jsonc-parser: 3.1.0 + jsonc-parser: 3.2.0 karma-source-map-support: 1.4.0 less: 4.1.3 - less-loader: 11.0.0 + less-loader: 11.1.0 license-webpack-plugin: 4.0.2 - loader-utils: 3.2.0 + loader-utils: 3.2.1 + magic-string: 0.26.7 mini-css-extract-plugin: 2.6.1 - minimatch: 5.1.0 open: 8.4.0 ora: 5.4.1 parse5-html-rewriting-stream: 6.0.1 piscina: 3.2.0 - postcss: 8.4.16 - postcss-import: 15.0.0 + postcss: 8.4.19 postcss-loader: 7.0.1 - postcss-preset-env: 7.8.0 - regenerator-runtime: 0.13.9 resolve-url-loader: 5.0.0 rxjs: 6.6.7 - sass: 1.54.4 - sass-loader: 13.0.2 - semver: 7.3.7 - source-map-loader: 4.0.0 + sass: 1.56.1 + sass-loader: 13.2.0 + semver: 7.3.8 + source-map-loader: 4.0.1 source-map-support: 0.5.21 - stylus: 0.59.0 - stylus-loader: 7.0.0 - terser: 5.14.2 + terser: 5.15.1 text-table: 0.2.0 tree-kill: 1.2.2 - tslib: 2.4.0 - webpack: 5.74.0 + tslib: 2.4.1 + webpack: 5.75.0 webpack-dev-middleware: 5.3.3 - webpack-dev-server: 4.11.0 + webpack-dev-server: 4.11.1 webpack-merge: 5.8.0 webpack-subresource-integrity: 5.1.0 peerDependencies: - "@angular/compiler-cli": ^14.0.0 - "@angular/localize": ^14.0.0 - "@angular/service-worker": ^14.0.0 + "@angular/compiler-cli": ^15.0.0 + "@angular/localize": ^15.0.0 + "@angular/platform-server": ^15.0.0 + "@angular/service-worker": ^15.0.0 karma: ^6.3.0 - ng-packagr: ^14.0.0 + ng-packagr: ^15.0.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 - typescript: ">=4.6.2 <4.9" + typescript: ~4.8.2 dependenciesMeta: esbuild: optional: true peerDependenciesMeta: "@angular/localize": optional: true + "@angular/platform-server": + optional: true "@angular/service-worker": optional: true karma: @@ -141,20 +134,20 @@ __metadata: optional: true tailwindcss: optional: true - checksum: 355dd8c77e8fb797e52e644543da034049b9fed15f8c7730db096a2297e2c8c289709148c611e32ca575e5aacd403c77db5248eb6ee4b50f5a38166a7874cd36 + checksum: dbd7ad99edcc4bdc7c9dddd3ec055c66c0605ff9b86d261c27a5fb6e49ab9ef87e506d2925764ab405eb6b0dc25eb1222e81beac7cf07c2576c5ba324c0a65a4 languageName: node linkType: hard -"@angular-devkit/build-webpack@npm:0.1402.5": - version: 0.1402.5 - resolution: "@angular-devkit/build-webpack@npm:0.1402.5" +"@angular-devkit/build-webpack@npm:0.1500.4": + version: 0.1500.4 + resolution: "@angular-devkit/build-webpack@npm:0.1500.4" dependencies: - "@angular-devkit/architect": 0.1402.5 + "@angular-devkit/architect": 0.1500.4 rxjs: 6.6.7 peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 - checksum: 6c2c5044aa4c2afcb31db81b77f7ade7cc97ceb26885b06d2c5af3b3ef566f869ac97b64307865001ab2563d6406bc6d6a1a46bcc68928d085446b171ae34950 + checksum: 393e7498aa16eb250c22b60bc433ac49e84178900357ca5b50ad17065df42f484171a5fcda21abd6bce8f8bf269f2aaddc5f19b84b05fdb74c12010ed87a6a7d languageName: node linkType: hard @@ -194,13 +187,13 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:14.2.5, @angular-devkit/core@npm:^14.0.0": - version: 14.2.5 - resolution: "@angular-devkit/core@npm:14.2.5" +"@angular-devkit/core@npm:15.0.4, @angular-devkit/core@npm:^15.0.0": + version: 15.0.4 + resolution: "@angular-devkit/core@npm:15.0.4" dependencies: ajv: 8.11.0 ajv-formats: 2.1.1 - jsonc-parser: 3.1.0 + jsonc-parser: 3.2.0 rxjs: 6.6.7 source-map: 0.7.4 peerDependencies: @@ -208,7 +201,7 @@ __metadata: peerDependenciesMeta: chokidar: optional: true - checksum: 57eeed5de8dca62fb6bd0b24696143424f61dbeced6ff048156c9074eca830dd5758f543423792d876710a92e230c98daedd6093efcce1caff48ff552aecab5c + checksum: e2d7488cae4f11b008fdf3cc10cb6cfdec09a7ba36b31b7199308d21cae016bfaf41701c5e1003af6dbc1d02b929471f89a924fc258da7129d72cc9b945136cc languageName: node linkType: hard @@ -254,212 +247,257 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/schematics@npm:14.2.5": - version: 14.2.5 - resolution: "@angular-devkit/schematics@npm:14.2.5" +"@angular-devkit/schematics@npm:15.0.4": + version: 15.0.4 + resolution: "@angular-devkit/schematics@npm:15.0.4" dependencies: - "@angular-devkit/core": 14.2.5 - jsonc-parser: 3.1.0 - magic-string: 0.26.2 + "@angular-devkit/core": 15.0.4 + jsonc-parser: 3.2.0 + magic-string: 0.26.7 ora: 5.4.1 rxjs: 6.6.7 - checksum: 0bd9ec3777ff8d346ba6942988768456c44c062e785e7a7d9d051cce64cc31ec8f71b5e71c5d595ab3ebb1f29cf1cde117c8a7a0bd0e81ac3a4faef662705c53 + checksum: f9f574a0bb1931589f6c0ee32348faf7335d9d2b3411c4fc5768a7c64bae677d21ca2f100758f7e66f1fc8585ee5360dcc64c0115892c42ec756d5a182846dad languageName: node linkType: hard -"@angular/animations@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/animations@npm:14.2.5" +"@angular/animations@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/animations@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/core": 14.2.5 - checksum: 77aca2ad30a6334bf85517cad4e69ae0597717c887684835333ed995f6c9f863e7d49d2fd085327a1e62de1f61efa4d2d6aa3c3de838e531a64dc797bbe44593 + "@angular/core": 15.0.4 + checksum: 49f457b0ab34bc8eae8947bb75bb83b837460895ac24adb537239d2d488eef717fbec3cd58bc9695a2a16216121fc146acffa0ab3d4e89385de7114114147654 languageName: node linkType: hard -"@angular/cdk@npm:^14.2.4": - version: 14.2.4 - resolution: "@angular/cdk@npm:14.2.4" +"@angular/cdk@npm:^15.0.3": + version: 15.0.3 + resolution: "@angular/cdk@npm:15.0.3" dependencies: - parse5: ^5.0.0 + parse5: ^7.1.2 tslib: ^2.3.0 peerDependencies: - "@angular/common": ^14.0.0 || ^15.0.0 - "@angular/core": ^14.0.0 || ^15.0.0 + "@angular/common": ^15.0.0 || ^16.0.0 + "@angular/core": ^15.0.0 || ^16.0.0 rxjs: ^6.5.3 || ^7.4.0 dependenciesMeta: parse5: optional: true - checksum: e3dcc137813d7711425facdfaa4f28086682b47e43ece3a50aa2986621bf44ded24681924bb533090112efc23fffc1ec08279ea1c87de96e5312fa1a8705210e + checksum: 134b4077deaf094c47ca422a196130a79501200fee6932c1ed1cf5283c9589f3b18fbd93ebb925bc8fe0d2575c949581089236787ab8e5e8448a62a2dfacb0dc languageName: node linkType: hard -"@angular/cli@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/cli@npm:14.2.5" +"@angular/cli@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/cli@npm:15.0.4" dependencies: - "@angular-devkit/architect": 0.1402.5 - "@angular-devkit/core": 14.2.5 - "@angular-devkit/schematics": 14.2.5 - "@schematics/angular": 14.2.5 + "@angular-devkit/architect": 0.1500.4 + "@angular-devkit/core": 15.0.4 + "@angular-devkit/schematics": 15.0.4 + "@schematics/angular": 15.0.4 "@yarnpkg/lockfile": 1.1.0 ansi-colors: 4.1.3 - debug: 4.3.4 - ini: 3.0.0 + ini: 3.0.1 inquirer: 8.2.4 - jsonc-parser: 3.1.0 - npm-package-arg: 9.1.0 - npm-pick-manifest: 7.0.1 + jsonc-parser: 3.2.0 + npm-package-arg: 9.1.2 + npm-pick-manifest: 8.0.1 open: 8.4.0 ora: 5.4.1 - pacote: 13.6.2 + pacote: 15.0.6 resolve: 1.22.1 - semver: 7.3.7 + semver: 7.3.8 symbol-observable: 4.0.0 - uuid: 8.3.2 - yargs: 17.5.1 + yargs: 17.6.2 bin: ng: bin/ng.js - checksum: 90781cfb9c5f922f2f65c34d91221b2e3c283efa5d2b817783099959528596f2e06d703aa2811b44e8488fedbb58d94254507cca88398569f5edc9ea11f47f3c + checksum: 14c327ca6fc41e51f47c97217e7044faf6df35b135906e137e133ede0104a3bfd3f66a370b169c1655cbebbda1fac72eba72bcfe0b56cc22953f6ef44cdbe560 languageName: node linkType: hard -"@angular/common@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/common@npm:14.2.5" +"@angular/common@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/common@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/core": 14.2.5 + "@angular/core": 15.0.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: 1ec6c1f93dfedd96ef932a959772ff6d4c09a75c0131ec26c44723cf986d5ac9ddd5b90cee8e837320fae4b4aeef557c24a12f2ec5a0913fcfaa911366ca29b7 + checksum: c220ead880258400ce0b3d321563c7f0313e818951d57f044537164be8e2d3499184707449ae02ab88cc6c6b3cc916ad0d209df7bea5ca4d3e433956cc16c3cf languageName: node linkType: hard -"@angular/compiler-cli@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/compiler-cli@npm:14.2.5" +"@angular/compiler-cli@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/compiler-cli@npm:15.0.4" dependencies: "@babel/core": ^7.17.2 + "@jridgewell/sourcemap-codec": ^1.4.14 chokidar: ^3.0.0 convert-source-map: ^1.5.1 dependency-graph: ^0.11.0 - magic-string: ^0.26.0 + magic-string: ^0.27.0 reflect-metadata: ^0.1.2 semver: ^7.0.0 - sourcemap-codec: ^1.4.8 tslib: ^2.3.0 yargs: ^17.2.1 peerDependencies: - "@angular/compiler": 14.2.5 - typescript: ">=4.6.2 <4.9" + "@angular/compiler": 15.0.4 + typescript: ">=4.8.2 <4.9" bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js ngcc: bundles/ngcc/main-ngcc.js - checksum: fca23275ae20e87d3a49c5b596c04ee074eec5d5f0f2eda1abe7791b9b676328166f587d9fd479dc9e3803c9373249ff3ac309be6a5092a2aabc694f4b60e60b + checksum: 1ca50ac958d3eecafedf971cc8b553a48990d12cc085dd00239743bc209b7af5faa21c876b957ac9918fc9025c9b4138cb6f5f4a659d6ecce82c430ecfcb77a0 languageName: node linkType: hard -"@angular/compiler@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/compiler@npm:14.2.5" +"@angular/compiler@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/compiler@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/core": 14.2.5 + "@angular/core": 15.0.4 peerDependenciesMeta: "@angular/core": optional: true - checksum: 665718c8384a7bd7aa150342658775afac2375ba41fa896fba74bee2f0ca29173ce3dfba2cce6aa483d486afa968235f4b1c8647050740bf74aaeb3fb89f1e42 + checksum: ea4f5be7ab6b1c63986bb4971d81aace6a5c47b64d608ec02d7e73152242ad1292181c02815e9a04edbd4943d47da843dc9730ddd348e6a502db082a19f3ccc3 languageName: node linkType: hard -"@angular/core@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/core@npm:14.2.5" +"@angular/core@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/core@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.11.4 - checksum: e8c286d9b8cd099666f6b7d4d6b5bb9206812642b2fc4a7d5f3dff54da00641cc79c84f2e7f374f1cde448933bae1b429bca1dd6d8508df98aa65bd6b6b7f665 + zone.js: ~0.11.4 || ~0.12.0 + checksum: bdd044b51674f29a667a5d9e10d4f619f34761cb43a7764fac0806edcb0d41f0231a97aef4ce8934eaac1ed7f6636c0222f0e5b5d0c19674aacbb43414422b02 languageName: node linkType: hard -"@angular/forms@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/forms@npm:14.2.5" +"@angular/forms@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/forms@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/common": 14.2.5 - "@angular/core": 14.2.5 - "@angular/platform-browser": 14.2.5 + "@angular/common": 15.0.4 + "@angular/core": 15.0.4 + "@angular/platform-browser": 15.0.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: d44e36417afd49479e5fa6b91c7f0274781a801c00585a4e86f71fac5dbaa167e2a04ba35284882f25b5b97f787e414a03f35c8467c98308db898bbcf340d4f0 - languageName: node - linkType: hard - -"@angular/material@npm:^14.2.4": - version: 14.2.4 - resolution: "@angular/material@npm:14.2.4" - dependencies: + checksum: aafb32e2bba4fb26d2045a6d0d6bf19fef5d9f9f25f2e43b5a91fa4136b923b50abd6d52a2c84bf957a2e5309081e8c0b1a9c55775bba8455357ec6e6097c8f3 + languageName: node + linkType: hard + +"@angular/material@npm:^15.0.3": + version: 15.0.3 + resolution: "@angular/material@npm:15.0.3" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/auto-init": 15.0.0-canary.7971d6ad5.0 + "@material/banner": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/button": 15.0.0-canary.7971d6ad5.0 + "@material/card": 15.0.0-canary.7971d6ad5.0 + "@material/checkbox": 15.0.0-canary.7971d6ad5.0 + "@material/chips": 15.0.0-canary.7971d6ad5.0 + "@material/circular-progress": 15.0.0-canary.7971d6ad5.0 + "@material/data-table": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dialog": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/drawer": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/fab": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/floating-label": 15.0.0-canary.7971d6ad5.0 + "@material/form-field": 15.0.0-canary.7971d6ad5.0 + "@material/icon-button": 15.0.0-canary.7971d6ad5.0 + "@material/image-list": 15.0.0-canary.7971d6ad5.0 + "@material/layout-grid": 15.0.0-canary.7971d6ad5.0 + "@material/line-ripple": 15.0.0-canary.7971d6ad5.0 + "@material/linear-progress": 15.0.0-canary.7971d6ad5.0 + "@material/list": 15.0.0-canary.7971d6ad5.0 + "@material/menu": 15.0.0-canary.7971d6ad5.0 + "@material/menu-surface": 15.0.0-canary.7971d6ad5.0 + "@material/notched-outline": 15.0.0-canary.7971d6ad5.0 + "@material/radio": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/segmented-button": 15.0.0-canary.7971d6ad5.0 + "@material/select": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/slider": 15.0.0-canary.7971d6ad5.0 + "@material/snackbar": 15.0.0-canary.7971d6ad5.0 + "@material/switch": 15.0.0-canary.7971d6ad5.0 + "@material/tab": 15.0.0-canary.7971d6ad5.0 + "@material/tab-bar": 15.0.0-canary.7971d6ad5.0 + "@material/tab-indicator": 15.0.0-canary.7971d6ad5.0 + "@material/tab-scroller": 15.0.0-canary.7971d6ad5.0 + "@material/textfield": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tooltip": 15.0.0-canary.7971d6ad5.0 + "@material/top-app-bar": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 tslib: ^2.3.0 peerDependencies: - "@angular/animations": ^14.0.0 || ^15.0.0 - "@angular/cdk": 14.2.4 - "@angular/common": ^14.0.0 || ^15.0.0 - "@angular/core": ^14.0.0 || ^15.0.0 - "@angular/forms": ^14.0.0 || ^15.0.0 - "@angular/platform-browser": ^14.0.0 || ^15.0.0 + "@angular/animations": ^15.0.0 || ^16.0.0 + "@angular/cdk": 15.0.3 + "@angular/common": ^15.0.0 || ^16.0.0 + "@angular/core": ^15.0.0 || ^16.0.0 + "@angular/forms": ^15.0.0 || ^16.0.0 + "@angular/platform-browser": ^15.0.0 || ^16.0.0 rxjs: ^6.5.3 || ^7.4.0 - checksum: 9ae5704fa96b3481788f45833e0d02cfbe673666b31d4c502cd7b983d91f2e25483b9bab1dad01d276b4850ea52961cc2a2fffc37be210211ff732eab948d439 + checksum: 75174e8af189b44bb378354ef979fa263d913f2e4708e72ebad3bc14abb05a41629dd56de46edf1e273da0029ec34447ed1981f2fc96751a97d03e19142b0b46 languageName: node linkType: hard -"@angular/platform-browser-dynamic@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/platform-browser-dynamic@npm:14.2.5" +"@angular/platform-browser-dynamic@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/platform-browser-dynamic@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/common": 14.2.5 - "@angular/compiler": 14.2.5 - "@angular/core": 14.2.5 - "@angular/platform-browser": 14.2.5 - checksum: 45061335e170bd59e69a2489c39c0ddb1d564c6504c59b733a7cc6b4fad7818cdde791facac98e204865cc1f697e9e1da1cc2bf5bfeb9097cd2c7fb15a00d0eb + "@angular/common": 15.0.4 + "@angular/compiler": 15.0.4 + "@angular/core": 15.0.4 + "@angular/platform-browser": 15.0.4 + checksum: 1a3ad7b5b259ac7ee63a9392cd32d1a4d83a1a9493b81fc1b46e6194a6af9395d9335ab58b23fcc7adb2ea887384117d51ca76571e4ad0fbb2ed747cfc9a8584 languageName: node linkType: hard -"@angular/platform-browser@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/platform-browser@npm:14.2.5" +"@angular/platform-browser@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/platform-browser@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/animations": 14.2.5 - "@angular/common": 14.2.5 - "@angular/core": 14.2.5 + "@angular/animations": 15.0.4 + "@angular/common": 15.0.4 + "@angular/core": 15.0.4 peerDependenciesMeta: "@angular/animations": optional: true - checksum: 20b95e403326ec36f9824148f6d14fc3e9367ad663afe9dfc213a65d58d45782c80731571522448d7ca9be530af2e5da1321977f7d1bccbbe2eb43ea3295683c + checksum: a8cd2d4c7b1bf38f5c04ef6cc31399153a66f56b08698d59306568a850d602029e7b1a8962906007c8e8b73959c97c8062dffdf389250d8def79cbac45eae4bc languageName: node linkType: hard -"@angular/router@npm:^14.2.5": - version: 14.2.5 - resolution: "@angular/router@npm:14.2.5" +"@angular/router@npm:^15.0.4": + version: 15.0.4 + resolution: "@angular/router@npm:15.0.4" dependencies: tslib: ^2.3.0 peerDependencies: - "@angular/common": 14.2.5 - "@angular/core": 14.2.5 - "@angular/platform-browser": 14.2.5 + "@angular/common": 15.0.4 + "@angular/core": 15.0.4 + "@angular/platform-browser": 15.0.4 rxjs: ^6.5.3 || ^7.4.0 - checksum: 99027ce3e552facb5d428940ee1b24273e602b321212d25064c4c3fbf462affb3921acbf9776d31264863db1ddda3d62cde0db12c29c3b1f8811d5fb337f3764 + checksum: 970ae295fca61011fe4ff120124645505e0c99c68e7b659c81fdeead4dec734f204401082fe648bbcbc5bd7a955c5e544036ae8138d406597496e1d18b158351 languageName: node linkType: hard @@ -479,55 +517,55 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.18.8": - version: 7.18.13 - resolution: "@babel/compat-data@npm:7.18.13" - checksum: 869a730dc3ec40d4d5141b832d50b16702a2ea7bf5b87dc2761e7dfaa8deeafa03b8809fc42ff713ac1d450748dcdb07e1eb21f4633e10b87fd47be0065573e6 +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.0, @babel/compat-data@npm:^7.20.1": + version: 7.20.5 + resolution: "@babel/compat-data@npm:7.20.5" + checksum: 523790c43ef6388fae91d1ca9acf1ab0e1b22208dcd39c0e5e7a6adf0b48a133f1831be8d5931a72ecd48860f3e3fb777cb89840794abd8647a5c8e5cfab484e languageName: node linkType: hard -"@babel/core@npm:7.18.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.17.2": - version: 7.18.10 - resolution: "@babel/core@npm:7.18.10" +"@babel/core@npm:7.20.2, @babel/core@npm:^7.12.3, @babel/core@npm:^7.17.2": + version: 7.20.2 + resolution: "@babel/core@npm:7.20.2" dependencies: "@ampproject/remapping": ^2.1.0 "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.10 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helpers": ^7.18.9 - "@babel/parser": ^7.18.10 + "@babel/generator": ^7.20.2 + "@babel/helper-compilation-targets": ^7.20.0 + "@babel/helper-module-transforms": ^7.20.2 + "@babel/helpers": ^7.20.1 + "@babel/parser": ^7.20.2 "@babel/template": ^7.18.10 - "@babel/traverse": ^7.18.10 - "@babel/types": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.2 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.1 semver: ^6.3.0 - checksum: 3a3fcd878430a9e1cb165f755c89fff45acc4efe4dd3a2ba356e89af331cb1947886b9782d56902a49af19ba3c24f08cf638a632699b9c5a4d8305c57c6a150d + checksum: 98faaaef26103a276a30a141b951a93bc8418d100d1f668bf7a69d12f3e25df57958e8b6b9100d95663f720db62da85ade736f6629a5ebb1e640251a1b43c0e4 languageName: node linkType: hard -"@babel/generator@npm:7.18.12": - version: 7.18.12 - resolution: "@babel/generator@npm:7.18.12" +"@babel/generator@npm:7.20.4": + version: 7.20.4 + resolution: "@babel/generator@npm:7.20.4" dependencies: - "@babel/types": ^7.18.10 + "@babel/types": ^7.20.2 "@jridgewell/gen-mapping": ^0.3.2 jsesc: ^2.5.1 - checksum: 07dd71d255144bb703a80ab0156c35d64172ce81ddfb70ff24e2be687b052080233840c9a28d92fa2c33f7ecb8a8b30aef03b807518afc53b74c7908bf8859b1 + checksum: 967b59f18e5ce999e5a741825bcecb2be4bbfc1824a92c21b47d0b5694e0eb09314a70f8b9142e9591c149c7fb83d51f73ae8fbd96d30a42666425889e51ceb1 languageName: node linkType: hard -"@babel/generator@npm:^7.18.10, @babel/generator@npm:^7.18.13": - version: 7.18.13 - resolution: "@babel/generator@npm:7.18.13" +"@babel/generator@npm:^7.20.2, @babel/generator@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/generator@npm:7.20.5" dependencies: - "@babel/types": ^7.18.13 + "@babel/types": ^7.20.5 "@jridgewell/gen-mapping": ^0.3.2 jsesc: ^2.5.1 - checksum: 27f5e7eb774e4d76ee75dc96e3e1bd26cc0ee7cea13a8f7342b716319c0a4d4e26fc49aa8f19316f7c99383da55eeb2a866c6e034e9deacad58a9de9ed6004fb + checksum: 31c10d1e122f08cf755a24bd6f5d197f47eceba03f1133759687d00ab72d210e60ba4011da42f368b6e9fa85cbfda7dc4adb9889c2c20cc5c34bb2d57c1deab7 languageName: node linkType: hard @@ -550,17 +588,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-compilation-targets@npm:7.18.9" +"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/helper-compilation-targets@npm:7.20.0" dependencies: - "@babel/compat-data": ^7.18.8 + "@babel/compat-data": ^7.20.0 "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.20.2 + browserslist: ^4.21.3 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2a9d71e124e098a9f45de4527ddd1982349d231827d341e00da9dfb967e260ecc7662c8b62abee4a010fb34d5f07a8d2155c974e0bc1928144cee5644910621d + checksum: bc183f2109648849c8fde0b3c5cf08adf2f7ad6dc617b546fd20f34c8ef574ee5ee293c8d1bd0ed0221212e8f5907cdc2c42097870f1dcc769a654107d82c95b languageName: node linkType: hard @@ -581,21 +619,21 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.18.6" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.20.5" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 - regexpu-core: ^5.1.0 + regexpu-core: ^5.2.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2d76e660cbfd0bfcb01ca9f177f0e9091c871a6b99f68ece6bcf4ab4a9df073485bdc2d87ecdfbde44b7f3723b26d13085d0f92082adb3ae80d31b246099f10a + checksum: 7f29c3cb7447cca047b0d394f8ab98e4923d00e86a7afa56e5df9770c48ec107891505d2d1f06b720ecc94ed24bf58d90986cc35fe4a43b549eb7b7a5077b693 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.3.2": - version: 0.3.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.3.2" +"@babel/helper-define-polyfill-provider@npm:^0.3.3": + version: 0.3.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.3.3" dependencies: "@babel/helper-compilation-targets": ^7.17.7 "@babel/helper-plugin-utils": ^7.16.7 @@ -605,7 +643,7 @@ __metadata: semver: ^6.1.2 peerDependencies: "@babel/core": ^7.4.0-0 - checksum: 8f693ab8e9d73873c2e547c7764c7d32d73c14f8dcefdd67fd3a038eb75527e2222aa53412ea673b9bfc01c32a8779a60e77a7381bbdd83452f05c9b7ef69c2c + checksum: 8e3fe75513302e34f6d92bd67b53890e8545e6c5bca8fe757b9979f09d68d7e259f6daea90dc9e01e332c4f8781bda31c5fe551c82a277f9bc0bec007aed497c languageName: node linkType: hard @@ -625,13 +663,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-function-name@npm:7.18.9" +"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-function-name@npm:7.19.0" dependencies: - "@babel/template": ^7.18.6 - "@babel/types": ^7.18.9 - checksum: d04c44e0272f887c0c868651be7fc3c5690531bea10936f00d4cca3f6d5db65e76dfb49e8d553c42ae1fe1eba61ccce9f3d93ba2df50a66408c8d4c3cc61cf0c + "@babel/template": ^7.18.10 + "@babel/types": ^7.19.0 + checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e languageName: node linkType: hard @@ -662,19 +700,19 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-module-transforms@npm:7.18.9" +"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6, @babel/helper-module-transforms@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-module-transforms@npm:7.20.2" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 + "@babel/helper-simple-access": ^7.20.2 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/helper-validator-identifier": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: af08c60ea239ff3d40eda542fceaab69de17e713f131e80ead08c975ba7a47dd55d439cb48cfb14ae7ec96704a10c989ff5a5240e52a39101cb44a49467ce058 + "@babel/helper-validator-identifier": ^7.19.1 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.2 + checksum: 33a60ca115f6fce2c9d98e2a2e5649498aa7b23e2ae3c18745d7a021487708fc311458c33542f299387a0da168afccba94116e077f2cce49ae9e5ab83399e8a2 languageName: node linkType: hard @@ -687,10 +725,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.18.9 - resolution: "@babel/helper-plugin-utils@npm:7.18.9" - checksum: ebae876cd60f1fe238c7210986093845fa5c4cad5feeda843ea4d780bf068256717650376d3af2a5e760f2ed6a35c065ae144f99c47da3e54aa6cba99d8804e0 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.20.2 + resolution: "@babel/helper-plugin-utils@npm:7.20.2" + checksum: f6cae53b7fdb1bf3abd50fa61b10b4470985b400cc794d92635da1e7077bb19729f626adc0741b69403d9b6e411cddddb9c0157a709cc7c4eeb41e663be5d74b languageName: node linkType: hard @@ -708,25 +746,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-replace-supers@npm:7.18.9" +"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9, @babel/helper-replace-supers@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-replace-supers@npm:7.19.1" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-member-expression-to-functions": ^7.18.9 "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 2de8b29cc4bfa4e241da2de16abd5571709f6eb394206dc16e3a7816976d1691635dd4bc930881e9d798f44b48a5f1849dc7f51a62946f3e8270452be1ec5352 + "@babel/traverse": ^7.19.1 + "@babel/types": ^7.19.0 + checksum: a0e4bf79ebe7d2bb5947169e47a0b4439c73fb0ec57d446cf3ea81b736721129ec373c3f94d2ebd2716b26dd65f8e6c083dac898170d42905e7ba815a2f52c25 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-simple-access@npm:7.18.6" +"@babel/helper-simple-access@npm:^7.19.4, @babel/helper-simple-access@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-simple-access@npm:7.20.2" dependencies: - "@babel/types": ^7.18.6 - checksum: 37cd36eef199e0517845763c1e6ff6ea5e7876d6d707a6f59c9267c547a50aa0e84260ba9285d49acfaf2cfa0a74a772d92967f32ac1024c961517d40b6c16a5 + "@babel/types": ^7.20.2 + checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 languageName: node linkType: hard @@ -748,17 +786,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.18.10": - version: 7.18.10 - resolution: "@babel/helper-string-parser@npm:7.18.10" - checksum: d554a4393365b624916b5c00a4cc21c990c6617e7f3fe30be7d9731f107f12c33229a7a3db9d829bfa110d2eb9f04790745d421640e3bd245bb412dc0ea123c1 +"@babel/helper-string-parser@npm:^7.19.4": + version: 7.19.4 + resolution: "@babel/helper-string-parser@npm:7.19.4" + checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-identifier@npm:7.18.6" - checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a languageName: node linkType: hard @@ -781,14 +819,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helpers@npm:7.18.9" +"@babel/helpers@npm:^7.20.1": + version: 7.20.6 + resolution: "@babel/helpers@npm:7.20.6" dependencies: - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: d0bd8255d36bfc65dc52ce75f7fea778c70287da2d64981db4c84fbdf9581409ecbd6433deff1c81da3a5acf26d7e4c364b3a4445efacf88f4f48e77c5b34d8d + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.5 + "@babel/types": ^7.20.5 + checksum: f03ec6eb2bf8dc7cdfe2569ee421fd9ba6c7bac6c862d90b608ccdd80281ebe858bc56ca175fc92b3ac50f63126b66bbd5ec86f9f361729289a20054518f1ac5 languageName: node linkType: hard @@ -803,12 +841,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.18.13": - version: 7.18.13 - resolution: "@babel/parser@npm:7.18.13" +"@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.20.2, @babel/parser@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/parser@npm:7.20.5" bin: parser: ./bin/babel-parser.js - checksum: 8b41c35607668495d67d9a7c5f61768aaab26acf887efdadc2781aed54046981480ef40aeda0b84d61aed02cf0c4ff4b028d5f83ab85e17e2ddff318f9243b8b + checksum: e8d514ce0aa74d56725bd102919a49fa367afef9cd8208cf52f670f54b061c4672f51b4b7980058ab1f5fe73615fe4dc90720ab47bbcebae07ad08d667eda318 languageName: node linkType: hard @@ -836,17 +874,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:7.18.10, @babel/plugin-proposal-async-generator-functions@npm:^7.18.10": - version: 7.18.10 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.18.10" +"@babel/plugin-proposal-async-generator-functions@npm:7.20.1, @babel/plugin-proposal-async-generator-functions@npm:^7.20.1": + version: 7.20.1 + resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.1" dependencies: "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.19.0 "@babel/helper-remap-async-to-generator": ^7.18.9 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3a6c25085021053830f6c57780118d3337935ac3309eef7f09b11e413d189eed8119d50cbddeb4c8c02f42f8cc01e62a4667b869be6e158f40030bafb92a0629 + checksum: 518483a68c5618932109913eb7316ed5e656c575cbd9d22667bc0451e35a1be45f8eaeb8e2065834b36c8a93c4840f78cebf8f1d067b07c422f7be16d58eca60 languageName: node linkType: hard @@ -947,18 +985,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.18.9" +"@babel/plugin-proposal-object-rest-spread@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.2" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/compat-data": ^7.20.1 + "@babel/helper-compilation-targets": ^7.20.0 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.18.8 + "@babel/plugin-transform-parameters": ^7.20.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 66b9bae741d46edf1c96776d26dfe5d335981e57164ec2450583e3d20dfaa08a5137ffebb897e443913207789f9816bfec4ae845f38762c0196a60949eaffdba + checksum: 9764d1a4735fcd384fdb9b6c6ccb20d1bea2f88f648640d26ce5d9cd5880ce1e389d2f852d7bea7e86ff343726225dc16e1deb92c7b3dc5c5721ed905a602318 languageName: node linkType: hard @@ -1080,14 +1118,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.18.6" +"@babel/plugin-syntax-import-assertions@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.20.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.19.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 54918a05375325ba0c60bc81abfb261e6f118bed2de94e4c17dca9a2006fc25e13b1a8b5504b9a881238ea394fd2f098f60b2eb3a392585d6348874565445e7b + checksum: 6a86220e0aae40164cd3ffaf80e7c076a1be02a8f3480455dddbae05fda8140f429290027604df7a11b3f3f124866e8a6d69dbfa1dda61ee7377b920ad144d5b languageName: node linkType: hard @@ -1225,32 +1263,33 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.18.9" +"@babel/plugin-transform-block-scoping@npm:^7.20.2": + version: 7.20.5 + resolution: "@babel/plugin-transform-block-scoping@npm:7.20.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f8064ea431eb7aa349dc5b6be87a650f912b48cd65afde917e8644f6f840d7f9d2ce4795f2aa3955aa5b23a73d4ad38abd03386ae109b4b8702b746c6d35bda3 + checksum: 03606bc6710c15cd4e4d1163e1cbab08799f852a5dd55a1f7e115032e9406ac9430ddc0cb6d09a51a4095446985640411f60683c6fcea9bc1a7b202462022e1c languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-classes@npm:7.18.9" +"@babel/plugin-transform-classes@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/plugin-transform-classes@npm:7.20.2" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 + "@babel/helper-compilation-targets": ^7.20.0 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 + "@babel/helper-function-name": ^7.19.0 "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-replace-supers": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-replace-supers": ^7.19.1 "@babel/helper-split-export-declaration": ^7.18.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7e953c0cf32af64e75db1277d2556c04635f32691ef462436897840be6f8021d4f85ee96134cb796a12dda549cf53346fedf96b671885f881bc4037c9d120ad + checksum: 57f3467a8eb7853cdb61cda963cfb6c6568ad276d77c9de2ff5a2194650010217aa318ef3733975537c6fb906b73a019afb6ea650b01852e7d2e1fab4034361b languageName: node linkType: hard @@ -1265,14 +1304,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.18.9": - version: 7.18.13 - resolution: "@babel/plugin-transform-destructuring@npm:7.18.13" +"@babel/plugin-transform-destructuring@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/plugin-transform-destructuring@npm:7.20.2" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 83e44ec93a4cfbf69376db8836d00ec803820081bf0f8b6cea73a9b3cd320b8285768d5b385744af4a27edda4b6502245c52d3ed026ea61356faf57bfe78effb + checksum: 09033e09b28ca1b0d46a8d82f5a677b1d718a739b3c199886908c3ef1af23369317d0c429b21507d480ee82721c15892a9893be18e50ad6fc219e69312f4b097 languageName: node linkType: hard @@ -1357,45 +1396,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-amd@npm:7.18.6" +"@babel/plugin-transform-modules-amd@npm:^7.19.6": + version: 7.19.6 + resolution: "@babel/plugin-transform-modules-amd@npm:7.19.6" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-module-transforms": ^7.19.6 + "@babel/helper-plugin-utils": ^7.19.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f60c4c4e0eaec41e42c003cbab44305da7a8e05b2c9bdfc2b3fe0f9e1d7441c959ff5248aa03e350abe530e354028cbf3aa20bf07067b11510997dad8dd39be0 + checksum: 4236aad970025bc10c772c1589b1e2eab8b7681933bb5ffa6e395d4c1a52532b28c47c553e3011b4272ea81e5ab39fe969eb5349584e8390e59771055c467d42 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.6" +"@babel/plugin-transform-modules-commonjs@npm:^7.19.6": + version: 7.19.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.19.6" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-module-transforms": ^7.19.6 + "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-simple-access": ^7.19.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7e356e3df8a6a8542cced7491ec5b1cc1093a88d216a59e63a5d2b9fe9d193cbea864f680a41429e41a4f9ecec930aa5b0b8f57e2b17b3b4d27923bb12ba5d14 + checksum: 85d46945ab5ba3fff89e962d560a5d40253f228b9659a697683db3de07c0236e8cd60e5eb41958007359951a42bc268bf32350fcdb5b4a86f58dff1e032c096e languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.18.9" +"@babel/plugin-transform-modules-systemjs@npm:^7.19.6": + version: 7.19.6 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.19.6" dependencies: "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-validator-identifier": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-module-transforms": ^7.19.6 + "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-validator-identifier": ^7.19.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6122d9901ed5dc56d9db843efc9249fe20d769a11989bbbf5a806ed4f086def949185198aa767888481babf70fc52b6b3e297a991e2b02b4f34ffb03d998d1e3 + checksum: 8526431cc81ea3eb232ad50862d0ed1cbb422b5251d14a8d6610d0ca0617f6e75f35179e98eb1235d0cccb980120350b9f112594e5646dd45378d41eaaf87342 languageName: node linkType: hard @@ -1411,15 +1447,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.18.6" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.19.1": + version: 7.20.5 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.20.5" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.20.5 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0 - checksum: 6ef64aa3dad68df139eeaa7b6e9bb626be8f738ed5ed4db765d516944b1456d513b6bad3bb60fff22babe73de26436fd814a4228705b2d3d2fdb272c31da35e2 + checksum: 528c95fb1087e212f17e1c6456df041b28a83c772b9c93d2e407c9d03b72182b0d9d126770c1d6e0b23aab052599ceaf25ed6a2c0627f4249be34a83f6fae853 languageName: node linkType: hard @@ -1446,14 +1482,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-parameters@npm:7.18.8" +"@babel/plugin-transform-parameters@npm:^7.20.1": + version: 7.20.5 + resolution: "@babel/plugin-transform-parameters@npm:7.20.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2b5863300da60face8a250d91da16294333bd5626e9721b13a3ba2078bd2a5a190e32c6e7a1323d5f547f579aeb2804ff49a62a55fcad2b1d099e55a55b788ea + checksum: fa588b0d8551e3e0cfde5fcb9d63a7acd38da199bee1851dd7e2abb34b3d754684defb1209a5669ecf0076d3d17ddc375b3f107da770b550a30402e4b9d7aa2f languageName: node linkType: hard @@ -1491,19 +1527,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.18.10": - version: 7.18.10 - resolution: "@babel/plugin-transform-runtime@npm:7.18.10" +"@babel/plugin-transform-runtime@npm:7.19.6": + version: 7.19.6 + resolution: "@babel/plugin-transform-runtime@npm:7.19.6" dependencies: "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.9 - babel-plugin-polyfill-corejs2: ^0.3.2 - babel-plugin-polyfill-corejs3: ^0.5.3 - babel-plugin-polyfill-regenerator: ^0.4.0 + "@babel/helper-plugin-utils": ^7.19.0 + babel-plugin-polyfill-corejs2: ^0.3.3 + babel-plugin-polyfill-corejs3: ^0.6.0 + babel-plugin-polyfill-regenerator: ^0.4.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 98c18680b4258b8bd3f04926b73c72ae77037d5ea5b50761ca35de15896bf0d04bedabde39a81be56dbd4859c96ffaa7103fbefb5d5b58a36e0a80381e4a146c + checksum: ef93efbcbb00dcf4da6dcc55bda698a2a57fca3fb05a6a13e932ecfdb7c1c5d2f0b5b245c1c4faca0318853937caba0d82442f58b7653249f64275d08052fbd8 languageName: node linkType: hard @@ -1518,15 +1554,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-spread@npm:7.18.9" +"@babel/plugin-transform-spread@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/plugin-transform-spread@npm:7.19.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.19.0 "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 59489dd6212bd21debdf77746d9fa02dfe36f7062dc08742b8841d04312a26ea37bc0d71c71a6e37c3ab81dce744faa7f23fa94b0915593458f6adc35c087766 + checksum: e73a4deb095999185e70b524d0ff4e35df50fcda58299e700a6149a15bbc1a9b369ef1cef384e15a54b3c3ce316cc0f054dbf249dcd0d1ca59f4281dd4df9718 languageName: node linkType: hard @@ -1586,17 +1622,17 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.18.10": - version: 7.18.10 - resolution: "@babel/preset-env@npm:7.18.10" +"@babel/preset-env@npm:7.20.2": + version: 7.20.2 + resolution: "@babel/preset-env@npm:7.20.2" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/compat-data": ^7.20.1 + "@babel/helper-compilation-targets": ^7.20.0 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-validator-option": ^7.18.6 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-async-generator-functions": ^7.18.10 + "@babel/plugin-proposal-async-generator-functions": ^7.20.1 "@babel/plugin-proposal-class-properties": ^7.18.6 "@babel/plugin-proposal-class-static-block": ^7.18.6 "@babel/plugin-proposal-dynamic-import": ^7.18.6 @@ -1605,7 +1641,7 @@ __metadata: "@babel/plugin-proposal-logical-assignment-operators": ^7.18.9 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.18.9 + "@babel/plugin-proposal-object-rest-spread": ^7.20.2 "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 "@babel/plugin-proposal-optional-chaining": ^7.18.9 "@babel/plugin-proposal-private-methods": ^7.18.6 @@ -1616,7 +1652,7 @@ __metadata: "@babel/plugin-syntax-class-static-block": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.18.6 + "@babel/plugin-syntax-import-assertions": ^7.20.0 "@babel/plugin-syntax-json-strings": ^7.8.3 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 @@ -1629,10 +1665,10 @@ __metadata: "@babel/plugin-transform-arrow-functions": ^7.18.6 "@babel/plugin-transform-async-to-generator": ^7.18.6 "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.18.9 - "@babel/plugin-transform-classes": ^7.18.9 + "@babel/plugin-transform-block-scoping": ^7.20.2 + "@babel/plugin-transform-classes": ^7.20.2 "@babel/plugin-transform-computed-properties": ^7.18.9 - "@babel/plugin-transform-destructuring": ^7.18.9 + "@babel/plugin-transform-destructuring": ^7.20.2 "@babel/plugin-transform-dotall-regex": ^7.18.6 "@babel/plugin-transform-duplicate-keys": ^7.18.9 "@babel/plugin-transform-exponentiation-operator": ^7.18.6 @@ -1640,34 +1676,34 @@ __metadata: "@babel/plugin-transform-function-name": ^7.18.9 "@babel/plugin-transform-literals": ^7.18.9 "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.18.6 - "@babel/plugin-transform-modules-commonjs": ^7.18.6 - "@babel/plugin-transform-modules-systemjs": ^7.18.9 + "@babel/plugin-transform-modules-amd": ^7.19.6 + "@babel/plugin-transform-modules-commonjs": ^7.19.6 + "@babel/plugin-transform-modules-systemjs": ^7.19.6 "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.18.6 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.19.1 "@babel/plugin-transform-new-target": ^7.18.6 "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.18.8 + "@babel/plugin-transform-parameters": ^7.20.1 "@babel/plugin-transform-property-literals": ^7.18.6 "@babel/plugin-transform-regenerator": ^7.18.6 "@babel/plugin-transform-reserved-words": ^7.18.6 "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.18.9 + "@babel/plugin-transform-spread": ^7.19.0 "@babel/plugin-transform-sticky-regex": ^7.18.6 "@babel/plugin-transform-template-literals": ^7.18.9 "@babel/plugin-transform-typeof-symbol": ^7.18.9 "@babel/plugin-transform-unicode-escapes": ^7.18.10 "@babel/plugin-transform-unicode-regex": ^7.18.6 "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.18.10 - babel-plugin-polyfill-corejs2: ^0.3.2 - babel-plugin-polyfill-corejs3: ^0.5.3 - babel-plugin-polyfill-regenerator: ^0.4.0 - core-js-compat: ^3.22.1 + "@babel/types": ^7.20.2 + babel-plugin-polyfill-corejs2: ^0.3.3 + babel-plugin-polyfill-corejs3: ^0.6.0 + babel-plugin-polyfill-regenerator: ^0.4.1 + core-js-compat: ^3.25.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 36eeb7157021091c8047703833b7a28e4963865d16968a5b9dbffe1eb05e44307a8d29ad45d81fd23817f68290b52921c42f513a93996c7083d23d5e2cea0c6b + checksum: ece2d7e9c7789db6116e962b8e1a55eb55c110c44c217f0c8f6ffea4ca234954e66557f7bd019b7affadf7fbb3a53ccc807e93fc935aacd48146234b73b6947e languageName: node linkType: hard @@ -1686,16 +1722,16 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.18.9, @babel/runtime@npm:^7.8.4": - version: 7.18.9 - resolution: "@babel/runtime@npm:7.18.9" +"@babel/runtime@npm:7.20.1, @babel/runtime@npm:^7.8.4": + version: 7.20.1 + resolution: "@babel/runtime@npm:7.20.1" dependencies: - regenerator-runtime: ^0.13.4 - checksum: 36dd736baba7164e82b3cc9d43e081f0cb2d05ff867ad39cac515d99546cee75b7f782018b02a3dcf5f2ef3d27f319faa68965fdfec49d4912c60c6002353a2e + regenerator-runtime: ^0.13.10 + checksum: 00567a333d3357925742a6f5e39394dcc0af6e6029103fe188158bf7ae8b0b3ee3c6c0f68fccc217f0a6cfa455f6be252298baf56b3f5ff37b34313b170cd9f6 languageName: node linkType: hard -"@babel/template@npm:7.18.10, @babel/template@npm:^7.18.10, @babel/template@npm:^7.18.6": +"@babel/template@npm:7.18.10, @babel/template@npm:^7.18.10": version: 7.18.10 resolution: "@babel/template@npm:7.18.10" dependencies: @@ -1706,32 +1742,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.10, @babel/traverse@npm:^7.18.11, @babel/traverse@npm:^7.18.9": - version: 7.18.13 - resolution: "@babel/traverse@npm:7.18.13" +"@babel/traverse@npm:^7.18.11, @babel/traverse@npm:^7.19.1, @babel/traverse@npm:^7.20.1, @babel/traverse@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/traverse@npm:7.20.5" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.13 + "@babel/generator": ^7.20.5 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 + "@babel/helper-function-name": ^7.19.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.18.13 - "@babel/types": ^7.18.13 + "@babel/parser": ^7.20.5 + "@babel/types": ^7.20.5 debug: ^4.1.0 globals: ^11.1.0 - checksum: 1a2ef738fac4968feba6385787a3f8f7357d08e7739ecc5b37d8ff5668935253a03290f700f02a85ccfd369d5898625f0722d7733bff2ef91504f6cd8b836f19 + checksum: c7fed468614aab1cf762dda5df26e2cfcd2b1b448c9d3321ac44786c4ee773fb0e10357e6593c3c6a648ae2e0be6d90462d855998dc10e3abae84de99291e008 languageName: node linkType: hard -"@babel/types@npm:^7.18.10, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.18.13 - resolution: "@babel/types@npm:7.18.13" +"@babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.20.5 + resolution: "@babel/types@npm:7.20.5" dependencies: - "@babel/helper-string-parser": ^7.18.10 - "@babel/helper-validator-identifier": ^7.18.6 + "@babel/helper-string-parser": ^7.19.4 + "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: abc3ad1f3b6864df0ea0e778bcdf7d2c5ee2293811192962d50e8a8c05c1aeec90a48275f53b2a45aad882ed8bef9477ae1f8e70ac1d44d039e14930d1388dcc + checksum: 773f0a1ad9f6ca5c5beaf751d1d8d81b9130de87689d1321fc911d73c3b1167326d66f0ae086a27fb5bfc8b4ee3ffebf1339be50d3b4d8015719692468c31f2d languageName: node linkType: hard @@ -1751,173 +1787,6 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^1.0.5": - version: 1.0.5 - resolution: "@csstools/postcss-cascade-layers@npm:1.0.5" - dependencies: - "@csstools/selector-specificity": ^2.0.2 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: f9d6954d7d7b888af9ecc6160e1a1d3dac3d11de7520007e198689c703249c7e66d6e7643828b76952a77576193f295dbcaea897ac21d01a217f94cc7935dc73 - languageName: node - linkType: hard - -"@csstools/postcss-color-function@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-color-function@npm:1.1.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 087595985ebcc2fc42013d6305185d4cdc842d87fb261185db905dc31eaa24fc23a7cc068fa3da814b3c8b98164107ddaf1b4ab24f4ff5b2a7b5fbcd4c6ceec9 - languageName: node - linkType: hard - -"@csstools/postcss-font-format-keywords@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-font-format-keywords@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: ed8d9eab9793f0184e000709bcb155d4eb96c49a312e3ea9e549e006b74fd4aafac63cb9f9f01bec5b717a833539ff085c3f1ef7d273b97d587769ef637d50c1 - languageName: node - linkType: hard - -"@csstools/postcss-hwb-function@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-hwb-function@npm:1.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 352ead754a692f7ed33a712c491012cab5c2f2946136a669a354237cfe8e6faca90c7389ee793cb329b9b0ddec984faa06d47e2f875933aaca417afff74ce6aa - languageName: node - linkType: hard - -"@csstools/postcss-ic-unit@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-ic-unit@npm:1.0.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 09c414c9b7762b5fbe837ff451d7a11e4890f1ed3c92edc3573f02f3d89747f6ac3f2270799b68a332bd7f5de05bb0dfffddb6323fc4020c2bea33ff58314533 - languageName: node - linkType: hard - -"@csstools/postcss-is-pseudo-class@npm:^2.0.7": - version: 2.0.7 - resolution: "@csstools/postcss-is-pseudo-class@npm:2.0.7" - dependencies: - "@csstools/selector-specificity": ^2.0.0 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: a4494bb8e9a34826944ba6872c91c1e88268caab6d06968897f1a0cc75ca5cfc4989435961fc668a9c6842a6d17f4cda0055fa256d23e598b8bbc6f022956125 - languageName: node - linkType: hard - -"@csstools/postcss-nested-calc@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-nested-calc@npm:1.0.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 53bb783dd61621c11c1e6e352f079577e2eb908de67947ceef31a178e070c06c223baae87acd5c3bd51c664515d2adc16166a129159168626111aff548583790 - languageName: node - linkType: hard - -"@csstools/postcss-normalize-display-values@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-normalize-display-values@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 75901daec3869ba15e0adfd50d8e2e754ec06d55ac44fbd540748476388d223d53710fb3a3cbfe6695a2bab015a489fb47d9e3914ff211736923f8deb818dc0b - languageName: node - linkType: hard - -"@csstools/postcss-oklab-function@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-oklab-function@npm:1.1.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: d66b789060b37ed810450d9a7d8319a0ae14e913c091f3e0ee482b3471538762e801d5eae3d62fda2f1eb1e88c76786d2c2b06c1172166eba1cca5e2a0dc95f2 - languageName: node - linkType: hard - -"@csstools/postcss-progressive-custom-properties@npm:^1.1.0, @csstools/postcss-progressive-custom-properties@npm:^1.3.0": - version: 1.3.0 - resolution: "@csstools/postcss-progressive-custom-properties@npm:1.3.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.3 - checksum: e281845fde5b8a80d06ec20147bd74e96a9351bebbec5e5c3a6fb37ea30a597ff84172601786a8a270662f58f708b4a3bf8d822d6318023def9773d2f6589962 - languageName: node - linkType: hard - -"@csstools/postcss-stepped-value-functions@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-stepped-value-functions@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 2fc88713a0d49d142010652be8139b00719e407df1173e46047284f1befd0647e1fff67f259f9f55ac3b46bba6462b21f0aa192bd10a2989c51a8ce0d25fc495 - languageName: node - linkType: hard - -"@csstools/postcss-text-decoration-shorthand@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:1.0.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: d27aaf97872c42bec9f6fde4d8bf924e89f7886f0aca8e4fc5aaf2f9083b09bb43dbbfa29124fa36fcdeb2d4d3e0459a095acf62188260cd1577e9811bb1276e - languageName: node - linkType: hard - -"@csstools/postcss-trigonometric-functions@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-trigonometric-functions@npm:1.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: f7f5b5f2492606b79a56f09e814ae8f10a2ae9e9c5fb8019f0e347a4a6c07953b2cc663fd4fa43a60e6994dfd958958f39df8ec760e2a646cfe71fe2bb119382 - languageName: node - linkType: hard - -"@csstools/postcss-unset-value@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-unset-value@npm:1.0.2" - peerDependencies: - postcss: ^8.2 - checksum: 3facdae154d6516ffd964f7582696f406465f11cf8dead503e0afdfecc99ebc25638ab2830affce4516131aa2db004458a235e439f575b04e9ef72ad82f55835 - languageName: node - linkType: hard - -"@csstools/selector-specificity@npm:^2.0.0, @csstools/selector-specificity@npm:^2.0.2": - version: 2.0.2 - resolution: "@csstools/selector-specificity@npm:2.0.2" - peerDependencies: - postcss: ^8.2 - postcss-selector-parser: ^6.0.10 - checksum: a2045a27276a6cfe645b6e212afc217d9a43174ea7a1fa1ab8918d5a0ace72380fbd9837fe1920c547985c11a9070dc48c5c80d483d3f581ddf7aa688204d44f - languageName: node - linkType: hard - "@discoveryjs/json-ext@npm:0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -1925,27 +1794,34 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.15.5": - version: 0.15.5 - resolution: "@esbuild/linux-loong64@npm:0.15.5" +"@esbuild/android-arm@npm:0.15.13": + version: 0.15.13 + resolution: "@esbuild/android-arm@npm:0.15.13" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.15.13": + version: 0.15.13 + resolution: "@esbuild/linux-loong64@npm:0.15.13" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.3": - version: 1.3.3 - resolution: "@eslint/eslintrc@npm:1.3.3" +"@eslint/eslintrc@npm:^1.4.0": + version: 1.4.0 + resolution: "@eslint/eslintrc@npm:1.4.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 espree: ^9.4.0 - globals: ^13.15.0 + globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + checksum: 73e39c833deafde8d8706e6fa9b52b6d99927c094ead8e405ea4174e8197ec24aac9ba88ae38cc8ad32eaccf07b9c7fc5dc70761d1fba6da41a928691447305f languageName: node linkType: hard @@ -1976,13 +1852,13 @@ __metadata: languageName: node linkType: hard -"@fastify/cors@npm:8.1.0": - version: 8.1.0 - resolution: "@fastify/cors@npm:8.1.0" +"@fastify/cors@npm:8.2.0": + version: 8.2.0 + resolution: "@fastify/cors@npm:8.2.0" dependencies: fastify-plugin: ^4.0.0 - mnemonist: 0.39.2 - checksum: 7fb48eb743b0e821b8104d308ccc76ccd105ee09ad413bf035c8975e508acb75196cee4fe4ec9b6ee5f9917346fa07fc4c08835e6e953dc7e84f27774aea3857 + mnemonist: 0.39.5 + checksum: b2e30602d3aad7b2170a153b60e2b0dba8ad7df67ac3b7918374d202097f60b8a252baeafbf37f4323190fa87170960a3162aa6120540f825ae7750414c3feea languageName: node linkType: hard @@ -2019,13 +1895,13 @@ __metadata: languageName: node linkType: hard -"@fastify/helmet@npm:^10.0.1": - version: 10.0.1 - resolution: "@fastify/helmet@npm:10.0.1" +"@fastify/helmet@npm:^10.1.0": + version: 10.1.0 + resolution: "@fastify/helmet@npm:10.1.0" dependencies: fastify-plugin: ^4.2.1 helmet: ^6.0.0 - checksum: d95935035dcfc66cef3ea996bf663e658a81c5bc42e9fa61d135e926714367e50b4e036aafb037d8058ab361c8d08d468e1a053f2fa387198c5a7d088198b897 + checksum: a2260ea660157a8c55af6a6ad82bcb7999c453fee7b9ff21377c6b2605351dfc8a36788742b7096e1141e83b539aed48ff44a9a5ac08b86257184abb81d22883 languageName: node linkType: hard @@ -2040,9 +1916,9 @@ __metadata: languageName: node linkType: hard -"@fastify/multipart@npm:^7.2.0": - version: 7.2.0 - resolution: "@fastify/multipart@npm:7.2.0" +"@fastify/multipart@npm:^7.3.0": + version: 7.3.0 + resolution: "@fastify/multipart@npm:7.3.0" dependencies: "@fastify/busboy": ^1.0.0 "@fastify/deepmerge": ^1.0.0 @@ -2052,13 +1928,28 @@ __metadata: hexoid: ^1.0.0 secure-json-parse: ^2.4.0 stream-wormhole: ^1.1.0 - checksum: 63f5d52108f781cb0e3a4f7e90fb12d679f5095e1735cd73a54366a24e15b082659bc4c91701ead231b734761d3746df4715da3cd9a31d0f3adc01ff5cdb2dc5 + checksum: 192fc4f0892c34d342a3673c6522e13c0987747c4972b52ea48ca7978ea54b5a892d4594778b643dc35f37f429496b13a4e244d8c7eef60a852fadb52144fcbe + languageName: node + linkType: hard + +"@fastify/reply-from@npm:^8.3.1": + version: 8.3.1 + resolution: "@fastify/reply-from@npm:8.3.1" + dependencies: + "@fastify/error": ^3.0.0 + end-of-stream: ^1.4.4 + fast-querystring: ^1.0.0 + fastify-plugin: ^4.0.0 + pump: ^3.0.0 + tiny-lru: ^10.0.0 + undici: ^5.5.1 + checksum: debfc85b69946ecbad21dc2b01b2740b5a562258b5e3f00c452a88691525db650499cdf3bf09d85ae3f20455372925d6d7203265d0f00fa873f380be6e16e4d7 languageName: node linkType: hard -"@fastify/static@npm:^6.5.0": - version: 6.5.0 - resolution: "@fastify/static@npm:6.5.0" +"@fastify/static@npm:^6.6.0": + version: 6.6.0 + resolution: "@fastify/static@npm:6.6.0" dependencies: "@fastify/accept-negotiator": ^1.0.0 content-disposition: ^0.5.3 @@ -2067,7 +1958,7 @@ __metadata: p-limit: ^3.1.0 readable-stream: ^4.0.0 send: ^0.18.0 - checksum: 31ef10916847c51fb4c360860f56acee1cbd7a896b66a05440d4eff70473c5b4cdf908b4719a5a22a876617fdc4a4e0fe3673bd5b40c9d61260a90e08abc1d3d + checksum: 4abefd47f404ead444742905c0596f55ee0dc264f694aeb34debcd10212e2cee8b2694159febe354454667999f397d73b06a52df6fe6150525f8c2a6af3078a8 languageName: node linkType: hard @@ -2099,14 +1990,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.10.5": - version: 0.10.7 - resolution: "@humanwhocodes/config-array@npm:0.10.7" +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 - minimatch: ^3.0.4 - checksum: 009d64be8d5bd098ff04e10af79e34f5633245250581fca032fac12a8667b2df8e7d169e69c05bff4d83ea3dd3c7d2d0e05ea9b94d89a7d092e26530caf6f8a3 + minimatch: ^3.0.5 + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 languageName: node linkType: hard @@ -2189,7 +2080,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 @@ -2242,59 +2133,857 @@ __metadata: languageName: node linkType: hard -"@nestjs/cli@npm:^9.1.4": - version: 9.1.4 - resolution: "@nestjs/cli@npm:9.1.4" +"@material/animation@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/animation@npm:15.0.0-canary.7971d6ad5.0" dependencies: - "@angular-devkit/core": 14.2.2 - "@angular-devkit/schematics": 14.2.2 - "@angular-devkit/schematics-cli": 14.2.2 - "@nestjs/schematics": ^9.0.0 - chalk: 3.0.0 - chokidar: 3.5.3 - cli-table3: 0.6.2 - commander: 4.1.1 - fork-ts-checker-webpack-plugin: 7.2.13 - inquirer: 7.3.3 - node-emoji: 1.11.0 - ora: 5.4.1 - os-name: 4.0.1 - rimraf: 3.0.2 - shelljs: 0.8.5 - source-map-support: 0.5.21 - tree-kill: 1.2.2 - tsconfig-paths: 4.1.0 - tsconfig-paths-webpack-plugin: 4.0.0 - typescript: 4.8.3 - webpack: 5.74.0 - webpack-node-externals: 3.0.0 - bin: - nest: bin/nest.js - checksum: 11b1363e8da583b6edeea9d209809631660825fdeca3866883165701ca268958c7715424d8e6b3866980365a17f74b9b830e28ad195d71cfd26c1a8398ac2ec2 + tslib: ^2.1.0 + checksum: 223f51fb6f93f2ecc0a358d78332d26db4f73487a554e1880f6eb4aa9b6a80e9cb39bf41fbc0c80a2d04e1037d28a541e21cd4c04e48618a008bebfbace74703 languageName: node linkType: hard -"@nestjs/common@npm:^9.1.4": - version: 9.1.4 - resolution: "@nestjs/common@npm:9.1.4" +"@material/auto-init@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/auto-init@npm:15.0.0-canary.7971d6ad5.0" dependencies: - iterare: 1.2.1 - tslib: 2.4.0 - uuid: 9.0.0 - peerDependencies: - cache-manager: <=5 - class-transformer: "*" - class-validator: "*" - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - cache-manager: - optional: true - class-transformer: - optional: true - class-validator: - optional: true - checksum: 7bb6998fa4db9ba9062a2c4fd74ad2613adc5d653b2b0abcca35c0a77ad917408e4ae9f048df672f5eb3c731a85269ab3422d97b3cd98c719e9fc51710a329ca + "@material/base": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 7d111305b3753c765f63f167b32305655121bf3cfad106254ca4610213698637281791c468d5815ab5f9cb31db8c7da5e2d41a71b08ac241d60bd1591ff3c0df + languageName: node + linkType: hard + +"@material/banner@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/banner@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/button": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 5b7278d1b516632a6f3bfa9c11eb5e114fc2787b052136c3a5df682e59c4cec9da6fba5cb8499ae0b56bb314070d5b24285162a0639651ba9c13c9657b12b023 + languageName: node + linkType: hard + +"@material/base@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/base@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + tslib: ^2.1.0 + checksum: 79a1b940b55bc99d2c0e433915a8d85f06398cadb75d21048acfcbbf14a565d63d360bc8ba4911d0ef393bbad4f3092f9649aba716dd35baf905c30c9285fd1b + languageName: node + linkType: hard + +"@material/button@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/button@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: bf7b1f814c0ddceafc8d08b84936bd2bde2e7b6a1d7b6ea5ae13c6d5d74b288add912e57b1df255aa89ee2289e2d0e7f84fb220c76bbce65e76066db56c55201 + languageName: node + linkType: hard + +"@material/card@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/card@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: bf5301e0dd18f1e53dc54a090377f428a23486517c91c70a5d7ca6364e14b1bf9e55bedead6b8dcb549464d55db40c1e15a5272c6ab8bfafa21f539a6ae03158 + languageName: node + linkType: hard + +"@material/checkbox@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/checkbox@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: dd6751e9fb36b1dd7ad59124c87cfab7f291ac82903e3296d239f5a521edaf2a4f917d972a4ab868ce5f99b5a8093076e818057afbbc698a7ef93e9f9b1ae2f6 + languageName: node + linkType: hard + +"@material/chips@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/chips@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/checkbox": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + safevalues: ^0.3.4 + tslib: ^2.1.0 + checksum: 6771d2dab844acfc3e58651a88f5879cc42b1a9a6a803d1aadba0b4ba585e3b8a086eb32f4971fad0908c7b3f185fefc7e1d34f61cf340b645c3af50d0ecc1e9 + languageName: node + linkType: hard + +"@material/circular-progress@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/circular-progress@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/progress-indicator": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: f17664c3119646cf80f5b7dcdadba3bb104bed45183b31c494a015feeaf5a3486b10da4766d3cf6e750fff9fbdebacfee306588492609112d82555c8671c244a + languageName: node + linkType: hard + +"@material/data-table@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/data-table@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/checkbox": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/icon-button": 15.0.0-canary.7971d6ad5.0 + "@material/linear-progress": 15.0.0-canary.7971d6ad5.0 + "@material/list": 15.0.0-canary.7971d6ad5.0 + "@material/menu": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/select": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: f2e335dfb83700f73688389a686d17bbb82d535ca4f6438df1933e5ba0bb8079ac3777ea705dd0c875b2d460a8b8378927b9413b2b3a1fffeabb2fba17fea990 + languageName: node + linkType: hard + +"@material/density@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/density@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + tslib: ^2.1.0 + checksum: 3b49b74e3e9f48ea06535178481cdf8497be750289a323ea64cc0e5bab59f61215dc2391446131dbfaddf5e458cd2ed14b9385b08f41e985857c0654229f5ca2 + languageName: node + linkType: hard + +"@material/dialog@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/dialog@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/button": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/icon-button": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 0d25d140fc4337143a5d76534541218b881ef14ab9a1c35ab2e97d5d9a245f247c4659157b539d06fab598132143e63c49641df715fb48984e14c617afbc79f4 + languageName: node + linkType: hard + +"@material/dom@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/dom@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: d6dfc9b9fed70b47dc0fe2231c97de2fa717c5453b4233d811efa1d0af203c18662294150357b76078fc1fbc20356f556ea959b78002317b074f7846c1afef75 + languageName: node + linkType: hard + +"@material/drawer@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/drawer@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/list": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 64145d49bcee11aa1f13ddcea57b0f45299242527e5af0f9b8ecf488439398753db13a3e363437814b93c6cfd9607fd2e81f9a62c730f1a6b80f1840d4a200b7 + languageName: node + linkType: hard + +"@material/elevation@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/elevation@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 8e659e43be6cb16e5b780c9c3e8e1d856a448bd8e8f26a51f1a449b01a2c4c448b1e8413bfe4db86713a9fc092b289367e503cb001ba1e6b975f91a958c3b62c + languageName: node + linkType: hard + +"@material/fab@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/fab@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: f928b911d5bc4ca6f2ef80bc3e81393321bff72a145021c0d62c895607adec770522628e503ffaacdd9398e9d0bab1c860438c922c3e2e5dbca4573417dfd3b7 + languageName: node + linkType: hard + +"@material/feature-targeting@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/feature-targeting@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + tslib: ^2.1.0 + checksum: 4133b0fa048368f771fe9622ead22acef169e6a47b3f77e46b8dda2fd853db7d9ccfd3e4d1613f9d123618d909ad4bce591d0318f989b0cab906765325a1280d + languageName: node + linkType: hard + +"@material/floating-label@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/floating-label@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 3ca8a003d481806f0b283b3f33641f54cbbb1c7655fdd12f6534a378be0a5cba1aff7df603f0975b93a8b4d39a919d652a229c80b71ca1360e7cf103ab355353 + languageName: node + linkType: hard + +"@material/focus-ring@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/focus-ring@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + checksum: 94359f53c2b6f81e5d91a5b889d79103564e3f44306f0f1138dd26bea5f36c5e8d23324b5f86bb8cf4b0adf55682c7257fc0cebf1081481e39e616dd45021c41 + languageName: node + linkType: hard + +"@material/form-field@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/form-field@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: ac924854b1150c44f2d74e48bf2d98d33edd660722d4562994ee2b096ce84d87ede8aea6a4ce7077027a33e64979b205853a8d2c256e6518689ab25846d64478 + languageName: node + linkType: hard + +"@material/icon-button@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/icon-button@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 1d87f4390801e89933758365a74d5fd60744acf8f222ab9f8f8e0bc934c8b9ead4949f595b7c0e2e0a556ad1e234567fb7747943557a24de78dec63bbf2aa676 + languageName: node + linkType: hard + +"@material/image-list@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/image-list@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 179ddee1236297d55eec4f5eb8958ccd13631151042ecdf92559d1ed92c84e73669a4265ca61a313b5662835321061836900de6eaecd2154214ecd7a022e8726 + languageName: node + linkType: hard + +"@material/layout-grid@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/layout-grid@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + tslib: ^2.1.0 + checksum: 4698237991a8c7f0e02aea61a4541c8d7147bcc493797b006e9153549c2bf197fa044a240c0a4bc53b355f8083e8bcd82841bd05626957da71419f2e6d8d3d2e + languageName: node + linkType: hard + +"@material/line-ripple@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/line-ripple@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 7a87a228f9b2319a655da94ab5e5d2e329d90c8445b4a8d0ce86823491d63ed10145527670cb10570c740ebd4c1ddcdb9bdb01c92b97127b766a38ab52a1ca06 + languageName: node + linkType: hard + +"@material/linear-progress@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/linear-progress@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/progress-indicator": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: a77c2c7d2ef2dcd29e44b725cc7230a5e5ec1ea6fb8d8b3855be7ddb029d8719148eb44976a4d00d4fdbb7f1e8011131d284576ee50749c8c296ab4706982bae + languageName: node + linkType: hard + +"@material/list@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/list@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 5617921d3df32f0e2a11a6e0c54e3854118233396e2f84d226002d0e6c5ca5d93e4b2c410a95553e09f0f87c565d0cca4a9241e4eb1ddbb1150e7ed2bfebac1b + languageName: node + linkType: hard + +"@material/menu-surface@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/menu-surface@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 46f0c5a014d3b405778edc51b29f3dbb03c166faa51e453c01f10b7e9556e803eb1b9e8e40d1c6fcf3fb62ee8222678b3a773336f75a850241a84d0953582444 + languageName: node + linkType: hard + +"@material/menu@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/menu@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/list": 15.0.0-canary.7971d6ad5.0 + "@material/menu-surface": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 500c9a5c0d73c203c8841e29cf41403c4a2dc91878f40af9b8c7336303d825742e4b9167b45cf8d12913d08e541c8959b3aba732ef22836fa2edd024eebd28e5 + languageName: node + linkType: hard + +"@material/notched-outline@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/notched-outline@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/floating-label": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 8091ab3908a32d9caa29b2cbccc659a9b5306b59ae735bd04caa2abdc82b57087f0fb9f281c5c5e6fe61215d9620ed46a3d81d5e106dc15097b317c828dfb5ed + languageName: node + linkType: hard + +"@material/progress-indicator@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/progress-indicator@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + tslib: ^2.1.0 + checksum: 2be53f28a5df93005473b8b5ca30139d63af1b54af2470d2e84f62b70064710d61bd9c4fa318a853b0b438d6a0f8d6efc1d88046fb854aea6a5d3f3230caecf8 + languageName: node + linkType: hard + +"@material/radio@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/radio@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 7c7a53067518c0c19dc25eb1e0174b549f45e6668626a1747ff2fa588432b8e68e7f3a219b03db5c080b4fab790f0216501ff3d5c60ceceab313916815430262 + languageName: node + linkType: hard + +"@material/ripple@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/ripple@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 3fccfb0ad2cac8abd10c92376740f552402024d7b8d256d314f05db60f1f06e56a6cbeb58a79da87785f788b240674e8e37427095d66480da663247ecec13148 + languageName: node + linkType: hard + +"@material/rtl@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/rtl@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 9754c932739b5d8e9a7fa0d92a5ac570892035bcd429afd73bd22a595839816eb95928e4ca25552fdff3db03e471fa033464b0878880dad01313a29de0f65d2d + languageName: node + linkType: hard + +"@material/segmented-button@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/segmented-button@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/touch-target": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: e95900238dbedd4b703bff87c708c8973440e7f27802010e86f604e899aaa5aa512605ec9460004537c79e7629d00c43e9f25914bd89e8cc9eb491ffb47076dc + languageName: node + linkType: hard + +"@material/select@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/select@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/floating-label": 15.0.0-canary.7971d6ad5.0 + "@material/line-ripple": 15.0.0-canary.7971d6ad5.0 + "@material/list": 15.0.0-canary.7971d6ad5.0 + "@material/menu": 15.0.0-canary.7971d6ad5.0 + "@material/menu-surface": 15.0.0-canary.7971d6ad5.0 + "@material/notched-outline": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 1faadc84a029a7621cba8982c3423b060c19ad9057e91b72b5aa47a0e29e11d77ca2f85ffbb19e78521742af301396339088b467a94f46fe4c10b020436624de + languageName: node + linkType: hard + +"@material/shape@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/shape@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 7d8c51ef50450e3eae7d7648b76d5e7fafd529dd00750428e8f2e03f7fe9289b79525c85be4d3a8f7aef476d8f9cd36452126f5cb1ffb87dbaa532b6e14be06e + languageName: node + linkType: hard + +"@material/slider@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/slider@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 1ee12cbe91f0c3beb9d92aa988f66241697cb9ccdae619a64e5871af241a799f76f5708570334d5df988c4d2de2e7a4f01ce7ed71d9011871fcf16be801bfc47 + languageName: node + linkType: hard + +"@material/snackbar@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/snackbar@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/button": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/icon-button": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 21a9882d2086c27e5961bd65b05bad678f934b4a2221fbd36e327d280171f9ff263f3a1fa8a15960f6e3baa428ba1704a2cbc004dd32fc956c02182bed6de93d + languageName: node + linkType: hard + +"@material/switch@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/switch@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + safevalues: ^0.3.4 + tslib: ^2.1.0 + checksum: e29155da9bba249bb9f65d013d085fe33f4a67b65c5baa9d8cb5c228115e6a7a8b125eb463b1d26848ecc83e267c15ab91e8f6f7d78e1422d697962924d64074 + languageName: node + linkType: hard + +"@material/tab-bar@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tab-bar@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/tab": 15.0.0-canary.7971d6ad5.0 + "@material/tab-indicator": 15.0.0-canary.7971d6ad5.0 + "@material/tab-scroller": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 8d159a7c3c1c7d362edc92e74e6b11d12a94957f93aa09407ba1e436393fcfe5b3332bd677cb364472901c9e3afff688fdc2ada8ff75e8209750e682dcdfd648 + languageName: node + linkType: hard + +"@material/tab-indicator@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tab-indicator@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 0999c36bce738a8ab54b0f015d5332620a031f5ec1de16f4f655b63912ac015704b88e9838041ee47e12a43797cffae5b71ff63d2851c4c6482b15fc79ab075e + languageName: node + linkType: hard + +"@material/tab-scroller@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tab-scroller@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/tab": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 0156b8e30952be10305c3eca5f11bcc38c8b2ff26e298d002f0dcfb634e8e5393ae2fcb27e1f6d3afedecbec83fe5d4f07bb9c29d8ed0fa23382cc098e3f11c0 + languageName: node + linkType: hard + +"@material/tab@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tab@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/focus-ring": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/tab-indicator": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: cdb26bbd619ce2c6068ae3e9a2935e6006608b7f95d6d552610c1ce106ddb8cbca5d3c3920404c0744d519ce9ae2c37ac562cbd449cc30c54ede61fc04583a55 + languageName: node + linkType: hard + +"@material/textfield@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/textfield@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/density": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/floating-label": 15.0.0-canary.7971d6ad5.0 + "@material/line-ripple": 15.0.0-canary.7971d6ad5.0 + "@material/notched-outline": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: a92bc565a2c90f493cbea4226f76c1a7943dcfea6b4fb6f0839845837a4bb9bc724820bab1b591d5f538718f18db7decf548f980cb671c68a6acc82eb1ef5214 + languageName: node + linkType: hard + +"@material/theme@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/theme@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 51c67be66c83af83ebfd531b66ee2cde5a530edfb9e1e857b4e79576a61292a0fab1c41e8c78185a4ac83db1743d6fa0dcde780b81b53af0d828339402343ab1 + languageName: node + linkType: hard + +"@material/tokens@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tokens@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + checksum: 30d28b5bd529ed1edcd0782a3431eaefd81633795afce303b776beb6f48ed995b008e34cbcef9ed0c915639ea127ba87e94cad5cd24082f14f1d0553d75b150f + languageName: node + linkType: hard + +"@material/tooltip@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/tooltip@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/button": 15.0.0-canary.7971d6ad5.0 + "@material/dom": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/tokens": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + safevalues: ^0.3.4 + tslib: ^2.1.0 + checksum: 3d0375b7d90e449b29df69ce036b299c2245583d33dace5b535fd56707969d8f6716021208911b8453f3f2f37960acc0d6e21d169fd531fe83c980788b27887f + languageName: node + linkType: hard + +"@material/top-app-bar@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/top-app-bar@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/animation": 15.0.0-canary.7971d6ad5.0 + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/elevation": 15.0.0-canary.7971d6ad5.0 + "@material/ripple": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + "@material/shape": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + "@material/typography": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: 594b63de8a88b8485920bb76a0856b57e690546b375331f0c3df4d4843718b9dc98e9d125ddd617b122b017ac8a0c7192f638b252a9a3776cd2a447b1a2e1e01 + languageName: node + linkType: hard + +"@material/touch-target@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/touch-target@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/base": 15.0.0-canary.7971d6ad5.0 + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/rtl": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: a168ec58c7d20830079360b7ec43fba47c65cf4bbb362e3266c7137eb43efeb20661f11ce7abca457884a9d29eba396a0c50889143ac1ce028c4694cea816999 + languageName: node + linkType: hard + +"@material/typography@npm:15.0.0-canary.7971d6ad5.0": + version: 15.0.0-canary.7971d6ad5.0 + resolution: "@material/typography@npm:15.0.0-canary.7971d6ad5.0" + dependencies: + "@material/feature-targeting": 15.0.0-canary.7971d6ad5.0 + "@material/theme": 15.0.0-canary.7971d6ad5.0 + tslib: ^2.1.0 + checksum: ef0b338274c988ec80159fdc630fce2b560f1c3a071a8dad1919a4373919d501bd9ab883d32a44d56a7d3816993a3d1bc61021068ef9197563af0ebb68039f7d + languageName: node + linkType: hard + +"@nestjs/cli@npm:^9.1.5": + version: 9.1.5 + resolution: "@nestjs/cli@npm:9.1.5" + dependencies: + "@angular-devkit/core": 14.2.2 + "@angular-devkit/schematics": 14.2.2 + "@angular-devkit/schematics-cli": 14.2.2 + "@nestjs/schematics": ^9.0.0 + chalk: 3.0.0 + chokidar: 3.5.3 + cli-table3: 0.6.2 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 7.2.13 + inquirer: 7.3.3 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 3.0.2 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.1.0 + tsconfig-paths-webpack-plugin: 4.0.0 + typescript: 4.8.4 + webpack: 5.74.0 + webpack-node-externals: 3.0.0 + bin: + nest: bin/nest.js + checksum: 0a832817fff7126ec6f6a32cd1ca6b8db3b21447ca57c54167f989275b7a5914191c1b99442f19c45ceaa3185d2ee46d80c862b242dbfb8b8b239bd049054ac4 + languageName: node + linkType: hard + +"@nestjs/common@npm:^9.2.1": + version: 9.2.1 + resolution: "@nestjs/common@npm:9.2.1" + dependencies: + iterare: 1.2.1 + tslib: 2.4.1 + uuid: 9.0.0 + peerDependencies: + cache-manager: <=5 + class-transformer: "*" + class-validator: "*" + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + checksum: 82acae70df519f1f217f5b11354c29e1f3b9e5ddd5f73385bd76705c235507230bb19c6c0eb696938565ce70c33cecb487d539c829d1c8d39121fcf3468b4d55 languageName: node linkType: hard @@ -2314,16 +3003,16 @@ __metadata: languageName: node linkType: hard -"@nestjs/core@npm:^9.1.4": - version: 9.1.4 - resolution: "@nestjs/core@npm:9.1.4" +"@nestjs/core@npm:^9.2.1": + version: 9.2.1 + resolution: "@nestjs/core@npm:9.2.1" dependencies: "@nuxtjs/opencollective": 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 object-hash: 3.0.0 path-to-regexp: 3.2.0 - tslib: 2.4.0 + tslib: 2.4.1 uuid: 9.0.0 peerDependencies: "@nestjs/common": ^9.0.0 @@ -2339,7 +3028,7 @@ __metadata: optional: true "@nestjs/websockets": optional: true - checksum: 5578a56d9c9f7135e20727b825e0947d75ba6d4144645b8d49ce898b9224aa0ee2e52f91e93df2f408a6951f807e94c8d056be6526563d6e48101870faf6238a + checksum: 006edefb175840f7706e3ae755dfd984e112d40fe3ce26bd75ee019652c38b5225c751617efaf6054b07ddb1f7e044f49015520889f0003aa9aab33111d59172 languageName: node linkType: hard @@ -2365,17 +3054,17 @@ __metadata: languageName: node linkType: hard -"@nestjs/platform-fastify@npm:^9.1.4": - version: 9.1.4 - resolution: "@nestjs/platform-fastify@npm:9.1.4" +"@nestjs/platform-fastify@npm:^9.2.1": + version: 9.2.1 + resolution: "@nestjs/platform-fastify@npm:9.2.1" dependencies: - "@fastify/cors": 8.1.0 + "@fastify/cors": 8.2.0 "@fastify/formbody": 7.3.0 "@fastify/middie": 8.0.0 - fastify: 4.7.0 + fastify: 4.10.2 light-my-request: 5.6.1 path-to-regexp: 3.2.0 - tslib: 2.4.0 + tslib: 2.4.1 peerDependencies: "@fastify/static": ^6.0.0 "@fastify/view": ^7.0.0 @@ -2386,7 +3075,21 @@ __metadata: optional: true "@fastify/view": optional: true - checksum: f414bbb4b7a24214407e5f1e17b246aad49d71d9cdf87e4f018cfbbf8c1ccdc4db57cf2f52adf400b09a46ceb144e833b485cea1e0d81faaa05f8acdf8f5ab7d + checksum: ead41676c9d8d7285de1c7def06f5406cea051c2b7c5c172d89a2142f11180e5a6814492cd815aee5f25b524bc6c6375e4e47e6a5387fe46cb8f11995e895aab + languageName: node + linkType: hard + +"@nestjs/schedule@npm:^2.1.0": + version: 2.1.0 + resolution: "@nestjs/schedule@npm:2.1.0" + dependencies: + cron: 2.0.0 + uuid: 8.3.2 + peerDependencies: + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 + "@nestjs/core": ^7.0.0 || ^8.0.0 || ^9.0.0 + reflect-metadata: ^0.1.12 + checksum: 43423eb0491c692c08dcdb6d18d34ec758fe29cda52f4674a945e06933ec5b4e23229193c1b071971842b50db57024d6f1c55fe8f4c6392754b6a597b31eb423 languageName: node linkType: hard @@ -2417,11 +3120,11 @@ __metadata: languageName: node linkType: hard -"@nestjs/testing@npm:^9.1.4": - version: 9.1.4 - resolution: "@nestjs/testing@npm:9.1.4" +"@nestjs/testing@npm:^9.2.1": + version: 9.2.1 + resolution: "@nestjs/testing@npm:9.2.1" dependencies: - tslib: 2.4.0 + tslib: 2.4.1 peerDependencies: "@nestjs/common": ^9.0.0 "@nestjs/core": ^9.0.0 @@ -2432,7 +3135,20 @@ __metadata: optional: true "@nestjs/platform-express": optional: true - checksum: f7bc71cfc7be7648eb6c5e5cd7f5a1d42f0200ee1a8cd7d1342edf804e6d609a88f3e9f15faec0a98969b5ed2187934473ea096e6e0d7be599304b56e3dee213 + checksum: 69fbe0535bbc6b8f90f90a02efb33b390d5aa7ce1f309452b1fcedd9304f7466871842f27d042587fce8532892abe58c769465eca13dde80860e002ffa83570b + languageName: node + linkType: hard + +"@nestjs/throttler@npm:^3.1.0": + version: 3.1.0 + resolution: "@nestjs/throttler@npm:3.1.0" + dependencies: + md5: ^2.2.1 + peerDependencies: + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 + "@nestjs/core": ^7.0.0 || ^8.0.0 || ^9.0.0 + reflect-metadata: ^0.1.13 + checksum: fc0776d709aa5160005a2a86f6315cca9ce2d1c8dc8bf562810030f30e38e03b23ab4b7e265bdb70eb209dc84498a1390d1ba666eb3487f250dce308f31524b4 languageName: node linkType: hard @@ -2451,16 +3167,16 @@ __metadata: languageName: node linkType: hard -"@ng-web-apis/common@npm:^2.0.1": - version: 2.0.1 - resolution: "@ng-web-apis/common@npm:2.0.1" +"@ng-web-apis/common@npm:^2.1.0": + version: 2.1.0 + resolution: "@ng-web-apis/common@npm:2.1.0" dependencies: tslib: ^2.2.0 peerDependencies: "@angular/common": ">=12.0.0" "@angular/core": ">=12.0.0" rxjs: ">=6.4.0" - checksum: 571a535c0442992a773658284d2848255023dc1331b7925706e7938a61d8ded78e6dbbc4df78a23b9860421299ae1d55d26ca3d605814acb119c62164812399b + checksum: 4ff8b19a271c43cd5a5736224b97c1b10dfd055db8642ff3a1563144206464e859739f0036640dc0fc9158e7c7d259cca3772a25bfd1aa5fd7b8bad4fc2a2639 languageName: node linkType: hard @@ -2476,14 +3192,14 @@ __metadata: languageName: node linkType: hard -"@ngtools/webpack@npm:14.2.5": - version: 14.2.5 - resolution: "@ngtools/webpack@npm:14.2.5" +"@ngtools/webpack@npm:15.0.4": + version: 15.0.4 + resolution: "@ngtools/webpack@npm:15.0.4" peerDependencies: - "@angular/compiler-cli": ^14.0.0 - typescript: ">=4.6.2 <4.9" + "@angular/compiler-cli": ^15.0.0 + typescript: ~4.8.2 webpack: ^5.54.0 - checksum: 8622cf7cc70a453a85fa91e0860e8f6d3f723a624db6643d83c9879305828f79787489849aa7ba6ac3818f25c85207110f60f8a45c423601ef4c340baa6be196 + checksum: 56264999f457359e215a4cd3c489f97878f7b7e3a91dca5106b633e40da1d5fe376db8b744262edef73b4051137fe9f8048104ba94b245e3c82daa2cd9f622af languageName: node linkType: hard @@ -2516,7 +3232,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -2536,32 +3252,41 @@ __metadata: languageName: node linkType: hard -"@npmcli/git@npm:^3.0.0": - version: 3.0.1 - resolution: "@npmcli/git@npm:3.0.1" +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@npmcli/git@npm:^4.0.0": + version: 4.0.3 + resolution: "@npmcli/git@npm:4.0.3" dependencies: - "@npmcli/promise-spawn": ^3.0.0 + "@npmcli/promise-spawn": ^6.0.0 lru-cache: ^7.4.4 mkdirp: ^1.0.4 - npm-pick-manifest: ^7.0.0 - proc-log: ^2.0.0 + npm-pick-manifest: ^8.0.0 + proc-log: ^3.0.0 promise-inflight: ^1.0.1 promise-retry: ^2.0.1 semver: ^7.3.5 - which: ^2.0.2 - checksum: 0e289d11e2d6034652993f2d05f68396d8377603a1c1f983b2d0893e7591a22bcf3896a43c7dfbcc43f03c308a110f0b9ec37e0191e48b0bd1d236e0f57a3ec6 + which: ^3.0.0 + checksum: 2ed12b8fe6acb1fb4e0c351c7db80f144a842fe9dfad3d67ff88b1505956e74337775de0e09d2995da47000c6589590ef8c5277a517e5bb5396d00c572ef4b88 languageName: node linkType: hard -"@npmcli/installed-package-contents@npm:^1.0.7": - version: 1.0.7 - resolution: "@npmcli/installed-package-contents@npm:1.0.7" +"@npmcli/installed-package-contents@npm:^2.0.1": + version: 2.0.1 + resolution: "@npmcli/installed-package-contents@npm:2.0.1" dependencies: - npm-bundled: ^1.1.1 - npm-normalize-package-bin: ^1.0.1 + npm-bundled: ^3.0.0 + npm-normalize-package-bin: ^3.0.0 bin: - installed-package-contents: index.js - checksum: a4a29b99d439827ce2e7817c1f61b56be160e640696e31dc513a2c8a37c792f75cdb6258ec15a1e22904f20df0a8a3019dd3766de5e6619f259834cf64233538 + installed-package-contents: lib/index.js + checksum: 75126a3b3a741cd68e78ccea25256e87734379e5e0d827674fc3ec1f39b6ed356ae2c3e2d906c9c0247c192e8ca7e67188ad346f86042baabbac274e9b02d770 languageName: node linkType: hard @@ -2575,32 +3300,32 @@ __metadata: languageName: node linkType: hard -"@npmcli/node-gyp@npm:^2.0.0": - version: 2.0.0 - resolution: "@npmcli/node-gyp@npm:2.0.0" - checksum: b6bbf0015000f9b64d31aefdc30f244b0348c57adb64017667e0304e96c38644d83da46a4581252652f5d606268df49118f9c9993b41d8020f62b7b15dd2c8d8 +"@npmcli/node-gyp@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/node-gyp@npm:3.0.0" + checksum: fe3802b813eecb4ade7ad77c9396cb56721664275faab027e3bd8a5e15adfbbe39e2ecc19f7885feb3cfa009b96632741cc81caf7850ba74440c6a2eee7b4ffc languageName: node linkType: hard -"@npmcli/promise-spawn@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/promise-spawn@npm:3.0.0" +"@npmcli/promise-spawn@npm:^6.0.0, @npmcli/promise-spawn@npm:^6.0.1": + version: 6.0.2 + resolution: "@npmcli/promise-spawn@npm:6.0.2" dependencies: - infer-owner: ^1.0.4 - checksum: 3454465a2731cea5875ba51f80873e2205e5bd878c31517286b0ede4ea931c7bf3de895382287e906d03710fff6f9e44186bd0eee068ce578901c5d3b58e7692 + which: ^3.0.0 + checksum: aa725780c13e1f97ab32ed7bcb5a207a3fb988e1d7ecdc3d22a549a22c8034740366b351c4dde4b011bcffcd8c4a7be6083d9cf7bc7e897b88837150de018528 languageName: node linkType: hard -"@npmcli/run-script@npm:^4.1.0": - version: 4.2.1 - resolution: "@npmcli/run-script@npm:4.2.1" +"@npmcli/run-script@npm:^6.0.0": + version: 6.0.0 + resolution: "@npmcli/run-script@npm:6.0.0" dependencies: - "@npmcli/node-gyp": ^2.0.0 - "@npmcli/promise-spawn": ^3.0.0 + "@npmcli/node-gyp": ^3.0.0 + "@npmcli/promise-spawn": ^6.0.0 node-gyp: ^9.0.0 - read-package-json-fast: ^2.0.3 - which: ^2.0.2 - checksum: 7b8d6676353f157e68b26baf848e01e5d887bcf90ce81a52f23fc9a5d93e6ffb60057532d664cfd7aeeb76d464d0c8b0d314ee6cccb56943acb3b6c570b756c8 + read-package-json-fast: ^3.0.0 + which: ^3.0.0 + checksum: 9fc387f7c405ae4948921764b8b970c12ae07df22bacc242b0f68709c99a83b9d12f411ebd7e60c85a933e2d7be42c70e243ebd71a8d3f6e783e1aab5ccbb2f5 languageName: node linkType: hard @@ -2631,14 +3356,21 @@ __metadata: languageName: node linkType: hard -"@schematics/angular@npm:14.2.5": - version: 14.2.5 - resolution: "@schematics/angular@npm:14.2.5" +"@polka/url@npm:^1.0.0-next.20": + version: 1.0.0-next.21 + resolution: "@polka/url@npm:1.0.0-next.21" + checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 + languageName: node + linkType: hard + +"@schematics/angular@npm:15.0.4": + version: 15.0.4 + resolution: "@schematics/angular@npm:15.0.4" dependencies: - "@angular-devkit/core": 14.2.5 - "@angular-devkit/schematics": 14.2.5 - jsonc-parser: 3.1.0 - checksum: 76d6de3f88c44636c975f706a1516c0f3b8563b05862f4f1b01b015053f2a531629bffeb48f7cc33ebef910ce9eb52e86eeba33e6ad9540ed15a42196d8097d4 + "@angular-devkit/core": 15.0.4 + "@angular-devkit/schematics": 15.0.4 + jsonc-parser: 3.2.0 + checksum: 81836a72a073540cc8892bb3857a6364d418deb656abd70ff25af412e94f13098f8dd87080013906f3f501d119250d63c7fba83c4adfcb4a0ae0367bde244a0b languageName: node linkType: hard @@ -2691,6 +3423,13 @@ __metadata: languageName: node linkType: hard +"@types/ackee-tracker@npm:^5.0.2": + version: 5.0.2 + resolution: "@types/ackee-tracker@npm:5.0.2" + checksum: 253cabc3d4b1695fe9af03c36dfc938749678e2ff057ef81f58074f6235d790e9526fa67c621702119d5b5aaef79c4d0b4df55b8e1091dd4d8899ba25df65cc0 + languageName: node + linkType: hard + "@types/bcrypt@npm:^5.0.0": version: 5.0.0 resolution: "@types/bcrypt@npm:5.0.0" @@ -2745,10 +3484,12 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:^2.8.12": - version: 2.8.12 - resolution: "@types/cors@npm:2.8.12" - checksum: 8c45f112c7d1d2d831b4b266f2e6ed33a1887a35dcbfe2a18b28370751fababb7cd045e745ef84a523c33a25932678097bf79afaa367c6cb3fa0daa7a6438257 +"@types/cors@npm:^2.8.13": + version: 2.8.13 + resolution: "@types/cors@npm:2.8.13" + dependencies: + "@types/node": "*" + checksum: 7ef197ea19d2e5bf1313b8416baa6f3fd6dd887fd70191da1f804f557395357dafd8bc8bed0ac60686923406489262a7c8a525b55748f7b2b8afa686700de907 languageName: node linkType: hard @@ -2818,20 +3559,13 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac - languageName: node - linkType: hard - "@types/jsonwebtoken@npm:*, @types/jsonwebtoken@npm:8.5.8": version: 8.5.8 resolution: "@types/jsonwebtoken@npm:8.5.8" @@ -2848,13 +3582,6 @@ __metadata: languageName: node linkType: hard -"@types/ms@npm:^0.7.31": - version: 0.7.31 - resolution: "@types/ms@npm:0.7.31" - checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da - languageName: node - linkType: hard - "@types/multer@npm:^1.4.7": version: 1.4.7 resolution: "@types/multer@npm:1.4.7" @@ -2864,10 +3591,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.8.4": - version: 18.8.4 - resolution: "@types/node@npm:18.8.4" - checksum: c2b87f6b0b1f02b2ce61ca7cb93ea287119bda086a3f33e48da8f5e70c24ad7141cc3465946e0e36abb7eba70c7b320c7659842096e4aa573b3a8d557322c818 +"@types/node@npm:*, @types/node@npm:^18.11.17": + version: 18.11.17 + resolution: "@types/node@npm:18.11.17" + checksum: 1933afd068d5c75c068c6c4df6d10edb3b0b2bb6503d544e2f0496ac007c90596e6a5e284a8ef032451bc16f871b7e46719d7d2bea60e9b25d13a77d52161cac languageName: node linkType: hard @@ -2878,14 +3605,14 @@ __metadata: languageName: node linkType: hard -"@types/passport-jwt@npm:^3.0.7": - version: 3.0.7 - resolution: "@types/passport-jwt@npm:3.0.7" +"@types/passport-jwt@npm:^3.0.8": + version: 3.0.8 + resolution: "@types/passport-jwt@npm:3.0.8" dependencies: "@types/express": "*" "@types/jsonwebtoken": "*" "@types/passport-strategy": "*" - checksum: c3631b9cb8a858e1ce366de04fe0e4fd350f265e09aad7e586c064ded6183dc011806c58c13a9e4535d66f900d76d6746e9c3d79b83a90ddc7dff679cbcfbe5d + checksum: 321eca319eff51c87a5ddebf590937b24ed7fa6c8cc2465cecb4edf49f839b7770e57a4ed009f323c66ade6c0f1d9b6a51033d82dd392270b17976380893af2f languageName: node linkType: hard @@ -2947,6 +3674,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + "@types/serve-index@npm:^1.9.1": version: 1.9.1 resolution: "@types/serve-index@npm:1.9.1" @@ -3003,10 +3737,10 @@ __metadata: languageName: node linkType: hard -"@types/validator@npm:^13.7.7": - version: 13.7.7 - resolution: "@types/validator@npm:13.7.7" - checksum: e32d2bc3b86317da2dff7565e371a2bd0108cdbd7c0b426070c9b9fab30cf07572eea4fb193cb7420261b2eb99b2fc112bf021d48f98eee181844a47533f817a +"@types/validator@npm:^13.7.10": + version: 13.7.10 + resolution: "@types/validator@npm:13.7.10" + checksum: 7b142c08019f484d62c9f3074231f640c24311558f157dd253a60810dd0cb29e41ec64ca210a192b54f6de51f4fe016bfeb2c30f90fa49c9337ed54a9d8e02aa languageName: node linkType: hard @@ -3019,15 +3753,16 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.40.0" +"@typescript-eslint/eslint-plugin@npm:^5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.47.0" dependencies: - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/type-utils": 5.40.0 - "@typescript-eslint/utils": 5.40.0 + "@typescript-eslint/scope-manager": 5.47.0 + "@typescript-eslint/type-utils": 5.47.0 + "@typescript-eslint/utils": 5.47.0 debug: ^4.3.4 ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 regexpp: ^3.2.0 semver: ^7.3.7 tsutils: ^3.21.0 @@ -3037,43 +3772,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ac9e8fcea3545eb33353373c5094fd0a7b79647b37066adbcbd8edcb6fc17c6a601fd0e1b8db0a39200e8238acb33d4b1b036bfe09ebb9899cfb43f6c271a8fd + checksum: fd867eb2b668d1f476fd28d38c2df2a680bf510a265a6e714b28d8f77e7a37e74e32294b70262a6fd1aec99ddb2fddef0212c862b4465ca4f83bb1172476f6e7 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/parser@npm:5.40.0" +"@typescript-eslint/parser@npm:^5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/parser@npm:5.47.0" dependencies: - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/typescript-estree": 5.40.0 + "@typescript-eslint/scope-manager": 5.47.0 + "@typescript-eslint/types": 5.47.0 + "@typescript-eslint/typescript-estree": 5.47.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: a8d02950dd12fcb1d19ad5f24cbfd186ca88d8a099160f93f99767896a45198a9f9bfbdd1a57c1ae50d452e6c895ae5b4d7e4623dfc87bca55a45c5ba16491f8 + checksum: 5c864ca74b86ca740c73e5b87d90d43bb832b20ba6be0a39089175435771527722a7bf0a8ef7ddbd64b85235fbb7f6dbe8ae55a8bc73c6242f5559d580a8a80c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/scope-manager@npm:5.40.0" +"@typescript-eslint/scope-manager@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/scope-manager@npm:5.47.0" dependencies: - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/visitor-keys": 5.40.0 - checksum: 48dfb2f1a71bda5b782263e97608f1e1a2e8a89a603344af5072208be7936140af9d41483be439405c5ee379d0263555d6cc94405b187707f9ecfd7dd9821b5f + "@typescript-eslint/types": 5.47.0 + "@typescript-eslint/visitor-keys": 5.47.0 + checksum: f637268a4cb065a89bb53d72620cc553f8c0d9f00805d6e6aac558cc4d3c08f3329208b0b4d5566d21eb636b080d453e5890221baef0e4bc4d67251f07cccd0d languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/type-utils@npm:5.40.0" +"@typescript-eslint/type-utils@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/type-utils@npm:5.47.0" dependencies: - "@typescript-eslint/typescript-estree": 5.40.0 - "@typescript-eslint/utils": 5.40.0 + "@typescript-eslint/typescript-estree": 5.47.0 + "@typescript-eslint/utils": 5.47.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -3081,23 +3816,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: eabe86de93b0bd4bcbfb13cace097ff7addbd992c91b80c73bbaa677ce26f1c2abd1c63fe585f2fd9c80df07d3d54bd6e4a46aebc908cef0f870f1d6955d6b8a + checksum: 504b3e883ac02cb8e69957b706e76cb79fa2192aa62702c2a658119f28f8f50f1e668efb62318e85aeda6522e1d948b59382cae4ef3300a3f4eea809a87dec26 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/types@npm:5.40.0" - checksum: 892ff162176a3e292b5b55090421c6d318187255f3f91be46bd5c0b38e3c25a49d9320ffb646d5709f3a2cdf350217a79e557886fdfdbdb322caec27f2b3d116 +"@typescript-eslint/types@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/types@npm:5.47.0" + checksum: 5a856e190cc2103427dbe15ccbbf87238261b5ed0859390a9e55f93afc2057f79dcbb4ac0db4d35787466f5e73f271111d19b2e725cf444af41d30e09678bf7a languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.40.0" +"@typescript-eslint/typescript-estree@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.47.0" dependencies: - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/visitor-keys": 5.40.0 + "@typescript-eslint/types": 5.47.0 + "@typescript-eslint/visitor-keys": 5.47.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -3106,34 +3841,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 8b67b8c4278f6bbd16ec521c847920c6f0ba57ec4bf148505c057aa160363852f50f9db73f42ee71ac3906940e8554e9c27686194a57f6554efcd82a8b0fa3e8 + checksum: a9adfe8955b7dc9dfa9f43d450b782b83f506eaadae2a13f4e1bbe6c733be446d3edb26910954aec1bdc60d94ecc55c4e200d5b19bb24e6742f02329a4fb3e8c languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/utils@npm:5.40.0" +"@typescript-eslint/utils@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/utils@npm:5.47.0" dependencies: "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/typescript-estree": 5.40.0 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.47.0 + "@typescript-eslint/types": 5.47.0 + "@typescript-eslint/typescript-estree": 5.47.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 608e16ad510c1543de37e168ab42e9d11fdd7d38faf19fe5d60255ea8e43b9a8cebeea11bd9776eed55fe0e453c5d222bb708b930b431c5b113269c6b44788c1 + checksum: f168920eec6f77651107f190b4ecadd82951fe4e3c0321ff660ac7380f4315d5ae30a1b63b4d2818f5e6f007a3f34c5df202619c24ec3a7e2ef25b215ec7b813 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.40.0" +"@typescript-eslint/visitor-keys@npm:5.47.0": + version: 5.47.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.47.0" dependencies: - "@typescript-eslint/types": 5.40.0 + "@typescript-eslint/types": 5.47.0 eslint-visitor-keys: ^3.3.0 - checksum: a11787f7e6ac7018b22848028c9116d028f89782b0ee120517f0384e9db260e3001ad897512d9c3cf15ce16073ae4c1dc7f81f29d6d40dec78b5e8c8e79f344f + checksum: 2191c079154bdfd1b85b8cd24baa6c0f55c73527c6c8460789483555b4eb5c72e3dc6d1aa4bbac2cf7b86b474588b45682a8deb151e9d903cf72c8f336141f1f languageName: node linkType: hard @@ -3316,7 +4052,7 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:1": +"abbrev@npm:1, abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 @@ -3349,6 +4085,15 @@ __metadata: languageName: node linkType: hard +"ackee-tracker@npm:^5.1.0": + version: 5.1.0 + resolution: "ackee-tracker@npm:5.1.0" + dependencies: + platform: ^1.3.6 + checksum: f472eb6fe9632eb0a4cc8a4fbdc4048fba1a1da56ecf10f4abf713bf3f69b2f39a5cddb5e3720d95df14ca263f2609fa57491788cf457dacb9502de4b6961519 + languageName: node + linkType: hard + "acorn-import-assertions@npm:^1.7.6": version: 1.8.0 resolution: "acorn-import-assertions@npm:1.8.0" @@ -3367,13 +4112,22 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 languageName: node linkType: hard +"acorn@npm:^8.0.4": + version: 8.8.1 + resolution: "acorn@npm:8.8.1" + bin: + acorn: bin/acorn + checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + languageName: node + linkType: hard + "acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0": version: 8.8.0 resolution: "acorn@npm:8.8.0" @@ -3633,6 +4387,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -3640,12 +4401,12 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.8": - version: 10.4.8 - resolution: "autoprefixer@npm:10.4.8" +"autoprefixer@npm:10.4.13": + version: 10.4.13 + resolution: "autoprefixer@npm:10.4.13" dependencies: - browserslist: ^4.21.3 - caniuse-lite: ^1.0.30001373 + browserslist: ^4.21.4 + caniuse-lite: ^1.0.30001426 fraction.js: ^4.2.0 normalize-range: ^0.1.2 picocolors: ^1.0.0 @@ -3654,7 +4415,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 06cb4c497bb948714d5b1b4f7e7465fd88c50f90788fc2020b3d97d7661fb4dd0d9918c1b09dd3e909acd4485cbb27ad99085487d8ed5d75915e646d2b535770 + checksum: dcb1cb7ae96a3363d65d82e52f9a0a7d8c982256f6fd032d7e1ec311f099c23acfebfd517ff8e96bf93f716a66c4ea2b80c60aa19efd2f474ce434bd75ef7b79 languageName: node linkType: hard @@ -3669,27 +4430,27 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:8.2.5": - version: 8.2.5 - resolution: "babel-loader@npm:8.2.5" +"axios@npm:^1.2.1": + version: 1.2.1 + resolution: "axios@npm:1.2.1" dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^2.0.0 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: a6605557885eabbc3250412405f2c63ca87287a95a439c643fdb47d5ea3d5326f72e43ab97be070316998cb685d5dfbc70927ce1abe8be7a6a4f5919287773fb + follow-redirects: ^1.15.0 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: c4dc4e119064c9aed09a3de309bedb797a139a6fb372223aafe3e0c10a7d4a14e4d3e9c9d309467fadb9d2b490b891ee3df96ef5b55716bb971910466ff9f0c5 languageName: node linkType: hard -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" +"babel-loader@npm:9.1.0": + version: 9.1.0 + resolution: "babel-loader@npm:9.1.0" dependencies: - object.assign: ^4.1.0 - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b + find-cache-dir: ^3.3.2 + schema-utils: ^4.0.0 + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 774758febd1e8ca804abcae3b8f65634330dc688837424d0946f06d1386914de43435cce691710fa144eccdf1292cf883439ac3598ce7320916acfaaa2372641 languageName: node linkType: hard @@ -3706,39 +4467,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.3.2": - version: 0.3.2 - resolution: "babel-plugin-polyfill-corejs2@npm:0.3.2" +"babel-plugin-polyfill-corejs2@npm:^0.3.3": + version: 0.3.3 + resolution: "babel-plugin-polyfill-corejs2@npm:0.3.3" dependencies: "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.3.2 + "@babel/helper-define-polyfill-provider": ^0.3.3 semver: ^6.1.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a76e7bb1a5cc0a4507baa523c23f9efd75764069a25845beba92290386e5e48ed85b894005ece3b527e13c3d2d9c6589cc0a23befb72ea6fc7aa8711f231bb4d + checksum: 7db3044993f3dddb3cc3d407bc82e640964a3bfe22de05d90e1f8f7a5cb71460011ab136d3c03c6c1ba428359ebf635688cd6205e28d0469bba221985f5c6179 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.5.3": - version: 0.5.3 - resolution: "babel-plugin-polyfill-corejs3@npm:0.5.3" +"babel-plugin-polyfill-corejs3@npm:^0.6.0": + version: 0.6.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.6.0" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.2 - core-js-compat: ^3.21.0 + "@babel/helper-define-polyfill-provider": ^0.3.3 + core-js-compat: ^3.25.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9c6644a1b0afbe59e402827fdafc6f44994ff92c5b2f258659cbbfd228f7075dea49e95114af10e66d70f36cbde12ff1d81263eb67be749b3ef0e2c18cf3c16d + checksum: 470bb8c59f7c0912bd77fe1b5a2e72f349b3f65bbdee1d60d6eb7e1f4a085c6f24b2dd5ab4ac6c2df6444a96b070ef6790eccc9edb6a2668c60d33133bfb62c6 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.4.0": - version: 0.4.0 - resolution: "babel-plugin-polyfill-regenerator@npm:0.4.0" +"babel-plugin-polyfill-regenerator@npm:^0.4.1": + version: 0.4.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.4.1" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.2 + "@babel/helper-define-polyfill-provider": ^0.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 699aa9c0dc5a2259d7fa52b26613fa1e782439eee54cd98506991f87fddf0c00eec6c5b1917edf586c170731d9e318903bc41210225a691e7bb8087652bbda94 + checksum: ab0355efbad17d29492503230387679dfb780b63b25408990d2e4cf421012dae61d6199ddc309f4d2409ce4e9d3002d187702700dd8f4f8770ebbba651ed066c languageName: node linkType: hard @@ -3856,12 +4617,12 @@ __metadata: languageName: node linkType: hard -"bootstrap@npm:^5.2.2": - version: 5.2.2 - resolution: "bootstrap@npm:5.2.2" +"bootstrap@npm:^5.2.3": + version: 5.2.3 + resolution: "bootstrap@npm:5.2.3" peerDependencies: "@popperjs/core": ^2.11.6 - checksum: 14e6df28feb975dc10702cac0a6c2a21132a6e4e5562e31cdae1db3970e287ed29001020066b61d96b2cea2a45ecf44c08c8c26bc84a31cdeabec0a9be6b9389 + checksum: 0211805dec6a190c0911d142966df30fdb4b4139a04cc6c23dd83c6045ea3cb0a966b360ab2e701e7b3ad96ff01e05fdc0914be97b41bd876b11e457a8bdc6a3 languageName: node linkType: hard @@ -3893,17 +4654,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.20.2, browserslist@npm:^4.21.0, browserslist@npm:^4.21.3, browserslist@npm:^4.9.1": - version: 4.21.3 - resolution: "browserslist@npm:4.21.3" +"browserslist@npm:4.21.4, browserslist@npm:^4.14.5, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" dependencies: - caniuse-lite: ^1.0.30001370 - electron-to-chromium: ^1.4.202 + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 node-releases: ^2.0.6 - update-browserslist-db: ^1.0.5 + update-browserslist-db: ^1.0.9 bin: browserslist: cli.js - checksum: ff512a7bcca1c530e2854bbdfc7be2791d0fb524097a6340e56e1d5924164c7e4e0a9b070de04cdc4c149d15cb4d4275cb7c626ebbce954278a2823aaad2452a + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 languageName: node linkType: hard @@ -3957,6 +4718,15 @@ __metadata: languageName: node linkType: hard +"busboy@npm:^1.6.0": + version: 1.6.0 + resolution: "busboy@npm:1.6.0" + dependencies: + streamsearch: ^1.1.0 + checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e + languageName: node + linkType: hard + "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -3971,7 +4741,28 @@ __metadata: languageName: node linkType: hard -"cacache@npm:16.1.2, cacache@npm:^16.0.0, cacache@npm:^16.1.0": +"cacache@npm:17.0.2": + version: 17.0.2 + resolution: "cacache@npm:17.0.2" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: 75a41961b7f49901a8b24b5e30a6ecce9cbf2c7af6c872b0436b0d4dc1ebf7afbb41ba1e5309f943f2c3e8823ea49fbd8ce3cd832beea4f23d5da07595752c85 + languageName: node + linkType: hard + +"cacache@npm:^16.1.0": version: 16.1.2 resolution: "cacache@npm:16.1.2" dependencies: @@ -3997,6 +4788,27 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^17.0.0": + version: 17.0.4 + resolution: "cacache@npm:17.0.4" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^8.0.1 + lru-cache: ^7.7.1 + minipass: ^4.0.0 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: fea0ed5ab9bb5a56a51c39714f0b93821155538d012b3699cd4e901f39498fdd6283353946625a8c47de20c01b18da4c73fb404552323c66b321d279d80ffa6a + languageName: node + linkType: hard + "call-bind@npm:^1.0.0": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -4021,10 +4833,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001370, caniuse-lite@npm:^1.0.30001373": - version: 1.0.30001383 - resolution: "caniuse-lite@npm:1.0.30001383" - checksum: 1830129858510163f6acfbeaf258e0a84061091901ea349ee12541cc04997a25dc17d0ba731e8518711d87f0e08fee2a762aa89264d86be5f329300d0ff9d421 +"caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001426, caniuse-lite@npm:^1.0.30001441": + version: 1.0.30001441 + resolution: "caniuse-lite@npm:1.0.30001441" + checksum: 0f5aa8f7ea4d165e88e0d1eaa44564c5bfee66641f265a1fd959e74f0a7e6bc0207db6c28e2fb63dc8b2cd23e0e3cee06c4f372de11c93c57ff5ff4207962c3f languageName: node linkType: hard @@ -4066,6 +4878,13 @@ __metadata: languageName: node linkType: hard +"charenc@npm:0.0.2": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 + languageName: node + linkType: hard + "chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -4176,6 +4995,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -4262,6 +5092,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + "commander@npm:4.1.1": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -4276,6 +5115,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -4399,13 +5245,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1": - version: 3.23.3 - resolution: "core-js-compat@npm:3.23.3" +"core-js-compat@npm:^3.25.1": + version: 3.26.1 + resolution: "core-js-compat@npm:3.26.1" dependencies: - browserslist: ^4.21.0 - semver: 7.0.0 - checksum: a5fd680a31b8e667ce0f852238a2fd6769d495ecf0e8a6e04a240e5e259e9a33a77b2839131b640f03c206fff12c51dca7e362ac1897f629bf4c5e39075c83a7 + browserslist: ^4.21.4 + checksum: f222bce0002eae405327d68286e1d566037e8ac21906a47d7ecd15858adca7b12e82140db11dc43c8cc1fc066c5306120f3c27bfb2d7dbc2d20a72a2d90d38dc languageName: node linkType: hard @@ -4460,6 +5305,15 @@ __metadata: languageName: node linkType: hard +"cron@npm:2.0.0": + version: 2.0.0 + resolution: "cron@npm:2.0.0" + dependencies: + luxon: ^1.23.x + checksum: 179ec137ada4ceb44cafe51c55491e84954308d7012d2a44539f0dadbbb1ffbbe3072c2f7aaa88595d60bd56e0d536aae2e4aaa4430c869317d6c2abd966988b + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -4471,58 +5325,28 @@ __metadata: languageName: node linkType: hard -"css-blank-pseudo@npm:^3.0.3": - version: 3.0.3 - resolution: "css-blank-pseudo@npm:3.0.3" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - bin: - css-blank-pseudo: dist/cli.cjs - checksum: 9be0a13885a99d8ba9e1f45ea66e801d4da75b58c1c3c516a40772fa3a93ef9952b15dcac0418acbb6c89daaae0572819647701b8e553a02972826e33d4cd67f - languageName: node - linkType: hard - -"css-has-pseudo@npm:^3.0.4": - version: 3.0.4 - resolution: "css-has-pseudo@npm:3.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - bin: - css-has-pseudo: dist/cli.cjs - checksum: 8f165d68f6621891d9fa1d874794916a52ed8847dfbec591523ad68774650cc1eae062ba08f59514666e04aeba27be72c9b211892f3a187c5ba6e287bd4260e7 +"crypt@npm:0.0.2": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 languageName: node linkType: hard -"css-loader@npm:6.7.1": - version: 6.7.1 - resolution: "css-loader@npm:6.7.1" +"css-loader@npm:6.7.3": + version: 6.7.3 + resolution: "css-loader@npm:6.7.3" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.7 + postcss: ^8.4.19 postcss-modules-extract-imports: ^3.0.0 postcss-modules-local-by-default: ^4.0.0 postcss-modules-scope: ^3.0.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 - semver: ^7.3.5 + semver: ^7.3.8 peerDependencies: webpack: ^5.0.0 - checksum: 170fdbc630a05a43679ef60fa97694766b568dbde37adccc0faafa964fc675f08b976bc68837bb73b61d60240e8d2cbcbf51540fe94ebc9dafc56e7c46ba5527 - languageName: node - linkType: hard - -"css-prefers-color-scheme@npm:^6.0.3": - version: 6.0.3 - resolution: "css-prefers-color-scheme@npm:6.0.3" - peerDependencies: - postcss: ^8.4 - bin: - css-prefers-color-scheme: dist/cli.cjs - checksum: 3a2b02f0454adda68861cdcaf6a0d11f462eadf165301cba61c5ec7c5f229ac261c5baa54c377d9b811ec5f21b30d72a02bc032cdad2415b3a566f08a0c47b3a + checksum: 473cc32b6c837c2848e2051ad1ba331c1457449f47442e75a8c480d9891451434ada241f7e3de2347e57de17fcd84610b3bcfc4a9da41102cdaedd1e17902d31 languageName: node linkType: hard @@ -4546,13 +5370,6 @@ __metadata: languageName: node linkType: hard -"cssdb@npm:^7.0.0": - version: 7.0.1 - resolution: "cssdb@npm:7.0.1" - checksum: 4b4de59864c8d3adb5f90fad2b97d527714bb7702f317275b43e2d4e91cb68408130e9c8bdef932027feec86bd74beb847509ee931a3338f7a5be7d01c81eac8 - languageName: node - linkType: hard - "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -4562,6 +5379,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.0 + resolution: "data-uri-to-buffer@npm:4.0.0" + checksum: a010653869abe8bb51259432894ac62c52bf79ad761d418d94396f48c346f2ae739c46b254e8bb5987bded8a653d467db1968db3a69bab1d33aa5567baa5cfc7 + languageName: node + linkType: hard + "date-fns@npm:^2.28.0": version: 2.28.0 resolution: "date-fns@npm:2.28.0" @@ -4578,7 +5402,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -4654,13 +5478,10 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 languageName: node linkType: hard @@ -4806,7 +5627,7 @@ __metadata: languageName: node linkType: hard -"duplexer@npm:~0.1.1": +"duplexer@npm:^0.1.2, duplexer@npm:~0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 @@ -4829,10 +5650,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.202": - version: 1.4.231 - resolution: "electron-to-chromium@npm:1.4.231" - checksum: c0a5d0b2423111e08acf2edfcb682bb09039f361a7c1707b4ff3e3c24b022221c9547ae44ad8daf58c7fc96bda89e475bed958774a0e2aefeb324efa03b4131b +"electron-to-chromium@npm:^1.4.251": + version: 1.4.284 + resolution: "electron-to-chromium@npm:1.4.284" + checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a languageName: node linkType: hard @@ -4892,6 +5713,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.4.0 + resolution: "entities@npm:4.4.0" + checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -4933,181 +5761,184 @@ __metadata: languageName: node linkType: hard -"esbuild-android-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-android-64@npm:0.15.5" +"esbuild-android-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-android-64@npm:0.15.13" conditions: os=android & cpu=x64 languageName: node linkType: hard -"esbuild-android-arm64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-android-arm64@npm:0.15.5" +"esbuild-android-arm64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-android-arm64@npm:0.15.13" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"esbuild-darwin-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-darwin-64@npm:0.15.5" +"esbuild-darwin-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-darwin-64@npm:0.15.13" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"esbuild-darwin-arm64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-darwin-arm64@npm:0.15.5" +"esbuild-darwin-arm64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-darwin-arm64@npm:0.15.13" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"esbuild-freebsd-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-freebsd-64@npm:0.15.5" +"esbuild-freebsd-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-freebsd-64@npm:0.15.13" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"esbuild-freebsd-arm64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-freebsd-arm64@npm:0.15.5" +"esbuild-freebsd-arm64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-freebsd-arm64@npm:0.15.13" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"esbuild-linux-32@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-32@npm:0.15.5" +"esbuild-linux-32@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-32@npm:0.15.13" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"esbuild-linux-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-64@npm:0.15.5" +"esbuild-linux-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-64@npm:0.15.13" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"esbuild-linux-arm64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-arm64@npm:0.15.5" +"esbuild-linux-arm64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-arm64@npm:0.15.13" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"esbuild-linux-arm@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-arm@npm:0.15.5" +"esbuild-linux-arm@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-arm@npm:0.15.13" conditions: os=linux & cpu=arm languageName: node linkType: hard -"esbuild-linux-mips64le@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-mips64le@npm:0.15.5" +"esbuild-linux-mips64le@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-mips64le@npm:0.15.13" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"esbuild-linux-ppc64le@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-ppc64le@npm:0.15.5" +"esbuild-linux-ppc64le@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-ppc64le@npm:0.15.13" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"esbuild-linux-riscv64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-riscv64@npm:0.15.5" +"esbuild-linux-riscv64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-riscv64@npm:0.15.13" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"esbuild-linux-s390x@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-linux-s390x@npm:0.15.5" +"esbuild-linux-s390x@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-linux-s390x@npm:0.15.13" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"esbuild-netbsd-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-netbsd-64@npm:0.15.5" +"esbuild-netbsd-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-netbsd-64@npm:0.15.13" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"esbuild-openbsd-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-openbsd-64@npm:0.15.5" +"esbuild-openbsd-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-openbsd-64@npm:0.15.13" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"esbuild-sunos-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-sunos-64@npm:0.15.5" +"esbuild-sunos-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-sunos-64@npm:0.15.13" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"esbuild-wasm@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-wasm@npm:0.15.5" +"esbuild-wasm@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-wasm@npm:0.15.13" bin: esbuild: bin/esbuild - checksum: eed3f81dc017192a4a70dc0474f7c61dc9709994a3070533a8b773b11482a1bc3051e0a10529741b146ae75b0878dc9ccf6db97c1afb4e5447b9c43b8e1c6eed + checksum: a363da045ec44b4f69f8cec511dc88f5edd8d477304e4c815ea3c48db41c785f5c39a571627d7407b89214889d33dfdcb72a75d684eab7008e698ff91bb42a20 languageName: node linkType: hard -"esbuild-windows-32@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-windows-32@npm:0.15.5" +"esbuild-windows-32@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-windows-32@npm:0.15.13" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"esbuild-windows-64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-windows-64@npm:0.15.5" +"esbuild-windows-64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-windows-64@npm:0.15.13" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"esbuild-windows-arm64@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild-windows-arm64@npm:0.15.5" +"esbuild-windows-arm64@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild-windows-arm64@npm:0.15.13" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"esbuild@npm:0.15.5": - version: 0.15.5 - resolution: "esbuild@npm:0.15.5" - dependencies: - "@esbuild/linux-loong64": 0.15.5 - esbuild-android-64: 0.15.5 - esbuild-android-arm64: 0.15.5 - esbuild-darwin-64: 0.15.5 - esbuild-darwin-arm64: 0.15.5 - esbuild-freebsd-64: 0.15.5 - esbuild-freebsd-arm64: 0.15.5 - esbuild-linux-32: 0.15.5 - esbuild-linux-64: 0.15.5 - esbuild-linux-arm: 0.15.5 - esbuild-linux-arm64: 0.15.5 - esbuild-linux-mips64le: 0.15.5 - esbuild-linux-ppc64le: 0.15.5 - esbuild-linux-riscv64: 0.15.5 - esbuild-linux-s390x: 0.15.5 - esbuild-netbsd-64: 0.15.5 - esbuild-openbsd-64: 0.15.5 - esbuild-sunos-64: 0.15.5 - esbuild-windows-32: 0.15.5 - esbuild-windows-64: 0.15.5 - esbuild-windows-arm64: 0.15.5 +"esbuild@npm:0.15.13": + version: 0.15.13 + resolution: "esbuild@npm:0.15.13" + dependencies: + "@esbuild/android-arm": 0.15.13 + "@esbuild/linux-loong64": 0.15.13 + esbuild-android-64: 0.15.13 + esbuild-android-arm64: 0.15.13 + esbuild-darwin-64: 0.15.13 + esbuild-darwin-arm64: 0.15.13 + esbuild-freebsd-64: 0.15.13 + esbuild-freebsd-arm64: 0.15.13 + esbuild-linux-32: 0.15.13 + esbuild-linux-64: 0.15.13 + esbuild-linux-arm: 0.15.13 + esbuild-linux-arm64: 0.15.13 + esbuild-linux-mips64le: 0.15.13 + esbuild-linux-ppc64le: 0.15.13 + esbuild-linux-riscv64: 0.15.13 + esbuild-linux-s390x: 0.15.13 + esbuild-netbsd-64: 0.15.13 + esbuild-openbsd-64: 0.15.13 + esbuild-sunos-64: 0.15.13 + esbuild-windows-32: 0.15.13 + esbuild-windows-64: 0.15.13 + esbuild-windows-arm64: 0.15.13 dependenciesMeta: + "@esbuild/android-arm": + optional: true "@esbuild/linux-loong64": optional: true esbuild-android-64: @@ -5152,7 +5983,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: fc7f5df6542bd18dee1e61c58049ddf3d6b508d8d67eabcba455f7dbb560552e012f169a8afa2f209de554a206935fedf30d576aacdc2b46cb4da229181968fb + checksum: ef5f339fae7e2abc4ec5484d4b301efdf40f580e043cbf8a66e19d6c91df82368a810abec61fd5e5db226f0c354f49c36616c9ea04c5412a142a050c10239bf7 languageName: node linkType: hard @@ -5255,13 +6086,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.25.0": - version: 8.25.0 - resolution: "eslint@npm:8.25.0" +"eslint@npm:^8.30.0": + version: 8.30.0 + resolution: "eslint@npm:8.30.0" dependencies: - "@eslint/eslintrc": ^1.3.3 - "@humanwhocodes/config-array": ^0.10.5 + "@eslint/eslintrc": ^1.4.0 + "@humanwhocodes/config-array": ^0.11.8 "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 chalk: ^4.0.0 cross-spawn: ^7.0.2 @@ -5277,14 +6109,14 @@ __metadata: fast-deep-equal: ^3.1.3 file-entry-cache: ^6.0.1 find-up: ^5.0.0 - glob-parent: ^6.0.1 - globals: ^13.15.0 - globby: ^11.1.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 + is-path-inside: ^3.0.3 js-sdsl: ^4.1.4 js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 @@ -5299,7 +6131,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 7acf2693b522b573657b53d2245b5522d3a131e4224b1cbf01e2c3579632fdbf62599284f68bc483e6e4eba23ae3643c9544744e0214a86e727cc361cedcd0fa + checksum: b7525bb465b342665c3b8bab7e114d514ef1bc4e79f211c919863f9c71767e7412ec82383a22614a92d159783f91101018817000f7c61ce69a5e7015280cafaf languageName: node linkType: hard @@ -5649,6 +6481,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: ^1.0.0 + web-streams-polyfill: ^3.0.3 + checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf + languageName: node + linkType: hard + "figures@npm:^3.0.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -5709,7 +6551,7 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.1": +"find-cache-dir@npm:^3.3.2": version: 3.3.2 resolution: "find-cache-dir@npm:3.3.2" dependencies: @@ -5768,13 +6610,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0": - version: 1.15.1 - resolution: "follow-redirects@npm:1.15.1" +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.0": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" peerDependenciesMeta: debug: optional: true - checksum: 6aa4e3e3cdfa3b9314801a1cd192ba756a53479d9d8cca65bf4db3a3e8834e62139245cd2f9566147c8dfe2efff1700d3e6aefd103de4004a7b99985e71dd533 + checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 languageName: node linkType: hard @@ -5805,6 +6647,26 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: ^3.1.2 + checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -5860,6 +6722,15 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^3.0.0": + version: 3.0.0 + resolution: "fs-minipass@npm:3.0.0" + dependencies: + minipass: ^4.0.0 + checksum: b72e9fe426e39f05b35bf237c8218b7ab3f68a65f325725ad7b4e431ff5a10725946fc62883b78446c07515ab938d25fdde3d08fb5ac8693f7f9eb9990da21f0 + languageName: node + linkType: hard + "fs-monkey@npm:^1.0.3": version: 1.0.3 resolution: "fs-monkey@npm:1.0.3" @@ -5954,7 +6825,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1": +"get-intrinsic@npm:^1.0.2": version: 1.1.2 resolution: "get-intrinsic@npm:1.1.2" dependencies: @@ -6004,7 +6875,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.1": +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -6033,7 +6904,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": +"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -6054,12 +6925,12 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.15.0": - version: 13.15.0 - resolution: "globals@npm:13.15.0" +"globals@npm:^13.19.0": + version: 13.19.0 + resolution: "globals@npm:13.19.0" dependencies: type-fest: ^0.20.2 - checksum: 383ade0873b2ab29ce6d143466c203ed960491575bc97406395e5c8434026fb02472ab2dfff5bc16689b8460269b18fda1047975295cd0183904385c51258bae + checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e languageName: node linkType: hard @@ -6118,6 +6989,15 @@ __metadata: languageName: node linkType: hard +"gzip-size@npm:^6.0.0": + version: 6.0.0 + resolution: "gzip-size@npm:6.0.0" + dependencies: + duplexer: ^0.1.2 + checksum: 2df97f359696ad154fc171dcb55bc883fe6e833bca7a65e457b9358f3cb6312405ed70a8da24a77c1baac0639906cd52358dc0ce2ec1a937eaa631b934c94194 + languageName: node + linkType: hard + "handle-thing@npm:^2.0.0": version: 2.0.1 resolution: "handle-thing@npm:2.0.1" @@ -6139,16 +7019,7 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.3": +"has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 @@ -6219,6 +7090,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^6.0.0": + version: 6.1.1 + resolution: "hosted-git-info@npm:6.1.1" + dependencies: + lru-cache: ^7.5.1 + checksum: fcd3ca2eaa05f3201425ccbb8aa47f88cdda4a3a6d79453f8e269f7171356278bd1db08f059d8439eb5eaa91c6a8a20800fc49cca6e9e4e899b202a332d5ba6b + languageName: node + linkType: hard + "hpack.js@npm:^2.1.6": version: 2.1.6 resolution: "hpack.js@npm:2.1.6" @@ -6391,12 +7271,12 @@ __metadata: languageName: node linkType: hard -"ignore-walk@npm:^5.0.1": - version: 5.0.1 - resolution: "ignore-walk@npm:5.0.1" +"ignore-walk@npm:^6.0.0": + version: 6.0.0 + resolution: "ignore-walk@npm:6.0.0" dependencies: minimatch: ^5.0.1 - checksum: 1a4ef35174653a1aa6faab3d9f8781269166536aee36a04946f6e2b319b2475c1903a75ed42f04219274128242f49d0a10e20c4354ee60d9548e97031451150b + checksum: b94da5517922d65a721f95caa8a884bb8672e80a29691cc3402a4db1eb77f61165dc5c499d8c8efe5e3d9874ff3e9ab05734234ad929b28ba219cf73197ea98c languageName: node linkType: hard @@ -6478,10 +7358,10 @@ __metadata: languageName: node linkType: hard -"ini@npm:3.0.0": - version: 3.0.0 - resolution: "ini@npm:3.0.0" - checksum: e92b6b0835ac369e58c677e7faa8db6019ac667d7404887978fb86b181d658e50f1742ecbba7d81eb5ff917b3ae4d63a48e1ef3a9f8a0527bd7605fe1a9995d4 +"ini@npm:3.0.1": + version: 3.0.1 + resolution: "ini@npm:3.0.1" + checksum: 947b582a822f06df3c22c75c90aec217d604ea11f7a20249530ee5c1cf8f508288439abe17b0e1d9b421bda5f4fae5e7aae0b18cb3ded5ac9d68f607df82f10f languageName: node linkType: hard @@ -6587,6 +7467,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:~1.1.6": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 + languageName: node + linkType: hard + "is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": version: 2.9.0 resolution: "is-core-module@npm:2.9.0" @@ -6605,6 +7492,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -6649,6 +7545,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + "is-plain-obj@npm:^3.0.0": version: 3.0.0 resolution: "is-plain-obj@npm:3.0.0" @@ -6816,6 +7719,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^3.0.0": + version: 3.0.0 + resolution: "json-parse-even-better-errors@npm:3.0.0" + checksum: f1970b5220c7fa23d888565510752c3d5e863f93668a202fcaa719739fa41485dfc6a1db212f702ebd3c873851cc067aebc2917e3f79763cae2fdb95046f38f3 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -6837,17 +7747,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 - languageName: node - linkType: hard - "json5@npm:^2.1.2, json5@npm:^2.2.1": version: 2.2.1 resolution: "json5@npm:2.2.1" @@ -6891,7 +7790,7 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:8.5.1, jsonwebtoken@npm:^8.2.0": +"jsonwebtoken@npm:8.5.1": version: 8.5.1 resolution: "jsonwebtoken@npm:8.5.1" dependencies: @@ -6909,6 +7808,18 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" + dependencies: + jws: ^3.2.2 + lodash: ^4.17.21 + ms: ^2.1.1 + semver: ^7.3.8 + checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 + languageName: node + linkType: hard + "jwa@npm:^1.4.1": version: 1.4.1 resolution: "jwa@npm:1.4.1" @@ -6960,15 +7871,15 @@ __metadata: languageName: node linkType: hard -"less-loader@npm:11.0.0": - version: 11.0.0 - resolution: "less-loader@npm:11.0.0" +"less-loader@npm:11.1.0": + version: 11.1.0 + resolution: "less-loader@npm:11.1.0" dependencies: klona: ^2.0.4 peerDependencies: less: ^3.5.0 || ^4.0.0 webpack: ^5.0.0 - checksum: fe5f810549a04c3d1b7fdd838c598e1dd7e6ed35428bdc7ec0caa4e7f2c07abfd1519c477aca713ca1259f88905dae25dd5f0c27b61071d9ce0dfefded86be1a + checksum: 041216e0a6d95e24c9724f470719db3eb70b3888c45b1a1e9cd55edabe8ae79709522cd6c6713b466b3e9948544074e2a5b2be50ac3ced5ff41dfa9675f3b182 languageName: node linkType: hard @@ -7056,10 +7967,10 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:3.2.0": - version: 3.2.0 - resolution: "loader-utils@npm:3.2.0" - checksum: c7b9a8dc4b3bc19e9ef563c48e3a18ea9f8bb2da1ad38a12e4b88358cfba5f148a7baf12d78fe78ffcb718ce1e062ab31fcf5c148459f1247a672a4213471e80 +"loader-utils@npm:3.2.1": + version: 3.2.1 + resolution: "loader-utils@npm:3.2.1" + checksum: 4e3ea054cdc8be1ab1f1238f49f42fdf0483039eff920fb1d442039f3f0ad4ebd11fb8e584ccdf2cb7e3c56b3d40c1832416e6408a55651b843da288960cc792 languageName: node linkType: hard @@ -7155,7 +8066,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -7188,6 +8099,13 @@ __metadata: languageName: node linkType: hard +"luxon@npm:^1.23.x": + version: 1.28.0 + resolution: "luxon@npm:1.28.0" + checksum: 5250cb9f138b6048eeb0b3a9044a4ac994d0058f680c72a0da4b6aeaec8612460385639cba2b1052ef6d5564879e9ed144d686f26d9d97b38ab920d82e18281c + languageName: node + linkType: hard + "macos-release@npm:^2.5.0": version: 2.5.0 resolution: "macos-release@npm:2.5.0" @@ -7195,7 +8113,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:0.26.2, magic-string@npm:^0.26.0": +"magic-string@npm:0.26.2": version: 0.26.2 resolution: "magic-string@npm:0.26.2" dependencies: @@ -7204,6 +8122,24 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:0.26.7": + version: 0.26.7 + resolution: "magic-string@npm:0.26.7" + dependencies: + sourcemap-codec: ^1.4.8 + checksum: 89b0d60cbb32bbf3d1e23c46ea93db082d18a8230b972027aecb10a40bba51be519ecce0674f995571e3affe917b76b09f59d8dbc9a1b2c9c4102a2b6e8a2b01 + languageName: node + linkType: hard + +"magic-string@npm:^0.27.0": + version: 0.27.0 + resolution: "magic-string@npm:0.27.0" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.13 + checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e + languageName: node + linkType: hard + "make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -7230,7 +8166,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6": +"make-fetch-happen@npm:^10.0.3": version: 10.2.1 resolution: "make-fetch-happen@npm:10.2.1" dependencies: @@ -7254,6 +8190,30 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^11.0.0": + version: 11.0.2 + resolution: "make-fetch-happen@npm:11.0.2" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^4.0.0 + minipass-collect: ^1.0.2 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: b843ef2e42bc17c37c7636dbe82867caceaa36b3f2591f20918abc190ca85cf37e5e142148b730dab7d94e9d2f0c80947a703f8dadebae993cd93ad929dba103 + languageName: node + linkType: hard + "map-stream@npm:~0.1.0": version: 0.1.0 resolution: "map-stream@npm:0.1.0" @@ -7261,6 +8221,17 @@ __metadata: languageName: node linkType: hard +"md5@npm:^2.2.1": + version: 2.3.0 + resolution: "md5@npm:2.3.0" + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: ~1.1.6 + checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -7322,7 +8293,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -7367,21 +8338,12 @@ __metadata: "minimalistic-assert@npm:^1.0.0": version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimatch@npm:5.1.0, minimatch@npm:^5.0.1": - version: 5.1.0 - resolution: "minimatch@npm:5.1.0" - dependencies: - brace-expansion: ^2.0.1 - checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7390,6 +8352,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1": + version: 5.1.0 + resolution: "minimatch@npm:5.1.0" + dependencies: + brace-expansion: ^2.0.1 + checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 + languageName: node + linkType: hard + "minimist@npm:minimist-lite@*": version: 2.2.1 resolution: "minimist-lite@npm:2.2.1" @@ -7421,6 +8392,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^3.0.0": + version: 3.0.1 + resolution: "minipass-fetch@npm:3.0.1" + dependencies: + encoding: ^0.1.13 + minipass: ^4.0.0 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: b5eecf462ab8409891e4b8a786260e411304b958e45e10820b0a5d31f7841ccbce5f85e49934a34fdb94501206c273bde1988b9c0ad1625bdfb9883d90285420 + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -7467,6 +8453,15 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass@npm:4.0.0" + dependencies: + yallist: ^4.0.0 + checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381 + languageName: node + linkType: hard + "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -7493,12 +8488,12 @@ __metadata: languageName: node linkType: hard -"mnemonist@npm:0.39.2": - version: 0.39.2 - resolution: "mnemonist@npm:0.39.2" +"mnemonist@npm:0.39.5": + version: 0.39.5 + resolution: "mnemonist@npm:0.39.5" dependencies: obliterator: ^2.0.1 - checksum: 77075ddf30c5e7ee8ccde6d09b61a2511eb324e9d04871e6cb48ede9ed1d2b002ad121314912bf1926d12ba3cb520ca2fb54c2a6c3f9d4467774af2f447907aa + checksum: 6669d687a434226924b2c84ee6eb7ce7d0f83dfc5caad8bcc164c73c0c11fb6d43cbe32636e710f068046f4b40a56c3032532554e93e02640aafc6ca3dd222e6 languageName: node linkType: hard @@ -7509,24 +8504,17 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f +"mrmime@npm:^1.0.0": + version: 1.0.1 + resolution: "mrmime@npm:1.0.1" + checksum: cc979da44bbbffebaa8eaf7a45117e851f2d4cb46a3ada6ceb78130466a04c15a0de9a9ce1c8b8ba6f6e1b8618866b1352992bf1757d241c0ddca558b9f28a77 languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d +"ms@npm:3.0.0-canary.1": + version: 3.0.0-canary.1 + resolution: "ms@npm:3.0.0-canary.1" + checksum: 5ec76c0932cf83ac3e7f70f1a4c0d4db4dbc91de6ea5f7d336c67b48f513c8cb4c0fce3a07e3d84ee931dbdc9a48f33ed1c485e834279fff8906d385e86684ae languageName: node linkType: hard @@ -7583,6 +8571,13 @@ __metadata: languageName: node linkType: hard +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -7710,6 +8705,13 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f + languageName: node + linkType: hard + "node-emoji@npm:1.11.0": version: 1.11.0 resolution: "node-emoji@npm:1.11.0" @@ -7733,6 +8735,17 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^3.2.10": + version: 3.2.10 + resolution: "node-fetch@npm:3.2.10" + dependencies: + data-uri-to-buffer: ^4.0.0 + fetch-blob: ^3.1.4 + formdata-polyfill: ^4.0.10 + checksum: e65322431f4897ded04197aa5923eaec63a8d53e00432de4e70a4f7006625c8dc32629c5c35f4fe8ee719a4825544d07bf53f6e146a7265914262f493e8deac1 + languageName: node + linkType: hard + "node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -7751,7 +8764,27 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^9.0.0, node-gyp@npm:^9.1.0, node-gyp@npm:latest": +"node-gyp@npm:^9.0.0, node-gyp@npm:^9.1.0, node-gyp@npm:^9.3.0": + version: 9.3.1 + resolution: "node-gyp@npm:9.3.1" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + languageName: node + linkType: hard + +"node-gyp@npm:latest": version: 9.1.0 resolution: "node-gyp@npm:9.1.0" dependencies: @@ -7789,15 +8822,26 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^4.0.0": - version: 4.0.0 - resolution: "normalize-package-data@npm:4.0.0" +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" dependencies: - hosted-git-info: ^5.0.0 + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"normalize-package-data@npm:^5.0.0": + version: 5.0.0 + resolution: "normalize-package-data@npm:5.0.0" + dependencies: + hosted-git-info: ^6.0.0 is-core-module: ^2.8.1 semver: ^7.3.5 validate-npm-package-license: ^3.0.4 - checksum: b0f47de4295a0f8499bd478e84b9f9592a29f65227c2b4446ae80f7dff6e7a5ec6ef25ea8f06f3dcb9b7b7d945c2daa274385925b3d85e77e34eaffa0b42e316 + checksum: a459f05eaf7c2b643c61234177f08e28064fde97da15800e3d3ac0404e28450d43ac46fc95fbf6407a9bf20af4c58505ad73458a912dc1517f8c1687b1d68c27 languageName: node linkType: hard @@ -7815,97 +8859,88 @@ __metadata: languageName: node linkType: hard -"npm-bundled@npm:^1.1.1": - version: 1.1.2 - resolution: "npm-bundled@npm:1.1.2" - dependencies: - npm-normalize-package-bin: ^1.0.1 - checksum: 6e599155ef28d0b498622f47f1ba189dfbae05095a1ed17cb3a5babf961e965dd5eab621f0ec6f0a98de774e5836b8f5a5ee639010d64f42850a74acec3d4d09 - languageName: node - linkType: hard - -"npm-bundled@npm:^2.0.0": - version: 2.0.1 - resolution: "npm-bundled@npm:2.0.1" +"npm-bundled@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-bundled@npm:3.0.0" dependencies: - npm-normalize-package-bin: ^2.0.0 - checksum: 7747293985c48c5268871efe691545b03731cb80029692000cbdb0b3344b9617be5187aa36281cabbe6b938e3651b4e87236d1c31f9e645eef391a1a779413e6 + npm-normalize-package-bin: ^3.0.0 + checksum: 110859c2d6dcd7941dac0932a29171cbde123060486a4b6e897aaf5e025abeb3d9ffcdfe9e9271992e6396b2986c2c534f1029a45a7c196f1257fa244305dbf8 languageName: node linkType: hard -"npm-install-checks@npm:^5.0.0": - version: 5.0.0 - resolution: "npm-install-checks@npm:5.0.0" +"npm-install-checks@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-install-checks@npm:6.0.0" dependencies: semver: ^7.1.1 - checksum: 0e7d1aae52b1fe9d3a0fd4a008850c7047931722dd49ee908afd13fd0297ac5ddb10964d9c59afcdaaa2ca04b51d75af2788f668c729ae71fec0e4cdac590ffc - languageName: node - linkType: hard - -"npm-normalize-package-bin@npm:^1.0.1": - version: 1.0.1 - resolution: "npm-normalize-package-bin@npm:1.0.1" - checksum: ae7f15155a1e3ace2653f12ddd1ee8eaa3c84452fdfbf2f1943e1de264e4b079c86645e2c55931a51a0a498cba31f70022a5219d5665fbcb221e99e58bc70122 + checksum: 5476a26dccb83c24d9ffaf3d0592e8001f9804a40c6b3f441c9a1b2c8d643e90d8352c4ce27ffce72296de7f9744750d0124a6db55b68071971d4b4e74787818 languageName: node linkType: hard -"npm-normalize-package-bin@npm:^2.0.0": - version: 2.0.0 - resolution: "npm-normalize-package-bin@npm:2.0.0" - checksum: 7c5379f9b188b564c4332c97bdd9a5d6b7b15f02b5823b00989d6a0e6fb31eb0280f02b0a924f930e1fcaf00e60fae333aec8923d2a4c7747613c7d629d8aa25 +"npm-normalize-package-bin@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-normalize-package-bin@npm:3.0.0" + checksum: 6a34886c150b0f5302aad52a9446e5c939aa14eeb462323e75681517b36c6b9eaef83e1f5bc2d7e5154b3b752cbce81bed05e290db3f1f7edf857cbb895e35c0 languageName: node linkType: hard -"npm-package-arg@npm:9.1.0, npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1": - version: 9.1.0 - resolution: "npm-package-arg@npm:9.1.0" +"npm-package-arg@npm:9.1.2": + version: 9.1.2 + resolution: "npm-package-arg@npm:9.1.2" dependencies: hosted-git-info: ^5.0.0 proc-log: ^2.0.1 semver: ^7.3.5 validate-npm-package-name: ^4.0.0 - checksum: 277c21477731a4f1e31bde36f0db5f5470deb2a008db2aaf1b015d588b23cb225c75f90291ea241235e86682a03de972bbe69fc805c921a786ea9616955990b9 + checksum: 3793488843985ed71deb14fcba7c068d8ed03a18fd8f6b235c6a64465c9a25f60261598106d5cc8677c0bee9548e405c34c2e3c7a822e3113d3389351c745dfa languageName: node linkType: hard -"npm-packlist@npm:^5.1.0": - version: 5.1.3 - resolution: "npm-packlist@npm:5.1.3" +"npm-package-arg@npm:^10.0.0": + version: 10.1.0 + resolution: "npm-package-arg@npm:10.1.0" dependencies: - glob: ^8.0.1 - ignore-walk: ^5.0.1 - npm-bundled: ^2.0.0 - npm-normalize-package-bin: ^2.0.0 - bin: - npm-packlist: bin/index.js - checksum: 94cc9c66740e8f80243301de85eb0a2cec5bbd570c3f26b6ad7af1a3eca155f7e810580dc7ea4448f12a8fd82f6db307e7132a5fe69e157eb45b325acadeb22a + hosted-git-info: ^6.0.0 + proc-log: ^3.0.0 + semver: ^7.3.5 + validate-npm-package-name: ^5.0.0 + checksum: 8fe4b6a742502345e4836ed42fdf26c544c9f75563c476c67044a481ada6e81f71b55462489c7e1899d516e4347150e58028036a90fa11d47e320bcc9365fd30 languageName: node linkType: hard -"npm-pick-manifest@npm:7.0.1, npm-pick-manifest@npm:^7.0.0": - version: 7.0.1 - resolution: "npm-pick-manifest@npm:7.0.1" +"npm-packlist@npm:^7.0.0": + version: 7.0.4 + resolution: "npm-packlist@npm:7.0.4" + dependencies: + ignore-walk: ^6.0.0 + checksum: 5ffa1f8f0b32141a60a66713fa3ed03b8ee4800b1ed6b59194d03c3c85da88f3fc21e1de29b665f322678bae85198732b16aa76c0a7cb0e283f9e0db50752233 + languageName: node + linkType: hard + +"npm-pick-manifest@npm:8.0.1, npm-pick-manifest@npm:^8.0.0": + version: 8.0.1 + resolution: "npm-pick-manifest@npm:8.0.1" dependencies: - npm-install-checks: ^5.0.0 - npm-normalize-package-bin: ^1.0.1 - npm-package-arg: ^9.0.0 + npm-install-checks: ^6.0.0 + npm-normalize-package-bin: ^3.0.0 + npm-package-arg: ^10.0.0 semver: ^7.3.5 - checksum: 9a4a8e64d2214783b2b74a361845000f5d91bb40c7858e2a30af2ac7876d9296efc37f8cacf60335e96a45effee2035b033d9bdefb4889757cc60d85959accbb + checksum: b8e16f2fbcc40ba7d1405c9b566bcee32488c6709f883207f709b0715ed34e2f3f3bc5bf5cb9563d6aa23cb878102bf0011ba22cce9235caa9a0349784b48ecd languageName: node linkType: hard -"npm-registry-fetch@npm:^13.0.1": - version: 13.1.1 - resolution: "npm-registry-fetch@npm:13.1.1" +"npm-registry-fetch@npm:^14.0.0": + version: 14.0.3 + resolution: "npm-registry-fetch@npm:14.0.3" dependencies: - make-fetch-happen: ^10.0.6 - minipass: ^3.1.6 - minipass-fetch: ^2.0.3 + make-fetch-happen: ^11.0.0 + minipass: ^4.0.0 + minipass-fetch: ^3.0.0 minipass-json-stream: ^1.0.1 minizlib: ^2.1.2 - npm-package-arg: ^9.0.1 - proc-log: ^2.0.0 - checksum: e085faf5cdc1cfe9b8f825065a0823531b2a28799d84614b3971e344dde087f9089c0f0220360771a81f110c5444978c6f7309084ff7d7d396252b068148bb44 + npm-package-arg: ^10.0.0 + proc-log: ^3.0.0 + checksum: 451224e7272c8418000f6a0e27fb01d7eb5231bcd98dbd42acac3f275f0b5317590c152860cc84afa706427121b59f9422939e00af5690442b70e64cfa39de0a languageName: node linkType: hard @@ -7972,25 +9007,6 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.1.0": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 - languageName: node - linkType: hard - "obliterator@npm:^2.0.1": version: 2.0.4 resolution: "obliterator@npm:2.0.4" @@ -8057,6 +9073,15 @@ __metadata: languageName: node linkType: hard +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc + languageName: node + linkType: hard + "optionator@npm:^0.9.1": version: 0.9.1 resolution: "optionator@npm:0.9.1" @@ -8181,34 +9206,30 @@ __metadata: languageName: node linkType: hard -"pacote@npm:13.6.2": - version: 13.6.2 - resolution: "pacote@npm:13.6.2" +"pacote@npm:15.0.6": + version: 15.0.6 + resolution: "pacote@npm:15.0.6" dependencies: - "@npmcli/git": ^3.0.0 - "@npmcli/installed-package-contents": ^1.0.7 - "@npmcli/promise-spawn": ^3.0.0 - "@npmcli/run-script": ^4.1.0 - cacache: ^16.0.0 - chownr: ^2.0.0 + "@npmcli/git": ^4.0.0 + "@npmcli/installed-package-contents": ^2.0.1 + "@npmcli/promise-spawn": ^6.0.1 + "@npmcli/run-script": ^6.0.0 + cacache: ^17.0.0 fs-minipass: ^2.1.0 - infer-owner: ^1.0.4 minipass: ^3.1.6 - mkdirp: ^1.0.4 - npm-package-arg: ^9.0.0 - npm-packlist: ^5.1.0 - npm-pick-manifest: ^7.0.0 - npm-registry-fetch: ^13.0.1 - proc-log: ^2.0.0 + npm-package-arg: ^10.0.0 + npm-packlist: ^7.0.0 + npm-pick-manifest: ^8.0.0 + npm-registry-fetch: ^14.0.0 + proc-log: ^3.0.0 promise-retry: ^2.0.1 - read-package-json: ^5.0.0 - read-package-json-fast: ^2.0.3 - rimraf: ^3.0.2 - ssri: ^9.0.0 + read-package-json: ^6.0.0 + read-package-json-fast: ^3.0.0 + ssri: ^10.0.0 tar: ^6.1.11 bin: pacote: lib/bin.js - checksum: a7b7f97094ab570a23e1c174537e9953a4d53176cc4b18bac77d7728bd89e2b9fa331d0f78fa463add03df79668a918bbdaa2750819504ee39242063abf53c6e + checksum: 780090212079efc787fc3c3b19bfcec34beeb6f24ef2ac43981c496ee24acbf1846752245740111db6cb7decf542313cb258b1339a57a7430d1b6626e4bfe1d0 languageName: node linkType: hard @@ -8275,7 +9296,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^5.0.0, parse5@npm:^5.1.1": +"parse5@npm:^5.1.1": version: 5.1.1 resolution: "parse5@npm:5.1.1" checksum: 613a714af4c1101d1cb9f7cece2558e35b9ae8a0c03518223a4a1e35494624d9a9ad5fad4c13eab66a0e0adccd9aa3d522fc8f5f9cc19789e0579f3fa0bdfc65 @@ -8289,6 +9310,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.1.2": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -8306,13 +9336,13 @@ __metadata: languageName: node linkType: hard -"passport-jwt@npm:^4.0.0": - version: 4.0.0 - resolution: "passport-jwt@npm:4.0.0" +"passport-jwt@npm:^4.0.1": + version: 4.0.1 + resolution: "passport-jwt@npm:4.0.1" dependencies: - jsonwebtoken: ^8.2.0 + jsonwebtoken: ^9.0.0 passport-strategy: ^1.0.0 - checksum: d0499ebb819c714d885a9c03a6c5d6dfae916c1a81ccb62357136d5bf477529327e9b8fc658f61f97c565651d2bd78eccec4543474a08e944132f0e2ec47cc3d + checksum: 0669d5bf8fc18ee57eb39601491c59ac084acfa6c972e0a3289e9d88a3ee6fab9e9fb279f359eee81939fedb66904c4a74423004480b60c54621af0d7b2ee0d5 languageName: node linkType: hard @@ -8519,64 +9549,68 @@ __metadata: version: 0.0.0-use.local resolution: "picsur-backend@workspace:backend" dependencies: - "@fastify/helmet": ^10.0.1 - "@fastify/multipart": ^7.2.0 - "@fastify/static": ^6.5.0 - "@nestjs/cli": ^9.1.4 - "@nestjs/common": ^9.1.4 + "@fastify/helmet": ^10.1.0 + "@fastify/multipart": ^7.3.0 + "@fastify/reply-from": ^8.3.1 + "@fastify/static": ^6.6.0 + "@nestjs/cli": ^9.1.5 + "@nestjs/common": ^9.2.1 "@nestjs/config": ^2.2.0 - "@nestjs/core": ^9.1.4 + "@nestjs/core": ^9.2.1 "@nestjs/jwt": ^9.0.0 "@nestjs/passport": ^9.0.0 - "@nestjs/platform-fastify": ^9.1.4 + "@nestjs/platform-fastify": ^9.2.1 + "@nestjs/schedule": ^2.1.0 "@nestjs/schematics": ^9.0.3 "@nestjs/serve-static": ^3.0.0 - "@nestjs/testing": ^9.1.4 + "@nestjs/testing": ^9.2.1 + "@nestjs/throttler": ^3.1.0 "@nestjs/typeorm": ^9.0.1 "@types/bcrypt": ^5.0.0 - "@types/cors": ^2.8.12 - "@types/ms": ^0.7.31 + "@types/cors": ^2.8.13 "@types/multer": ^1.4.7 - "@types/node": ^18.8.4 - "@types/passport-jwt": ^3.0.7 + "@types/node": ^18.11.17 + "@types/passport-jwt": ^3.0.8 "@types/passport-local": ^1.0.34 "@types/passport-strategy": ^0.2.35 "@types/sharp": ^0.31.0 "@types/supertest": ^2.0.12 - "@typescript-eslint/eslint-plugin": ^5.40.0 - "@typescript-eslint/parser": ^5.40.0 + "@typescript-eslint/eslint-plugin": ^5.47.0 + "@typescript-eslint/parser": ^5.47.0 bcrypt: ^5.1.0 bmp-img: ^1.2.1 cors: ^2.8.5 - eslint: ^8.25.0 + eslint: ^8.30.0 eslint-config-prettier: ^8.5.0 eslint-plugin-prettier: ^4.2.1 file-type: ^18.0.0 + is-docker: ^3.0.0 ms: ^2.1.3 + node-fetch: ^3.2.10 p-timeout: ^6.0.0 passport: ^0.6.0 passport-headerapikey: ^1.2.2 - passport-jwt: ^4.0.0 + passport-jwt: ^4.0.1 passport-local: ^1.0.0 passport-strategy: ^1.0.0 pg: ^8.8.0 picsur-shared: "*" posix.js: ^0.1.1 - prettier: ^2.7.1 - qoi-img: ^2.1.0 + prettier: ^2.8.1 + qoi-img: ^2.1.1 reflect-metadata: ^0.1.13 rimraf: ^3.0.2 - rxjs: ^7.5.7 - sharp: ^0.31.1 + rxjs: ^7.8.0 + sharp: ^0.31.3 source-map-support: ^0.5.21 stream-parser: ^0.3.1 thunks: ^4.9.6 - ts-loader: ^9.4.1 + ts-loader: ^9.4.2 ts-node: ^10.9.1 - tsconfig-paths: ^4.1.0 - typeorm: 0.3.10 - typescript: 4.8.4 - zod: ^3.19.1 + tsconfig-paths: ^4.1.1 + typeorm: 0.3.11 + typescript: ^4.9.4 + zod: ^3.20.2 languageName: unknown linkType: soft @@ -8584,30 +9618,34 @@ __metadata: version: 0.0.0-use.local resolution: "picsur-frontend@workspace:frontend" dependencies: - "@angular-builders/custom-webpack": ^14.0.1 - "@angular-devkit/build-angular": 14.2.5 - "@angular/animations": ^14.2.5 - "@angular/cdk": ^14.2.4 - "@angular/cli": ^14.2.5 - "@angular/common": ^14.2.5 - "@angular/compiler": ^14.2.5 - "@angular/compiler-cli": ^14.2.5 - "@angular/core": ^14.2.5 - "@angular/forms": ^14.2.5 - "@angular/material": ^14.2.4 - "@angular/platform-browser": ^14.2.5 - "@angular/platform-browser-dynamic": ^14.2.5 - "@angular/router": ^14.2.5 + "@angular-builders/custom-webpack": ^15.0.0 + "@angular-devkit/build-angular": ^15.0.4 + "@angular/animations": ^15.0.4 + "@angular/cdk": ^15.0.3 + "@angular/cli": ^15.0.4 + "@angular/common": ^15.0.4 + "@angular/compiler": ^15.0.4 + "@angular/compiler-cli": ^15.0.4 + "@angular/core": ^15.0.4 + "@angular/forms": ^15.0.4 + "@angular/material": ^15.0.3 + "@angular/platform-browser": ^15.0.4 + "@angular/platform-browser-dynamic": ^15.0.4 + "@angular/router": ^15.0.4 "@fontsource/material-icons": ^4.5.4 "@fontsource/material-icons-outlined": ^4.5.4 "@fontsource/roboto": ^4.5.8 - "@ng-web-apis/common": ^2.0.1 + "@ng-web-apis/common": ^2.1.0 "@ng-web-apis/resize-observer": ^2.0.0 "@ngui/common": ^1.0.0 - "@types/node": ^18.8.4 + "@types/ackee-tracker": ^5.0.2 + "@types/node": ^18.11.17 "@types/resize-observer-browser": ^0.1.7 - "@types/validator": ^13.7.7 - bootstrap: ^5.2.2 + "@types/validator": ^13.7.10 + ackee-tracker: ^5.1.0 + axios: ^1.2.1 + bootstrap: ^5.2.3 + caniuse-lite: ^1.0.30001441 fuse.js: ^6.6.2 jwt-decode: ^3.1.2 moment: ^2.29.4 @@ -8617,11 +9655,12 @@ __metadata: ngx-moment: ^6.0.2 picsur-shared: "*" reflect-metadata: ^0.1.13 - rxjs: ~7.5.7 - tslib: ^2.4.0 - typescript: 4.8.4 - zod: ^3.19.1 - zone.js: ~0.11.8 + rxjs: ^7.8.0 + tslib: ^2.4.1 + typescript: ^4.9.4 + webpack-bundle-analyzer: ^4.7.0 + zod: ^3.20.2 + zone.js: ^0.12.0 languageName: unknown linkType: soft @@ -8629,20 +9668,13 @@ __metadata: version: 0.0.0-use.local resolution: "picsur-shared@workspace:shared" dependencies: - "@types/node": ^18.8.4 - tsc-watch: ^5.0.3 - typescript: 4.8.4 - zod: ^3.19.1 + "@types/node": ^18.11.17 + tsc-watch: ^6.0.0 + typescript: ^4.9.4 + zod: ^3.20.2 languageName: unknown linkType: soft -"pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -8712,6 +9744,13 @@ __metadata: languageName: node linkType: hard +"platform@npm:^1.3.6": + version: 1.3.6 + resolution: "platform@npm:1.3.6" + checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + languageName: node + linkType: hard + "pluralize@npm:8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -8722,218 +9761,11 @@ __metadata: "posix.js@npm:^0.1.1": version: 0.1.1 resolution: "posix.js@npm:0.1.1" - dependencies: - bindings: ^1.5.0 - node-addon-api: ^5.0.0 - node-gyp: latest - checksum: 2b941b3b3e5b8dd5061e33d48da17e9b47454cfde93c8d911b6453f59081ba17afcd80639514c55038f87eb9c22f0fbba9515b4e97593fba7c71a7a11b365e06 - languageName: node - linkType: hard - -"postcss-attribute-case-insensitive@npm:^5.0.2": - version: 5.0.2 - resolution: "postcss-attribute-case-insensitive@npm:5.0.2" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: c0b8139f37e68dba372724cba03a53c30716224f0085f98485cada99489beb7c3da9d598ffc1d81519b59d9899291712c9041c250205e6ec0b034bb2c144dcf9 - languageName: node - linkType: hard - -"postcss-clamp@npm:^4.1.0": - version: 4.1.0 - resolution: "postcss-clamp@npm:4.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4.6 - checksum: 118eec936b3b035dc8d75c89973408f15c5a3de3d1ee210a2b3511e3e431d9c56e6f354b509a90540241e2225ffe3caaa2fdf25919c63348ce4583a28ada642c - languageName: node - linkType: hard - -"postcss-color-functional-notation@npm:^4.2.4": - version: 4.2.4 - resolution: "postcss-color-functional-notation@npm:4.2.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: b763e164fe3577a1de96f75e4bf451585c4f80b8ce60799763a51582cc9402d76faed57324a5d5e5556d90ca7ea0ebde565acb820c95e04bee6f36a91b019831 - languageName: node - linkType: hard - -"postcss-color-hex-alpha@npm:^8.0.4": - version: 8.0.4 - resolution: "postcss-color-hex-alpha@npm:8.0.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4 - checksum: a2f3173a60176cf0aea3b7ebbc799b2cb08229127f0fff708fa31efa14e4ded47ca49aff549d8ed92e74ffe24adee32d5b9d557dbde0524fde5fe389bc520b4e - languageName: node - linkType: hard - -"postcss-color-rebeccapurple@npm:^7.1.1": - version: 7.1.1 - resolution: "postcss-color-rebeccapurple@npm:7.1.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 03482f9b8170da0fa014c41a5d88bce7b987471fb73fc456d397222a2455c89ac7f974dd6ddf40fd31907e768aad158057164b7c5f62cee63a6ecf29d47d7467 - languageName: node - linkType: hard - -"postcss-custom-media@npm:^8.0.2": - version: 8.0.2 - resolution: "postcss-custom-media@npm:8.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.3 - checksum: 887bbbacf6f8fab688123796e5dc1e8283b99f21e4c674235bd929dc8018c50df8634ea08932033ec93baaca32670ef2b87e6632863e0b4d84847375dbde9366 - languageName: node - linkType: hard - -"postcss-custom-properties@npm:^12.1.8": - version: 12.1.8 - resolution: "postcss-custom-properties@npm:12.1.8" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4 - checksum: 4615b8181fe61c2df9f3a739b3257a9d76d00088c8fc3c502a59de52b25ab90be3d65ece8d372bcd1f9f8ba6bb99da5075707f9f11cb3522826a5d3553265ee5 - languageName: node - linkType: hard - -"postcss-custom-selectors@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-custom-selectors@npm:6.0.3" - dependencies: - postcss-selector-parser: ^6.0.4 - peerDependencies: - postcss: ^8.3 - checksum: 18080d60a8a77a76d8ddff185104d65418fffd02bbf9824499f807ced7941509ba63828ab8fe3ec1d6b0d6c72a482bb90a79d79cdef58e5f4b30113cca16e69b - languageName: node - linkType: hard - -"postcss-dir-pseudo-class@npm:^6.0.5": - version: 6.0.5 - resolution: "postcss-dir-pseudo-class@npm:6.0.5" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 7810c439d8d1a9072c00f8ab39261a1492873ad170425745bd2819c59767db2f352f906588fc2a7d814e91117900563d7e569ecd640367c7332b26b9829927ef - languageName: node - linkType: hard - -"postcss-double-position-gradients@npm:^3.1.2": - version: 3.1.2 - resolution: "postcss-double-position-gradients@npm:3.1.2" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: ca09bf2aefddc180f1c1413f379eef30d492b8147543413f7251216f23f413c394b2ed10b7cd255e87b18e0c8efe36087ea8b9bfb26a09813f9607a0b8e538b6 - languageName: node - linkType: hard - -"postcss-env-function@npm:^4.0.6": - version: 4.0.6 - resolution: "postcss-env-function@npm:4.0.6" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4 - checksum: 645b2363cfa21be9dcce7fe4a0f172f0af70c00d6a4c1eb3d7ff7e9cfe26d569e291ec2533114d77b12d610023cd168a92d62c38f2fc969fa333b5ae2bff5ffe - languageName: node - linkType: hard - -"postcss-focus-visible@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-focus-visible@npm:6.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - checksum: acd010b9ddef9b86ffb5fa604c13515ba83e18bc5118dad0a1281150f412aa0ece056c2c5ac56b55e2599f53ab0f740f5ebfdc51e1f5cfe43b8130bac0096fcc - languageName: node - linkType: hard - -"postcss-focus-within@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-focus-within@npm:5.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - checksum: f23d8ab757345a6deaa807d76e10c88caf4b771c38b60e1593b24aee161c503b5823620e89302226a6ae5e7afdb6ac31809241291912e4176eb594a7ddcc9521 - languageName: node - linkType: hard - -"postcss-font-variant@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-font-variant@npm:5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: a19286589261c2bc3e20470486e1ee3b4daf34271c5020167f30856c9b30c26f23264307cb97a184d503814e1b8c5d8a1f9f64a14fd4fd9551c173dca9424695 - languageName: node - linkType: hard - -"postcss-gap-properties@npm:^3.0.5": - version: 3.0.5 - resolution: "postcss-gap-properties@npm:3.0.5" - peerDependencies: - postcss: ^8.2 - checksum: aed559d6d375203a08a006c9ae8cf5ae90d9edaec5cadd20fe65c1b8ce63c2bc8dfe752d4331880a6e24a300541cde61058be790b7bd9b5d04d470c250fbcd39 - languageName: node - linkType: hard - -"postcss-image-set-function@npm:^4.0.7": - version: 4.0.7 - resolution: "postcss-image-set-function@npm:4.0.7" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 7e509330986de14250ead1a557e8da8baaf66ebe8a40354a5dff60ab40d99a483d92aa57d52713251ca1adbf0055ef476c5702b0d0ba5f85a4f407367cdabac0 - languageName: node - linkType: hard - -"postcss-import@npm:15.0.0": - version: 15.0.0 - resolution: "postcss-import@npm:15.0.0" - dependencies: - postcss-value-parser: ^4.0.0 - read-cache: ^1.0.0 - resolve: ^1.1.7 - peerDependencies: - postcss: ^8.0.0 - checksum: e5048072514f33520348c0c5aaedb5db92da72188e72a7367c26a8d851b9cf92e56aeda30d9c7b4ed1a34f84a58959da1b4b27b4aa23d41fc0ce36efe00bf1d1 - languageName: node - linkType: hard - -"postcss-initial@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-initial@npm:4.0.1" - peerDependencies: - postcss: ^8.0.0 - checksum: 6956953853865de79c39d11533a2860e9f38b770bb284d0010d98a00b9469e22de344e4e5fd8208614d797030487e8918dd2f2c37d9e24d4dd59d565d4fc3e12 - languageName: node - linkType: hard - -"postcss-lab-function@npm:^4.2.1": - version: 4.2.1 - resolution: "postcss-lab-function@npm:4.2.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 26ac74b430011271b5581beba69b2cd788f56375fcb64c90f6ec1577379af85f6022dc38c410ff471dac520c7ddc289160a6a16cca3c7ff76f5af7e90d31eaa3 + dependencies: + bindings: ^1.5.0 + node-addon-api: ^5.0.0 + node-gyp: latest + checksum: 2b941b3b3e5b8dd5061e33d48da17e9b47454cfde93c8d911b6453f59081ba17afcd80639514c55038f87eb9c22f0fbba9515b4e97593fba7c71a7a11b365e06 languageName: node linkType: hard @@ -8951,24 +9783,6 @@ __metadata: languageName: node linkType: hard -"postcss-logical@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-logical@npm:5.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 17c71291ed6a03883a5aa54b9923b874c32710707d041a0f0752e6febdb09dee5d2abf4ef271978d932e4a4c948f349bb23edf633c03e3427ba15e71bfc66ac7 - languageName: node - linkType: hard - -"postcss-media-minmax@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-media-minmax@npm:5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 2cd7283e07a1ac1acdcc3ecbaa0e9932f8d1e7647e7aeb14d91845fcb890d60d7257ec70c825cae8d48ae80a08cc77ebc4021a0dfa32360e0cd991e2bc021607 - languageName: node - linkType: hard - "postcss-modules-extract-imports@npm:^3.0.0": version: 3.0.0 resolution: "postcss-modules-extract-imports@npm:3.0.0" @@ -9013,147 +9827,7 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^10.1.10": - version: 10.1.10 - resolution: "postcss-nesting@npm:10.1.10" - dependencies: - "@csstools/selector-specificity": ^2.0.0 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: fffaf42aaa1f7cc9c381c6be9c0b6a69a50ed1a5f0fc21a430bdb501ce1eb3767a6b6ed981ea830e62c29ce7c32b5180b91d99b6eeca755309131c95af025eed - languageName: node - linkType: hard - -"postcss-opacity-percentage@npm:^1.1.2": - version: 1.1.2 - resolution: "postcss-opacity-percentage@npm:1.1.2" - checksum: b582f6d4efb6a14aa09ba49869774c2f060558a68af8a0c3aa9efc0e01b35a4985e783640806a76d4e26d2ba97556f9b5e88dde91d1664a2e2c24688e4bbcf61 - languageName: node - linkType: hard - -"postcss-overflow-shorthand@npm:^3.0.4": - version: 3.0.4 - resolution: "postcss-overflow-shorthand@npm:3.0.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 74009022491e3901263f8f5811630393480323e51f5d23ef17f3fdc7e03bf9c2502a632f3ba8fe6a468b57590f13b2fa3b17a68ef19653589e76277607696743 - languageName: node - linkType: hard - -"postcss-page-break@npm:^3.0.4": - version: 3.0.4 - resolution: "postcss-page-break@npm:3.0.4" - peerDependencies: - postcss: ^8 - checksum: a7d08c945fc691f62c77ac701e64722218b14ec5c8fc1972b8af9c21553492d40808cf95e61b9697b1dacaf7e6180636876d7fee314f079e6c9e39ac1b1edc6f - languageName: node - linkType: hard - -"postcss-place@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-place@npm:7.0.5" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 903fec0c313bb7ec20f2c8f0a125866fb7804aa3186b5b2c7c2d58cb9039ff301461677a060e9db643d1aaffaf80a0ff71e900a6da16705dad6b49c804cb3c73 - languageName: node - linkType: hard - -"postcss-preset-env@npm:7.8.0": - version: 7.8.0 - resolution: "postcss-preset-env@npm:7.8.0" - dependencies: - "@csstools/postcss-cascade-layers": ^1.0.5 - "@csstools/postcss-color-function": ^1.1.1 - "@csstools/postcss-font-format-keywords": ^1.0.1 - "@csstools/postcss-hwb-function": ^1.0.2 - "@csstools/postcss-ic-unit": ^1.0.1 - "@csstools/postcss-is-pseudo-class": ^2.0.7 - "@csstools/postcss-nested-calc": ^1.0.0 - "@csstools/postcss-normalize-display-values": ^1.0.1 - "@csstools/postcss-oklab-function": ^1.1.1 - "@csstools/postcss-progressive-custom-properties": ^1.3.0 - "@csstools/postcss-stepped-value-functions": ^1.0.1 - "@csstools/postcss-text-decoration-shorthand": ^1.0.0 - "@csstools/postcss-trigonometric-functions": ^1.0.2 - "@csstools/postcss-unset-value": ^1.0.2 - autoprefixer: ^10.4.8 - browserslist: ^4.21.3 - css-blank-pseudo: ^3.0.3 - css-has-pseudo: ^3.0.4 - css-prefers-color-scheme: ^6.0.3 - cssdb: ^7.0.0 - postcss-attribute-case-insensitive: ^5.0.2 - postcss-clamp: ^4.1.0 - postcss-color-functional-notation: ^4.2.4 - postcss-color-hex-alpha: ^8.0.4 - postcss-color-rebeccapurple: ^7.1.1 - postcss-custom-media: ^8.0.2 - postcss-custom-properties: ^12.1.8 - postcss-custom-selectors: ^6.0.3 - postcss-dir-pseudo-class: ^6.0.5 - postcss-double-position-gradients: ^3.1.2 - postcss-env-function: ^4.0.6 - postcss-focus-visible: ^6.0.4 - postcss-focus-within: ^5.0.4 - postcss-font-variant: ^5.0.0 - postcss-gap-properties: ^3.0.5 - postcss-image-set-function: ^4.0.7 - postcss-initial: ^4.0.1 - postcss-lab-function: ^4.2.1 - postcss-logical: ^5.0.4 - postcss-media-minmax: ^5.0.0 - postcss-nesting: ^10.1.10 - postcss-opacity-percentage: ^1.1.2 - postcss-overflow-shorthand: ^3.0.4 - postcss-page-break: ^3.0.4 - postcss-place: ^7.0.5 - postcss-pseudo-class-any-link: ^7.1.6 - postcss-replace-overflow-wrap: ^4.0.0 - postcss-selector-not: ^6.0.1 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 7c07f6ecc776dc8063bfffbb8e44b88730cde0c8951c9960263c38bdb0c5103ace41f34b01eac0ff4861b00384e44ff450f7861f34072a50850afb862af4d6a8 - languageName: node - linkType: hard - -"postcss-pseudo-class-any-link@npm:^7.1.6": - version: 7.1.6 - resolution: "postcss-pseudo-class-any-link@npm:7.1.6" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 43aa18ea1ef1b168f61310856dd92f46ceb3dc60b6cf820e079ca1a849df5cc0f12a1511bdc1811a23f03d60ddcc959200c80c3f9a7b57feebe32bab226afb39 - languageName: node - linkType: hard - -"postcss-replace-overflow-wrap@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-replace-overflow-wrap@npm:4.0.0" - peerDependencies: - postcss: ^8.0.3 - checksum: 3ffe20b300a4c377a11c588b142740d8557e03c707474c45234c934190ac374750ddc92c7906c373471d273a20504a429c2062c21fdcaff830fb28e0a81ac1dc - languageName: node - linkType: hard - -"postcss-selector-not@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-selector-not@npm:6.0.1" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: fe523a0219e4bd34f04498534bb9e8aec3193f3585eafe4c388d086955b41201cae71fd20980ca465acade7f182029b43dbd5ca7e9d50bf34bbcaf1d19fe3ee6 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.9": +"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": version: 6.0.10 resolution: "postcss-selector-parser@npm:6.0.10" dependencies: @@ -9163,21 +9837,32 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f languageName: node linkType: hard -"postcss@npm:8.4.16, postcss@npm:^8.2.14, postcss@npm:^8.3.7, postcss@npm:^8.4.7": - version: 8.4.16 - resolution: "postcss@npm:8.4.16" +"postcss@npm:8.4.19": + version: 8.4.19 + resolution: "postcss@npm:8.4.19" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 62782723a385f92b7525f66d29614624de7c5643855423db3a5efd9287e677650300192749adddbbb6734cea9b1d5f5fd4f6ea00ca3f9a95dbbb88f835f5ca64 + languageName: node + linkType: hard + +"postcss@npm:^8.2.14, postcss@npm:^8.3.7, postcss@npm:^8.4.19": + version: 8.4.20 + resolution: "postcss@npm:8.4.20" dependencies: nanoid: ^3.3.4 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 10eee25efd77868036403858577da0cefaf2e0905feeaba5770d5438ccdddba3d01cba8063e96b8aac4c6daa0ed413dd5ae0554a433a3c4db38df1d134cffc1f + checksum: 1a5609ea1c1b204f9c2974a0019ae9eef2d99bf645c2c9aac675166c4cb1005be7b5e2ba196160bc771f5d9ac896ed883f236f888c891e835e59d28fff6651aa languageName: node linkType: hard @@ -9262,12 +9947,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.7.1": - version: 2.7.1 - resolution: "prettier@npm:2.7.1" +"prettier@npm:^2.8.1": + version: 2.8.1 + resolution: "prettier@npm:2.8.1" bin: prettier: bin-prettier.js - checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b + checksum: 4f21a0f1269f76fb36f54e9a8a1ea4c11e27478958bf860661fb4b6d7ac69aac1581f8724fa98ea3585e56d42a2ea317a17ff6e3324f40cb11ff9e20b73785cc languageName: node linkType: hard @@ -9278,13 +9963,20 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^2.0.0, proc-log@npm:^2.0.1": +"proc-log@npm:^2.0.1": version: 2.0.1 resolution: "proc-log@npm:2.0.1" checksum: f6f23564ff759097db37443e6e2765af84979a703d2c52c1b9df506ee9f87caa101ba49d8fdc115c1a313ec78e37e8134704e9069e6a870f3499d98bb24c436f languageName: node linkType: hard +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -9326,6 +10018,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + "prr@npm:~1.0.1": version: 1.0.1 resolution: "prr@npm:1.0.1" @@ -9361,13 +10060,13 @@ __metadata: languageName: node linkType: hard -"qoi-img@npm:^2.1.0": - version: 2.1.0 - resolution: "qoi-img@npm:2.1.0" +"qoi-img@npm:^2.1.1": + version: 2.1.1 + resolution: "qoi-img@npm:2.1.1" dependencies: bindings: ^1.5.0 - node-gyp: ^9.1.0 - checksum: 25765bde47148f220479db14a15b7b78664f343a7c138876762bfb4140516aafef22ea489e2a71eec581c5d538e4d910de5611768b8c2eadea497cbba4bd7a88 + node-gyp: ^9.3.0 + checksum: 7962cd0027b5337d3293d327f62fc8df48f9e0a07410228674f52e387500df6a9f28508473e531b33ac6b83f29fe6c7bedf95d0a1adcf6ab25b7d59470af3975 languageName: node linkType: hard @@ -9436,34 +10135,25 @@ __metadata: languageName: node linkType: hard -"read-cache@npm:^1.0.0": - version: 1.0.0 - resolution: "read-cache@npm:1.0.0" - dependencies: - pify: ^2.3.0 - checksum: cffc728b9ede1e0667399903f9ecaf3789888b041c46ca53382fa3a06303e5132774dc0a96d0c16aa702dbac1ea0833d5a868d414f5ab2af1e1438e19e6657c6 - languageName: node - linkType: hard - -"read-package-json-fast@npm:^2.0.3": - version: 2.0.3 - resolution: "read-package-json-fast@npm:2.0.3" +"read-package-json-fast@npm:^3.0.0": + version: 3.0.2 + resolution: "read-package-json-fast@npm:3.0.2" dependencies: - json-parse-even-better-errors: ^2.3.0 - npm-normalize-package-bin: ^1.0.1 - checksum: fca37b3b2160b9dda7c5588b767f6a2b8ce68d03a044000e568208e20bea0cf6dd2de17b90740ce8da8b42ea79c0b3859649dadf29510bbe77224ea65326a903 + json-parse-even-better-errors: ^3.0.0 + npm-normalize-package-bin: ^3.0.0 + checksum: 8d406869f045f1d76e2a99865a8fd1c1af9c1dc06200b94d2b07eef87ed734b22703a8d72e1cd36ea36cc48e22020bdd187f88243c7dd0563f72114d38c17072 languageName: node linkType: hard -"read-package-json@npm:^5.0.0": - version: 5.0.1 - resolution: "read-package-json@npm:5.0.1" +"read-package-json@npm:^6.0.0": + version: 6.0.0 + resolution: "read-package-json@npm:6.0.0" dependencies: glob: ^8.0.1 - json-parse-even-better-errors: ^2.3.1 - normalize-package-data: ^4.0.0 - npm-normalize-package-bin: ^1.0.1 - checksum: e8c2ad72df1f17e71268feabdb9bb0153ed2c7d38a05b759c5c49cf368a754bdd3c0e8a279fbc8d707802ff91d2cf144a995e6ebd5534de2848d52ab2c14034d + json-parse-even-better-errors: ^3.0.0 + normalize-package-data: ^5.0.0 + npm-normalize-package-bin: ^3.0.0 + checksum: e2e4bf037918970bdafe29a20039f8f34ae6a4cc540230998f71347f2ed28eebeba5026d69587366df2a8fd5baf84c5304dca5819347b05ea3ed551b82ca1eee languageName: node linkType: hard @@ -9543,12 +10233,12 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.0.1": - version: 10.0.1 - resolution: "regenerate-unicode-properties@npm:10.0.1" +"regenerate-unicode-properties@npm:^10.1.0": + version: 10.1.0 + resolution: "regenerate-unicode-properties@npm:10.1.0" dependencies: regenerate: ^1.4.2 - checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754 + checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17 languageName: node linkType: hard @@ -9559,10 +10249,10 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:0.13.9, regenerator-runtime@npm:^0.13.4": - version: 0.13.9 - resolution: "regenerator-runtime@npm:0.13.9" - checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e +"regenerator-runtime@npm:^0.13.10": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 languageName: node linkType: hard @@ -9589,35 +10279,35 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^5.1.0": - version: 5.1.0 - resolution: "regexpu-core@npm:5.1.0" +"regexpu-core@npm:^5.2.1": + version: 5.2.2 + resolution: "regexpu-core@npm:5.2.2" dependencies: regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.0.1 - regjsgen: ^0.6.0 - regjsparser: ^0.8.2 + regenerate-unicode-properties: ^10.1.0 + regjsgen: ^0.7.1 + regjsparser: ^0.9.1 unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.0.0 - checksum: 7b4eb8d182d9d10537a220a93138df5bc7eaf4ed53e36b95e8427d33ed8a2b081468f1a15d3e5fcee66517e1df7f5ca180b999e046d060badd97150f2ffe87b2 + unicode-match-property-value-ecmascript: ^2.1.0 + checksum: 87c56815e20d213848d38f6b047ba52f0d632f36e791b777f59327e8d350c0743b27cc25feab64c0eadc9fe9959dde6b1261af71108a9371b72c8c26beda05ef languageName: node linkType: hard -"regjsgen@npm:^0.6.0": - version: 0.6.0 - resolution: "regjsgen@npm:0.6.0" - checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348 +"regjsgen@npm:^0.7.1": + version: 0.7.1 + resolution: "regjsgen@npm:0.7.1" + checksum: 7cac399921c58db8e16454869283ff66871531180218064fa938ac05c11c2976792a00706c3c78bbc625e1d793ca373065ea90564e06189a751a7b4ae33acadc languageName: node linkType: hard -"regjsparser@npm:^0.8.2": - version: 0.8.4 - resolution: "regjsparser@npm:0.8.4" +"regjsparser@npm:^0.9.1": + version: 0.9.1 + resolution: "regjsparser@npm:0.9.1" dependencies: jsesc: ~0.5.0 bin: regjsparser: bin/parser - checksum: d069b932491761cda127ce11f6bd2729c3b1b394a35200ec33f1199e937423db28ceb86cf33f0a97c76ecd7c0f8db996476579eaf0d80a1f74c1934f4ca8b27a + checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc languageName: node linkType: hard @@ -9669,7 +10359,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.1, resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.14.2": +"resolve@npm:1.22.1, resolve@npm:^1.1.6, resolve@npm:^1.14.2": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -9682,7 +10372,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.1#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.14.2#~builtin": +"resolve@patch:resolve@1.22.1#~builtin, resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" dependencies: @@ -9755,7 +10445,7 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: - prettier: ^2.7.1 + prettier: ^2.8.1 prettier-plugin-sh: ^0.12.8 languageName: unknown linkType: soft @@ -9785,12 +10475,12 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.5, rxjs@npm:^7.5.7, rxjs@npm:~7.5.7": - version: 7.5.7 - resolution: "rxjs@npm:7.5.7" +"rxjs@npm:^7.5.5, rxjs@npm:^7.8.0": + version: 7.8.0 + resolution: "rxjs@npm:7.8.0" dependencies: tslib: ^2.1.0 - checksum: edabcdb73b0f7e0f5f6e05c2077aff8c52222ac939069729704357d6406438acca831c24210db320aba269e86dbe1a400f3769c89101791885121a342fb15d9c + checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 languageName: node linkType: hard @@ -9831,15 +10521,22 @@ __metadata: languageName: node linkType: hard -"sass-loader@npm:13.0.2": - version: 13.0.2 - resolution: "sass-loader@npm:13.0.2" +"safevalues@npm:^0.3.4": + version: 0.3.4 + resolution: "safevalues@npm:0.3.4" + checksum: 45f30fbbca4ce17157876e429857a28479a48898c92d7f97924623a32cf5996def99f40ba5e32b244b668576f7e3f908004d21f9ed9d47558aaad4003f51e85c + languageName: node + linkType: hard + +"sass-loader@npm:13.2.0": + version: 13.2.0 + resolution: "sass-loader@npm:13.2.0" dependencies: klona: ^2.0.4 neo-async: ^2.6.2 peerDependencies: fibers: ">= 3.1.0" - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 sass: ^1.3.0 sass-embedded: "*" webpack: ^5.0.0 @@ -9852,41 +10549,30 @@ __metadata: optional: true sass-embedded: optional: true - checksum: 6306712cc75bd4b4260ce67178778c92110089485f358b5956b6b12aba15a55e5c7287154daaf8b32678891df915b7bcda7356991afe8bf08ca7356ed30eb448 + checksum: ed6cdb5f5508e1a8a020d1451160a5e94805d0c2a97be5719c6a44ed28a258b5f37a1478d01b9d545f269367ae91ccb88adc93bd6202bfd609dbe3193228d51e languageName: node linkType: hard -"sass@npm:1.54.4": - version: 1.54.4 - resolution: "sass@npm:1.54.4" +"sass@npm:1.56.1": + version: 1.56.1 + resolution: "sass@npm:1.56.1" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: bb6aead09764de450a02b9a66e4ee538f0ba6bc8f2fc3905c71b2c302b5f47e089b510b86cfa7ef2d4139c210c8abf99fe157e7a5bd356c057f10d29e6c4b44c + checksum: 78e693e5992b149574c95d5adfe39ca3e5b97d80befa11191a20d1daa41fe201a98ac099beab726cd3095e2d2e7991a2c408ba0fcc3fa9f525879de7eee18dad languageName: node linkType: hard -"sax@npm:>=0.6.0, sax@npm:^1.2.4, sax@npm:~1.2.4": +"sax@npm:>=0.6.0, sax@npm:^1.2.4": version: 1.2.4 resolution: "sax@npm:1.2.4" checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe languageName: node linkType: hard -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" - dependencies: - "@types/json-schema": ^7.0.5 - ajv: ^6.12.4 - ajv-keywords: ^3.5.2 - checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b - languageName: node - linkType: hard - "schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": version: 3.1.1 resolution: "schema-utils@npm:3.1.1" @@ -9924,32 +10610,23 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.0.1": - version: 2.0.1 - resolution: "selfsigned@npm:2.0.1" +"selfsigned@npm:^2.1.1": + version: 2.1.1 + resolution: "selfsigned@npm:2.1.1" dependencies: node-forge: ^1 - checksum: 864e65c2f31ca877bce3ccdaa3bdef5e1e992b63b2a03641e00c24cd305bf2acce093431d1fed2e5ae9f526558db4be5e90baa2b3474c0428fcf7e25cc86ac93 + checksum: aa9ce2150a54838978d5c0aee54d7ebe77649a32e4e690eb91775f71fdff773874a4fbafd0ac73d8ec3b702ff8a395c604df4f8e8868528f36fd6c15076fb43a languageName: node linkType: hard -"semver@npm:7.0.0": - version: 7.0.0 - resolution: "semver@npm:7.0.0" - bin: - semver: bin/semver.js - checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778 - languageName: node - linkType: hard - -"semver@npm:7.3.7, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.3.7 - resolution: "semver@npm:7.3.7" +"semver@npm:7.3.8, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": + version: 7.3.8 + resolution: "semver@npm:7.3.8" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 + checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 languageName: node linkType: hard @@ -10086,20 +10763,20 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.31.1": - version: 0.31.1 - resolution: "sharp@npm:0.31.1" +"sharp@npm:^0.31.3": + version: 0.31.3 + resolution: "sharp@npm:0.31.3" dependencies: color: ^4.2.3 detect-libc: ^2.0.1 node-addon-api: ^5.0.0 node-gyp: latest prebuild-install: ^7.1.1 - semver: ^7.3.7 + semver: ^7.3.8 simple-get: ^4.0.1 tar-fs: ^2.1.1 tunnel-agent: ^0.6.0 - checksum: 42d00c9c6c61e5cf752c29583253782b3d821ee15fc2648c1f59892b94e9bc170a47ee9d138aa0a61c1c2ee9b7573ee54444c857fff887908701c4208710480d + checksum: 29fd1dfbc616c6389f53f366cec342b4353d9f2a37e98952ca273db38dca57dfa0f336322d6d763f0fae876042ead22fd86ffe26d70c32ade2458d421db60d04 languageName: node linkType: hard @@ -10177,6 +10854,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^1.0.7": + version: 1.0.19 + resolution: "sirv@npm:1.0.19" + dependencies: + "@polka/url": ^1.0.0-next.20 + mrmime: ^1.0.0 + totalist: ^1.0.0 + checksum: c943cfc61baf85f05f125451796212ec35d4377af4da90ae8ec1fa23e6d7b0b4d9c74a8fbf65af83c94e669e88a09dc6451ba99154235eead4393c10dda5b07c + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -10246,16 +10934,16 @@ __metadata: languageName: node linkType: hard -"source-map-loader@npm:4.0.0": - version: 4.0.0 - resolution: "source-map-loader@npm:4.0.0" +"source-map-loader@npm:4.0.1": + version: 4.0.1 + resolution: "source-map-loader@npm:4.0.1" dependencies: abab: ^2.0.6 iconv-lite: ^0.6.3 source-map-js: ^1.0.2 peerDependencies: webpack: ^5.72.1 - checksum: 0b169701735bd6a32d66bff84b7475c31066972d717ebef5a24476cc8678cd19c2b8ebe03a7d62ade9586d4f7ba55c17772fdc8d8bc159dcb9315c757a01046e + checksum: 4ddca8b03dc61f406effd4bffe70de4b87fef48bae6f737017b2dabcbc7d609133325be1e73838e9265331de28039111d729fcbb8bce88a6018a816bef510eb1 languageName: node linkType: hard @@ -10276,7 +10964,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.7.4, source-map@npm:^0.7.3": +"source-map@npm:0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 @@ -10374,6 +11062,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^10.0.0": + version: 10.0.1 + resolution: "ssri@npm:10.0.1" + dependencies: + minipass: ^4.0.0 + checksum: f35b147e5e16a3e1c8e3f71a4aaf5b1f7a9eb5559acbba21213c8171827921cecf56d3570118da7ade124776d25ed17d5e4c80eccbb2a083b17ce36dd24c3e5e + languageName: node + linkType: hard + "ssri@npm:^9.0.0": version: 9.0.1 resolution: "ssri@npm:9.0.1" @@ -10422,10 +11119,17 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:^0.1.1": - version: 0.1.2 - resolution: "string-argv@npm:0.1.2" - checksum: 6877bd72af145f6e6eafa932818014a57b2f39225c924562b7fccb50f1fcee73717bbcd5e528fd4d86cec32835c14749c32a9d35f06e0bf96637d1e73158203f +"streamsearch@npm:^1.1.0": + version: 1.1.0 + resolution: "streamsearch@npm:1.1.0" + checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942 + languageName: node + linkType: hard + +"string-argv@npm:^0.3.1": + version: 0.3.1 + resolution: "string-argv@npm:0.3.1" + checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf languageName: node linkType: hard @@ -10505,35 +11209,6 @@ __metadata: languageName: node linkType: hard -"stylus-loader@npm:7.0.0": - version: 7.0.0 - resolution: "stylus-loader@npm:7.0.0" - dependencies: - fast-glob: ^3.2.11 - klona: ^2.0.5 - normalize-path: ^3.0.0 - peerDependencies: - stylus: ">=0.52.4" - webpack: ^5.0.0 - checksum: 3bb09d45901865c7414a33d80b36bc32054fef325cd307d3648a7be5f0eca8ad76b7687aacb31d5e36ad216c6af7fcd92d091c8d08542306db7f87821edec10f - languageName: node - linkType: hard - -"stylus@npm:0.59.0": - version: 0.59.0 - resolution: "stylus@npm:0.59.0" - dependencies: - "@adobe/css-tools": ^4.0.1 - debug: ^4.3.2 - glob: ^7.1.6 - sax: ~1.2.4 - source-map: ^0.7.3 - bin: - stylus: bin/stylus - checksum: 2faf4a5618747c17b7d10854e40efdd43b438a6cf99d197b0231578f5091bfe9313663d846b5666bb37140140420c51606bb127fd877bbf2db46730c01403b01 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -10750,6 +11425,13 @@ __metadata: languageName: node linkType: hard +"tiny-lru@npm:^10.0.0": + version: 10.0.1 + resolution: "tiny-lru@npm:10.0.1" + checksum: 58b5f17a357625335aa3b90ee8c9b3e9abede5c1f46066c73deb129574a205efb112807d6d473909e73f1d874ea99bf14eb5c88223d540eb32ebb5e1ff146689 + languageName: node + linkType: hard + "tiny-lru@npm:^9.0.2": version: 9.0.3 resolution: "tiny-lru@npm:9.0.3" @@ -10799,6 +11481,13 @@ __metadata: languageName: node linkType: hard +"totalist@npm:^1.0.0": + version: 1.1.0 + resolution: "totalist@npm:1.1.0" + checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -10815,9 +11504,9 @@ __metadata: languageName: node linkType: hard -"ts-loader@npm:^9.4.1": - version: 9.4.1 - resolution: "ts-loader@npm:9.4.1" +"ts-loader@npm:^9.4.2": + version: 9.4.2 + resolution: "ts-loader@npm:9.4.2" dependencies: chalk: ^4.1.0 enhanced-resolve: ^5.0.0 @@ -10826,7 +11515,7 @@ __metadata: peerDependencies: typescript: "*" webpack: ^5.0.0 - checksum: b8947f6d396621cc3f6ba8d4c14fa09eba03c4b7eeabbc429481e923a973c244fb80feb44e900f03fc1010755a6bf14fc561c574fb79e324f39b5b6ef1dcca6c + checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 languageName: node linkType: hard @@ -10868,20 +11557,19 @@ __metadata: languageName: node linkType: hard -"tsc-watch@npm:^5.0.3": - version: 5.0.3 - resolution: "tsc-watch@npm:5.0.3" +"tsc-watch@npm:^6.0.0": + version: 6.0.0 + resolution: "tsc-watch@npm:6.0.0" dependencies: cross-spawn: ^7.0.3 node-cleanup: ^2.1.2 ps-tree: ^1.2.0 - string-argv: ^0.1.1 - strip-ansi: ^6.0.0 + string-argv: ^0.3.1 peerDependencies: typescript: "*" bin: - tsc-watch: index.js - checksum: abd63295dd5fda098a45d27912031e6c35a95f1aa20d7a86d6ad1469580400069e6476f2ffd4b88e37886d016443e60b1ae2dbcaf756e324efc67d0fa713fb15 + tsc-watch: dist/lib/tsc-watch.js + checksum: 34e74a703ecb28689d0f6ba311781ff68be47f5f095439654b095f3ea4a5921708fca61b5727e33527639a9a147b42d10bc3fe3595afee92b41b2bacfba06043 languageName: node linkType: hard @@ -10896,7 +11584,7 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:4.1.0, tsconfig-paths@npm:^4.0.0, tsconfig-paths@npm:^4.1.0": +"tsconfig-paths@npm:4.1.0": version: 4.1.0 resolution: "tsconfig-paths@npm:4.1.0" dependencies: @@ -10907,22 +11595,21 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.9.0": - version: 3.14.1 - resolution: "tsconfig-paths@npm:3.14.1" +"tsconfig-paths@npm:^4.0.0, tsconfig-paths@npm:^4.1.0, tsconfig-paths@npm:^4.1.1": + version: 4.1.1 + resolution: "tsconfig-paths@npm:4.1.1" dependencies: - "@types/json5": ^0.0.29 - json5: ^1.0.1 + json5: ^2.2.1 minimist: ^1.2.6 strip-bom: ^3.0.0 - checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + checksum: 3a1c6c8f614370ee648313d71bbde2a3bcdfb7e99ad068b7791d7b04fac78f120021c96ab4ec285ba78469f13fc08317a987fdf0d90ea03f8d47305e25bd29c6 languageName: node linkType: hard -"tslib@npm:2.4.0, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 +"tslib@npm:2.4.1, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1": + version: 2.4.1 + resolution: "tslib@npm:2.4.1" + checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca languageName: node linkType: hard @@ -11075,23 +11762,32 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.7.4": - version: 4.7.4 - resolution: "typescript@npm:4.7.4" +"typescript@npm:~4.8.2": + version: 4.8.4 + resolution: "typescript@npm:4.8.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df + checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A4.7.4#~builtin": - version: 4.7.4 - resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=f456af" +"typescript@patch:typescript@npm%3A~4.8.2#~builtin": + version: 4.8.4 + resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=f456af" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e + checksum: 563a0ef47abae6df27a9a3ab38f75fc681f633ccf1a3502b1108e252e187787893de689220f4544aaf95a371a4eb3141e4a337deb9895de5ac3c1ca76430e5f0 + languageName: node + linkType: hard + +"undici@npm:^5.5.1": + version: 5.14.0 + resolution: "undici@npm:5.14.0" + dependencies: + busboy: ^1.6.0 + checksum: 7a076e44d84b25844b4eb657034437b8b9bb91f17d347de474fdea1d4263ce7ae9406db79cd30de5642519277b4893f43073258bcc8fed420b295da3fdd11b26 languageName: node linkType: hard @@ -11112,10 +11808,10 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.0.0" - checksum: 8fe6a09d9085a625cabcead5d95bdbc1a2d5d481712856092ce0347231e81a60b93a68f1b69e82b3076a07e415a72c708044efa2aa40ae23e2e7b5c99ed4a9ea +"unicode-match-property-value-ecmascript@npm:^2.1.0": + version: 2.1.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" + checksum: 8d6f5f586b9ce1ed0e84a37df6b42fdba1317a05b5df0c249962bd5da89528771e2d149837cad11aa26bcb84c35355cb9f58a10c3d41fa3b899181ece6c85220 languageName: node linkType: hard @@ -11135,6 +11831,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + "unique-slug@npm:^2.0.0": version: 2.0.2 resolution: "unique-slug@npm:2.0.2" @@ -11144,6 +11849,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" @@ -11158,9 +11872,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.5": - version: 1.0.5 - resolution: "update-browserslist-db@npm:1.0.5" +"update-browserslist-db@npm:^1.0.9": + version: 1.0.10 + resolution: "update-browserslist-db@npm:1.0.10" dependencies: escalade: ^3.1.1 picocolors: ^1.0.0 @@ -11168,7 +11882,7 @@ __metadata: browserslist: ">= 4.21.0" bin: browserslist-lint: cli.js - checksum: 7e425fe5dbbebdccf72a84ce70ec47fc74dce561d28f47bc2b84a1c2b84179a862c2261b18ab66a5e73e261c7e2ef9e11c6129112989d4d52e8f75a56bb923f8 + checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 languageName: node linkType: hard @@ -11239,6 +11953,15 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.0 + resolution: "validate-npm-package-name@npm:5.0.0" + dependencies: + builtins: ^5.0.0 + checksum: 5342a994986199b3c28e53a8452a14b2bb5085727691ea7aa0d284a6606b127c371e0925ae99b3f1ef7cc7d2c9de75f52eb61a3d1cc45e39bca1e3a9444cbb4e + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -11274,6 +11997,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.2.1 + resolution: "web-streams-polyfill@npm:3.2.1" + checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -11281,6 +12011,25 @@ __metadata: languageName: node linkType: hard +"webpack-bundle-analyzer@npm:^4.7.0": + version: 4.7.0 + resolution: "webpack-bundle-analyzer@npm:4.7.0" + dependencies: + acorn: ^8.0.4 + acorn-walk: ^8.0.0 + chalk: ^4.1.0 + commander: ^7.2.0 + gzip-size: ^6.0.0 + lodash: ^4.17.20 + opener: ^1.5.2 + sirv: ^1.0.7 + ws: ^7.3.1 + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 4ce3b379c61ce16b2219756843407cc99f2b82cd191f653043f1b705a3e32b3af03834af0dfded98ab852313a892a148bed1a8effaacd6440f028c19f41581f3 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:5.3.3, webpack-dev-middleware@npm:^5.3.1": version: 5.3.3 resolution: "webpack-dev-middleware@npm:5.3.3" @@ -11296,9 +12045,9 @@ __metadata: languageName: node linkType: hard -"webpack-dev-server@npm:4.11.0": - version: 4.11.0 - resolution: "webpack-dev-server@npm:4.11.0" +"webpack-dev-server@npm:4.11.1": + version: 4.11.1 + resolution: "webpack-dev-server@npm:4.11.1" dependencies: "@types/bonjour": ^3.5.9 "@types/connect-history-api-fallback": ^1.3.5 @@ -11323,7 +12072,7 @@ __metadata: p-retry: ^4.5.0 rimraf: ^3.0.2 schema-utils: ^4.0.0 - selfsigned: ^2.0.1 + selfsigned: ^2.1.1 serve-index: ^1.9.1 sockjs: ^0.3.24 spdy: ^4.0.2 @@ -11336,7 +12085,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: b2c7e9810138d0c6fa670a890410a74b29d4dd23d428e92e61e0233c542689f57caf9b31c031fbcc772170b6710b0752e81fa9cbc41ac0deefdc32d5749ce08d + checksum: b7601a39ee0f413988259e29a36835b0a68522cfaa161de5b7ec99b3399acdd99d44189add4aaf4a5191258bb130f9cf3e68919324a1955c7557f5fe6ab0d96c languageName: node linkType: hard @@ -11416,6 +12165,43 @@ __metadata: languageName: node linkType: hard +"webpack@npm:5.75.0": + version: 5.75.0 + resolution: "webpack@npm:5.75.0" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^0.0.51 + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/wasm-edit": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + acorn: ^8.7.1 + acorn-import-assertions: ^1.7.6 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.10.0 + es-module-lexer: ^0.9.0 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.1.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.1.3 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" @@ -11455,6 +12241,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^3.0.0": + version: 3.0.0 + resolution: "which@npm:3.0.0" + dependencies: + isexe: ^2.0.0 + bin: + node-which: bin/which.js + checksum: fdcf3cadab414e60b86c6836e7ac9de9273561a8926f57cbc28641b602a771527239ee4d47f2689ed255666f035ba0a0d72390986cc0c4e45344491adc7d0eeb + languageName: node + linkType: hard + "wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -11505,6 +12302,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.3.1": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 + languageName: node + linkType: hard + "ws@npm:^8.4.2": version: 8.8.0 resolution: "ws@npm:8.8.0" @@ -11565,7 +12377,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.0": +"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c @@ -11579,18 +12391,18 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.5.1, yargs@npm:^17.2.1, yargs@npm:^17.3.1": - version: 17.5.1 - resolution: "yargs@npm:17.5.1" +"yargs@npm:17.6.2, yargs@npm:^17.2.1, yargs@npm:^17.3.1": + version: 17.6.2 + resolution: "yargs@npm:17.6.2" dependencies: - cliui: ^7.0.2 + cliui: ^8.0.1 escalade: ^3.1.1 get-caller-file: ^2.0.5 require-directory: ^2.1.1 string-width: ^4.2.3 y18n: ^5.0.5 - yargs-parser: ^21.0.0 - checksum: 00d58a2c052937fa044834313f07910fd0a115dec5ee35919e857eeee3736b21a4eafa8264535800ba8bac312991ce785ecb8a51f4d2cc8c4676d865af1cfbde + yargs-parser: ^21.1.1 + checksum: 47da1b0d854fa16d45a3ded57b716b013b2179022352a5f7467409da5a04a1eef5b3b3d97a2dfc13e8bbe5f2ffc0afe3bc6a4a72f8254e60f5a4bd7947138643 languageName: node linkType: hard @@ -11623,18 +12435,18 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.19.1": - version: 3.19.1 - resolution: "zod@npm:3.19.1" - checksum: 56e420ea5845912324a8fc61833714a2aec84954e418b52660d76502183c6e62fef9447cbfa64349640c5ce190cf2c24267e006bb80f066183e2f3fa9fe11864 +"zod@npm:^3.20.2": + version: 3.20.2 + resolution: "zod@npm:3.20.2" + checksum: 04172f7e9350372684ccd298d4716908edc9113751295b6c4e1b3ea84e2af8997e504b33ba36f4741417bb2a5dc90bfd40501f6b0e7389df10e42a63d6d8366c languageName: node linkType: hard -"zone.js@npm:~0.11.8": - version: 0.11.8 - resolution: "zone.js@npm:0.11.8" +"zone.js@npm:^0.12.0": + version: 0.12.0 + resolution: "zone.js@npm:0.12.0" dependencies: tslib: ^2.3.0 - checksum: ad4a2f4aafce10f5bc3f60213384bb6ee4727de09d87fb77cb8089eecdb44dd5838fd9fa43ac4c351afec142b0e5477a22093928260a486804f70b8cace6c7d3 + checksum: 8efd980442dd11a79837e94de17baef45b27acb82061ac9e204b02b4290379a861c03cc332c5220a94e38f1402e89b306cb6a9e91de77dc7407e88f893abcd25 languageName: node linkType: hard