diff --git a/backend/src/collections/preference-db/preference-defaults.service.ts b/backend/src/collections/preference-db/preference-defaults.service.ts index 59b71e6..2b12e5e 100644 --- a/backend/src/collections/preference-db/preference-defaults.service.ts +++ b/backend/src/collections/preference-db/preference-defaults.service.ts @@ -37,8 +37,12 @@ export class PreferenceDefaultsService { [SysPreference.JwtExpiresIn]: () => this.jwtConfigService.getJwtExpiresIn() ?? '7d', [SysPreference.BCryptStrength]: () => 12, + [SysPreference.RemoveDerivativesAfter]: () => '7d', [SysPreference.SaveDerivatives]: () => true, [SysPreference.AllowEditing]: () => true, + + [SysPreference.ConversionTimeLimit]: () => '10s', + [SysPreference.ConversionMemoryLimit]: () => 512, }; } diff --git a/backend/src/managers/image/image-converter.service.ts b/backend/src/managers/image/image-converter.service.ts index 35dac7b..e668547 100644 --- a/backend/src/managers/image/image-converter.service.ts +++ b/backend/src/managers/image/image-converter.service.ts @@ -1,14 +1,20 @@ import { Injectable } from '@nestjs/common'; +import ms from 'ms'; import { ImageRequestParams } from 'picsur-shared/dist/dto/api/image.dto'; import { - FullMime, SupportedMimeCategory + FullMime, + SupportedMimeCategory } from 'picsur-shared/dist/dto/mimes.dto'; +import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.dto'; import { AsyncFailable, Fail, HasFailed } from 'picsur-shared/dist/types'; +import { SysPreferenceService } from '../../collections/preference-db/sys-preference-db.service'; import { SharpWrapper } from '../../workers/sharp.wrapper'; import { ImageResult } from './imageresult'; @Injectable() export class ImageConverterService { + constructor(private readonly sysPref: SysPreferenceService) {} + public async convert( image: Buffer, sourcemime: FullMime, @@ -41,8 +47,16 @@ export class ImageConverterService { targetmime: FullMime, options: ImageRequestParams, ): AsyncFailable { - const sharpWrapper = new SharpWrapper(); + const [memLimit, timeLimit] = await Promise.all([ + this.sysPref.getNumberPreference(SysPreference.ConversionMemoryLimit), + this.sysPref.getStringPreference(SysPreference.ConversionTimeLimit), + ]); + if (HasFailed(memLimit) || HasFailed(timeLimit)) { + return Fail('Failed to get conversion limits'); + } + const timeLimitMS = ms(timeLimit); + const sharpWrapper = new SharpWrapper(timeLimitMS, memLimit); const hasStarted = await sharpWrapper.start(image, sourcemime); if (HasFailed(hasStarted)) return hasStarted; diff --git a/backend/src/models/constants/syspreferences.const.ts b/backend/src/models/constants/syspreferences.const.ts index 71ff384..c0dc9f0 100644 --- a/backend/src/models/constants/syspreferences.const.ts +++ b/backend/src/models/constants/syspreferences.const.ts @@ -11,7 +11,11 @@ export const SysPreferenceValueTypes: { [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/workers/sharp.wrapper.ts b/backend/src/workers/sharp.wrapper.ts index 41d2e1a..643e592 100644 --- a/backend/src/workers/sharp.wrapper.ts +++ b/backend/src/workers/sharp.wrapper.ts @@ -27,9 +27,6 @@ export class SharpWrapper { private readonly workerID: number = Math.floor(Math.random() * 100000); private readonly logger: Logger = new Logger('SharpWrapper' + this.workerID); - private static readonly PROMISE_TIMEOUT = 10000; - private static readonly INSTANCE_TIMEOUT = 10000; - private static readonly MEMORY_LIMIT = 512; private static readonly WORKER_PATH = path.join( __dirname, './sharp', @@ -38,18 +35,25 @@ export class SharpWrapper { private worker: ChildProcess | null = null; + constructor(private instance_timeout: number, private memory_limit: number) {} + public async start(image: Buffer, mime: FullMime): AsyncFailable { this.worker = fork(SharpWrapper.WORKER_PATH, { serialization: 'advanced', - timeout: SharpWrapper.INSTANCE_TIMEOUT, + timeout: this.instance_timeout, env: { - MEMORY_LIMIT_MB: SharpWrapper.MEMORY_LIMIT.toString(), + MEMORY_LIMIT_MB: this.memory_limit.toString(), + NODE_OPTIONS: '--no-warnings', }, stdio: 'overlapped', }); - this.worker.stdout?.pipe(process.stdout); - this.worker.stderr?.pipe(process.stderr); + this.worker.stdout?.on('data', (data) => { + this.logger.verbose(`Worker log: ${data}`); + }); + this.worker.stderr?.on('data', (data) => { + this.logger.warn(`Worker error: ${data}`); + }); this.worker.on('error', (error) => { this.logger.error(`Worker ${this.workerID} error: ${error}`); @@ -78,7 +82,9 @@ export class SharpWrapper { return hasSent; } - this.logger.verbose(`Worker ${this.workerID} initialized`); + this.logger.verbose( + `Worker ${this.workerID} initialized with ${this.instance_timeout}ms timeout and ${this.memory_limit}MB memory limit`, + ); return true; } @@ -138,10 +144,7 @@ export class SharpWrapper { }, ); - const result = await pTimeout( - finishPromise, - SharpWrapper.PROMISE_TIMEOUT, - ); + const result = await pTimeout(finishPromise, this.instance_timeout); this.logger.verbose( `Worker ${this.workerID} finished in ${result.processingTime}ms`, @@ -167,7 +170,7 @@ export class SharpWrapper { }); }); - await pTimeout(waitReadyPromise, SharpWrapper.PROMISE_TIMEOUT); + await pTimeout(waitReadyPromise, this.instance_timeout); return true; } catch (error) { return Fail(error); diff --git a/frontend/package.json b/frontend/package.json index b3588d7..d9ff54f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,16 +13,16 @@ "watch": "ng build --watch --configuration development" }, "dependencies": { - "@angular/animations": "^14.0.0-next.13", - "@angular/cdk": "^14.0.0-next.10", - "@angular/common": "^14.0.0-next.13", - "@angular/compiler": "^14.0.0-next.13", - "@angular/core": "^14.0.0-next.13", - "@angular/forms": "^14.0.0-next.13", - "@angular/material": "^14.0.0-next.10", - "@angular/platform-browser": "^14.0.0-next.13", - "@angular/platform-browser-dynamic": "^14.0.0-next.13", - "@angular/router": "^14.0.0-next.13", + "@angular/animations": "^14.0.0-next.15", + "@angular/cdk": "^14.0.0-next.12", + "@angular/common": "^14.0.0-next.15", + "@angular/compiler": "^14.0.0-next.15", + "@angular/core": "^14.0.0-next.15", + "@angular/forms": "^14.0.0-next.15", + "@angular/material": "^14.0.0-next.12", + "@angular/platform-browser": "^14.0.0-next.15", + "@angular/platform-browser-dynamic": "^14.0.0-next.15", + "@angular/router": "^14.0.0-next.15", "bootstrap": "^5.1.3", "fuse.js": "^6.5.3", "jwt-decode": "^3.1.2", @@ -36,9 +36,9 @@ "zone.js": "~0.11.5" }, "devDependencies": { - "@angular-devkit/build-angular": "14.0.0-next.9", - "@angular/cli": "^14.0.0-next.9", - "@angular/compiler-cli": "^14.0.0-next.13", + "@angular-devkit/build-angular": "14.0.0-next.12", + "@angular/cli": "^14.0.0-next.12", + "@angular/compiler-cli": "^14.0.0-next.15", "@fontsource/material-icons": "^4.5.4", "@fontsource/material-icons-outlined": "^4.5.4", "@fontsource/roboto": "^4.5.5", diff --git a/frontend/src/app/i18n/sys-pref.i18n.ts b/frontend/src/app/i18n/sys-pref.i18n.ts index 54768b7..8f1979c 100644 --- a/frontend/src/app/i18n/sys-pref.i18n.ts +++ b/frontend/src/app/i18n/sys-pref.i18n.ts @@ -6,7 +6,11 @@ export const SysPreferenceFriendlyNames: { [SysPreference.JwtSecret]: 'JWT Secret', [SysPreference.JwtExpiresIn]: 'JWT Expiry Time', [SysPreference.BCryptStrength]: 'BCrypt Strength', + [SysPreference.RemoveDerivativesAfter]: 'Cached Images Expiry Time', [SysPreference.SaveDerivatives]: 'Cache Trancoded Images', [SysPreference.AllowEditing]: 'Allow images to be edited (e.g. resize)', + + [SysPreference.ConversionTimeLimit]: 'Transcode/Edit Time Limit', + [SysPreference.ConversionMemoryLimit]: 'Transcode/Edit Memory Limit MB', }; diff --git a/shared/src/dto/sys-preferences.dto.ts b/shared/src/dto/sys-preferences.dto.ts index 3e4d13b..f758118 100644 --- a/shared/src/dto/sys-preferences.dto.ts +++ b/shared/src/dto/sys-preferences.dto.ts @@ -7,4 +7,7 @@ export enum SysPreference { SaveDerivatives = 'save_derivatives', RemoveDerivativesAfter = 'remove_derivatives_after', AllowEditing = 'allow_editing', + + ConversionTimeLimit = 'conversion_time_limit', + ConversionMemoryLimit = 'conversion_memory_limit', } diff --git a/yarn.lock b/yarn.lock index 94e9752..916b070 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,23 +25,15 @@ "@angular-devkit/core" "14.0.0-next.12" rxjs "6.6.7" -"@angular-devkit/architect@0.1400.0-next.9": - version "0.1400.0-next.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1400.0-next.9.tgz#97b68b08c4babdfd0467366f5fe761c68198bb44" - integrity sha512-u5rSvPyIU1XolXoyaMcwVFgj+8SvAYwuA0rWttDUi58KQJa5bfga7yVNPUT9thMVMIigEkds9UG2TEf1FWBANA== - dependencies: - "@angular-devkit/core" "14.0.0-next.9" - rxjs "6.6.7" - -"@angular-devkit/build-angular@14.0.0-next.9": - version "14.0.0-next.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-14.0.0-next.9.tgz#d6b274bf635047ec38c863c8af1dfb3c432106ed" - integrity sha512-QZtXGv0fq/GfvZaPFOlE+JM4twI50rpYOrm1Z3+pTZN57/ALrdMZc2z0I2i1YmiMH/v8EoiM1uOmLN4HnDxcPw== +"@angular-devkit/build-angular@14.0.0-next.12": + version "14.0.0-next.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-14.0.0-next.12.tgz#28270cc0dca559481d36ef55d5133558a3831f44" + integrity sha512-GKeXMq2eLoH31f3JZNd2UdkI3m0z/YLKIg6g1kK3bG8cBTayXRCgcyKaIBvCc1nN+DfBduMnTBKBzmaeGl+dXA== dependencies: "@ampproject/remapping" "2.1.2" - "@angular-devkit/architect" "0.1400.0-next.9" - "@angular-devkit/build-webpack" "0.1400.0-next.9" - "@angular-devkit/core" "14.0.0-next.9" + "@angular-devkit/architect" "0.1400.0-next.12" + "@angular-devkit/build-webpack" "0.1400.0-next.12" + "@angular-devkit/core" "14.0.0-next.12" "@babel/core" "7.17.9" "@babel/generator" "7.17.9" "@babel/helper-annotate-as-pure" "7.16.7" @@ -52,7 +44,7 @@ "@babel/runtime" "7.17.9" "@babel/template" "7.16.7" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "14.0.0-next.9" + "@ngtools/webpack" "14.0.0-next.12" ansi-colors "4.1.1" babel-loader "8.2.4" babel-plugin-istanbul "6.1.1" @@ -62,8 +54,8 @@ critters "0.0.16" css-loader "6.7.1" esbuild-wasm "0.14.36" - glob "7.2.0" - https-proxy-agent "5.0.0" + glob "8.0.1" + https-proxy-agent "5.0.1" inquirer "8.2.2" jsonc-parser "3.0.0" karma-source-map-support "1.4.0" @@ -84,9 +76,9 @@ regenerator-runtime "0.13.9" resolve-url-loader "5.0.0" rxjs "6.6.7" - sass "1.50.0" + sass "1.50.1" sass-loader "12.6.0" - semver "7.3.6" + semver "7.3.7" source-map-loader "3.0.1" source-map-support "0.5.21" stylus "0.57.0" @@ -103,12 +95,12 @@ optionalDependencies: esbuild "0.14.36" -"@angular-devkit/build-webpack@0.1400.0-next.9": - version "0.1400.0-next.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1400.0-next.9.tgz#5a65347a00aa9dd4d7b60ac6a3855ef5e0de9f1e" - integrity sha512-O4xzexGG5XiMPBBxYqL602k7TDdOlfVx2mgSRsm6M9Yi7VBzUhErrFOmv9roA8lj5c+vvz8iNpdykiTFgA2+wg== +"@angular-devkit/build-webpack@0.1400.0-next.12": + version "0.1400.0-next.12" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1400.0-next.12.tgz#19c321d13ea92526a2b3414f00e568a9322da1bf" + integrity sha512-PR7e8yQMG0VAdXSHc11xttzT4WKRXxSb10Pe2qQxKubMPpfRiMljoUQ4K39/0zdkiKlNI5XWItk8zA5cwZFU2A== dependencies: - "@angular-devkit/architect" "0.1400.0-next.9" + "@angular-devkit/architect" "0.1400.0-next.12" rxjs "6.6.7" "@angular-devkit/core@13.3.2": @@ -134,18 +126,6 @@ rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@14.0.0-next.9": - version "14.0.0-next.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-14.0.0-next.9.tgz#64e14c132babe43368b50ea0711eba2c950ced5f" - integrity sha512-bw1jmhCMGQK1S/XZ8SB2LGGkGn1j3v9TAkHs3EwM6bBYKSgLPKj9rEnRSz7GArZ+uLU7KVXYWJWxmuWfH0e/LQ== - dependencies: - ajv "8.11.0" - ajv-formats "2.1.1" - fast-json-stable-stringify "2.1.0" - magic-string "0.26.1" - rxjs "6.6.7" - source-map "0.7.3" - "@angular-devkit/schematics-cli@13.3.2": version "13.3.2" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz#50607314ee19828d9bd3fb7cb1e3ab2b480ae934" @@ -180,14 +160,14 @@ ora "5.4.1" rxjs "6.6.7" -"@angular/animations@^14.0.0-next.13": +"@angular/animations@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-14.0.0-next.15.tgz#8418f07878e2e1016bde17191d305200cc648a00" integrity sha512-qXCCAQ9SMLF/1ny9lUvCCSTdMNczcr+f1QkvyrzSgr/yW4rmnj1GA+7DcyqPbA55QFeUXFQKkKosLeOZfgPlKg== dependencies: tslib "^2.3.0" -"@angular/cdk@^14.0.0-next.10": +"@angular/cdk@^14.0.0-next.12": version "14.0.0-next.12" resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-14.0.0-next.12.tgz#7236aa4ec270c15a70fd2ab5201f45bca7317a0b" integrity sha512-cFR3JeZGGKGdSIkG9IjnmWd3+hJbj/oDXSetGuAU5TgL1FaMVnt+TbKQXvvNgF8e7ki4BczZqeAw28a3uWLgSA== @@ -196,7 +176,7 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@^14.0.0-next.9": +"@angular/cli@^14.0.0-next.12": version "14.0.0-next.12" resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-14.0.0-next.12.tgz#c16286e826628f3f6a89b5e1d57a2a282389c689" integrity sha512-HUvXvAz5TUOl0EbE1aIIyk4sR6Dp/HbczNcSqL+V9cg4mp3Obx5EHAUt+dbDNx3/5PoG9yDduU1Q3IuNEKd1KA== @@ -222,14 +202,14 @@ uuid "8.3.2" yargs "17.4.1" -"@angular/common@^14.0.0-next.13": +"@angular/common@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/common/-/common-14.0.0-next.15.tgz#2240b102b0c8db485b01bca41bc99c3ddfcdfa22" integrity sha512-wnZmv2ErUTTRmFc9A22viXoGadQcOFiZz4u7Cw8V3/Hmyx3I+OLmfMDG89mSB1WESxoMD/JEcikgG8T4yXSO7A== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^14.0.0-next.13": +"@angular/compiler-cli@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-14.0.0-next.15.tgz#810397f5f4b73d25200a141d631fc18705322672" integrity sha512-X5M18nEuxsD06fg+RUGqhJxZYabg5Re6kEI3bB7Te/3a7/efJ7ObrGMfqVt1PJLrUw1FrmBaLEAOhp3fqcE61A== @@ -245,49 +225,49 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^14.0.0-next.13": +"@angular/compiler@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-14.0.0-next.15.tgz#810b98605c11be68877d14a35c6f9e7aa568316e" integrity sha512-P0V98X5nkdwlv6/OXHsFUp39ESHSkn5vyHdwKEg3BnvvYGZSFM8tEaIFyuKvr9c30idiVBa7Gta83HodMwXuNg== dependencies: tslib "^2.3.0" -"@angular/core@^14.0.0-next.13": +"@angular/core@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/core/-/core-14.0.0-next.15.tgz#78fd19f4b84bed67f95e373ccd77e8e1c566d45d" integrity sha512-sHowm2FhhaOBYQG7m9v8Xq6pAjvt1WCv+njKrOhsrcs2wjYqVs0IbcdIfu1RpIasrwLPn+nwi3hjMohxt0abPw== dependencies: tslib "^2.3.0" -"@angular/forms@^14.0.0-next.13": +"@angular/forms@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-14.0.0-next.15.tgz#6528cbc8185ea37687d1e85f7686ef375331b883" integrity sha512-/JzHLE9BvpY7F5mHFvsGo/0bPFO/VE9YYM9PaYFm91AapzlZ8e8DIvfl5zsqULiMjJLX0n/mRUN5PjpIHyBmMQ== dependencies: tslib "^2.3.0" -"@angular/material@^14.0.0-next.10": +"@angular/material@^14.0.0-next.12": version "14.0.0-next.12" resolved "https://registry.yarnpkg.com/@angular/material/-/material-14.0.0-next.12.tgz#4ee31763101245f8933856e6259b7c8fc79605d7" integrity sha512-e6k3CoNASHbMeCgW7n5528UKmkQFa6VBCNL7yPsHT5Cnu/6w/tOeSn3QzjH26EOndAv7l5q0OsKZ14gARLFLlg== dependencies: tslib "^2.3.0" -"@angular/platform-browser-dynamic@^14.0.0-next.13": +"@angular/platform-browser-dynamic@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.0.0-next.15.tgz#12c438d5c195bf178ee98f4d0ed0f5c7e682e732" integrity sha512-meEn9qTeWi+fsmiDHTlaMpPqxnXheV9m3dvuUdGxj7FzdxCxdt2ioSx6vDY7ClFNiKlvMZo+kodcTmS0LS4CgA== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^14.0.0-next.13": +"@angular/platform-browser@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-14.0.0-next.15.tgz#5d0ad1d723b58ae0d261549b0c5d95f7ddb06494" integrity sha512-Gq+EDfAIWhHnK+rX+OD6b6CmCwzcnRE4KXUvfyX7ng2G2M4wN3kwFAzF1fMePnfwUzOseqOkZzZs8swPLgDPqQ== dependencies: tslib "^2.3.0" -"@angular/router@^14.0.0-next.13": +"@angular/router@^14.0.0-next.15": version "14.0.0-next.15" resolved "https://registry.yarnpkg.com/@angular/router/-/router-14.0.0-next.15.tgz#a9407aa1705d0738d0b88eef09dd42b3c78dac71" integrity sha512-4tXaEV/WD0pJ1RoPNDJjhrpZBPn1RJIQ5qDYDxvryOw7G+x6wOyL4dUtLO2g8jM5KRnJhfuf76liQFeo+phFkA== @@ -1352,9 +1332,9 @@ stream-wormhole "^1.1.0" "@fastify/static@^5.0.0", fastify-static@^4.7.0, "fastify-static@npm:@fastify/static": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@fastify/static/-/static-5.0.0.tgz#7aa2527148da067f2a550ac4a585c0f6f0a188ec" - integrity sha512-GGltJkO0idXa7yCZ0PfdTZ6qokWDX/vigCvmRpjOU2A3jc93c9p+oHDvHmwHK60hwWoBEGqHjGofVyn3H1CjZg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/@fastify/static/-/static-5.0.1.tgz#6bb6b94c2b51d9fafb06261b79ed5da5038dd5a1" + integrity sha512-0lReUKWVOt2i5i1KoBLYsbcMBthq5eiEoUQrFceoXJkCv+OyA0iLl6hGxcmnMRxLsl/Netrzt1NNOpg4muCcuw== dependencies: content-disposition "^0.5.3" encoding-negotiator "^2.0.1" @@ -1585,10 +1565,10 @@ dependencies: uuid "8.3.2" -"@ngtools/webpack@14.0.0-next.9": - version "14.0.0-next.9" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-14.0.0-next.9.tgz#3806bdf6ff0944e289cdcf74995cd592fa3e086b" - integrity sha512-T9J2RUZOzdLm1j3sLu/17OkPwTloCN9d2hxCbDyWLkjwvFz4DVdEfHtotLQ5KPqhv91nAoEmoCqf96CwKds2qA== +"@ngtools/webpack@14.0.0-next.12": + version "14.0.0-next.12" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-14.0.0-next.12.tgz#6920a8a54abd2a5bc41f671ed4e18d8b3be0502b" + integrity sha512-i2+IT0i9IicplJaesp4ELUbbtKvH0skQeQvpQ9Md9HHj4miKaGnj1eMIbVxQrY2PCPyz2Mxva2iHXSfVCE1N4w== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1861,9 +1841,9 @@ "@types/express" "*" "@types/node@*", "@types/node@^17.0.30": - version "17.0.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.30.tgz#2c6e8512acac70815e8176aa30c38025067880ef" - integrity sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw== + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== "@types/parse-json@^4.0.0": version "4.0.0" @@ -3204,9 +3184,9 @@ css@^3.0.0: source-map-resolve "^0.6.0" cssdb@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.5.0.tgz#61264b71f29c834f09b59cb3e5b43c8226590122" - integrity sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA== + version "6.6.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.0.tgz#e4562e2aaba5b23e7d9e6555ba64298990e1ba96" + integrity sha512-hXoXDYrxmAGNh+vgg39WJArCpFIaU3O2q7ud+bEobQ6Fbl2tjPasl3Wt8MKkxlNQEIZqieh0DBsz92eSKI4ghw== cssesc@^3.0.0: version "3.0.0" @@ -4310,19 +4290,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.2.0, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.1: +glob@8.0.1, glob@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.1.tgz#00308f5c035aa0b2a447cd37ead267ddff1577d3" integrity sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow== @@ -4334,6 +4302,18 @@ glob@^8.0.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4541,15 +4521,7 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5188,7 +5160,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.9.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.9.0.tgz#29c2a989b6c10f32ceccc66ff44059e1490af3e1" integrity sha512-lkcNMUKqdJk96TuIXUidxaPuEg5sJo/+ZyVE2BDFnuZGzwXem7d8582eG8vbu4todLfT14snP6iHriCHXXi5Rw== @@ -6980,10 +6952,10 @@ sass-loader@12.6.0: klona "^2.0.4" neo-async "^2.6.2" -sass@1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" - integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== +sass@1.50.1: + version "1.50.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.1.tgz#e9b078a1748863013c4712d2466ce8ca4e4ed292" + integrity sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -7049,13 +7021,6 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.6: - version "7.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b" - integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w== - dependencies: - lru-cache "^7.4.0" - semver@7.3.7, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -8239,9 +8204,9 @@ wrappy@1: integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= ws@^8.4.2: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== xml2js@^0.4.23: version "0.4.23"