From d72e5781b01120cd3cd9d5523515d6a2d39df2ef Mon Sep 17 00:00:00 2001 From: trivernis Date: Fri, 8 Oct 2021 17:19:54 +0200 Subject: [PATCH 001/183] initial commit --- mediarepo-ui/.browserslistrc | 17 + mediarepo-ui/.editorconfig | 16 + mediarepo-ui/.gitignore | 45 + mediarepo-ui/README.md | 27 + mediarepo-ui/angular.json | 114 + mediarepo-ui/karma.conf.js | 44 + mediarepo-ui/package.json | 39 + mediarepo-ui/src/app/app-routing.module.ts | 10 + mediarepo-ui/src/app/app.component.html | 501 + mediarepo-ui/src/app/app.component.sass | 0 mediarepo-ui/src/app/app.component.spec.ts | 35 + mediarepo-ui/src/app/app.component.ts | 10 + mediarepo-ui/src/app/app.module.ts | 18 + mediarepo-ui/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 + mediarepo-ui/src/environments/environment.ts | 16 + mediarepo-ui/src/favicon.ico | Bin 0 -> 948 bytes mediarepo-ui/src/index.html | 13 + mediarepo-ui/src/main.ts | 12 + mediarepo-ui/src/polyfills.ts | 65 + mediarepo-ui/src/styles.sass | 1 + mediarepo-ui/src/test.ts | 27 + mediarepo-ui/tsconfig.app.json | 15 + mediarepo-ui/tsconfig.json | 30 + mediarepo-ui/tsconfig.spec.json | 18 + mediarepo-ui/yarn.lock | 8025 +++++++++++++++++ 26 files changed, 9101 insertions(+) create mode 100644 mediarepo-ui/.browserslistrc create mode 100644 mediarepo-ui/.editorconfig create mode 100644 mediarepo-ui/.gitignore create mode 100644 mediarepo-ui/README.md create mode 100644 mediarepo-ui/angular.json create mode 100644 mediarepo-ui/karma.conf.js create mode 100644 mediarepo-ui/package.json create mode 100644 mediarepo-ui/src/app/app-routing.module.ts create mode 100644 mediarepo-ui/src/app/app.component.html create mode 100644 mediarepo-ui/src/app/app.component.sass create mode 100644 mediarepo-ui/src/app/app.component.spec.ts create mode 100644 mediarepo-ui/src/app/app.component.ts create mode 100644 mediarepo-ui/src/app/app.module.ts create mode 100644 mediarepo-ui/src/assets/.gitkeep create mode 100644 mediarepo-ui/src/environments/environment.prod.ts create mode 100644 mediarepo-ui/src/environments/environment.ts create mode 100644 mediarepo-ui/src/favicon.ico create mode 100644 mediarepo-ui/src/index.html create mode 100644 mediarepo-ui/src/main.ts create mode 100644 mediarepo-ui/src/polyfills.ts create mode 100644 mediarepo-ui/src/styles.sass create mode 100644 mediarepo-ui/src/test.ts create mode 100644 mediarepo-ui/tsconfig.app.json create mode 100644 mediarepo-ui/tsconfig.json create mode 100644 mediarepo-ui/tsconfig.spec.json create mode 100644 mediarepo-ui/yarn.lock diff --git a/mediarepo-ui/.browserslistrc b/mediarepo-ui/.browserslistrc new file mode 100644 index 0000000..427441d --- /dev/null +++ b/mediarepo-ui/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/mediarepo-ui/.editorconfig b/mediarepo-ui/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/mediarepo-ui/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/mediarepo-ui/.gitignore b/mediarepo-ui/.gitignore new file mode 100644 index 0000000..de51f68 --- /dev/null +++ b/mediarepo-ui/.gitignore @@ -0,0 +1,45 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/mediarepo-ui/README.md b/mediarepo-ui/README.md new file mode 100644 index 0000000..c04b2ee --- /dev/null +++ b/mediarepo-ui/README.md @@ -0,0 +1,27 @@ +# MediarepoUi + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.9. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/mediarepo-ui/angular.json b/mediarepo-ui/angular.json new file mode 100644 index 0000000..82a5114 --- /dev/null +++ b/mediarepo-ui/angular.json @@ -0,0 +1,114 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "yarn" + }, + "newProjectRoot": "projects", + "projects": { + "mediarepo-ui": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "sass" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/mediarepo-ui", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "sass", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.sass" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "mediarepo-ui:build:production" + }, + "development": { + "browserTarget": "mediarepo-ui:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "mediarepo-ui:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "inlineStyleLanguage": "sass", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.sass" + ], + "scripts": [] + } + } + } + } + }, + "defaultProject": "mediarepo-ui" +} diff --git a/mediarepo-ui/karma.conf.js b/mediarepo-ui/karma.conf.js new file mode 100644 index 0000000..6b8ef2c --- /dev/null +++ b/mediarepo-ui/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/mediarepo-ui'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/mediarepo-ui/package.json b/mediarepo-ui/package.json new file mode 100644 index 0000000..2dbf97e --- /dev/null +++ b/mediarepo-ui/package.json @@ -0,0 +1,39 @@ +{ + "name": "mediarepo-ui", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "~12.2.0", + "@angular/common": "~12.2.0", + "@angular/compiler": "~12.2.0", + "@angular/core": "~12.2.0", + "@angular/forms": "~12.2.0", + "@angular/platform-browser": "~12.2.0", + "@angular/platform-browser-dynamic": "~12.2.0", + "@angular/router": "~12.2.0", + "rxjs": "~6.6.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~12.2.9", + "@angular/cli": "~12.2.9", + "@angular/compiler-cli": "~12.2.0", + "@types/jasmine": "~3.8.0", + "@types/node": "^12.11.1", + "jasmine-core": "~3.8.0", + "karma": "~6.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.0.3", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "typescript": "~4.3.5" + } +} diff --git a/mediarepo-ui/src/app/app-routing.module.ts b/mediarepo-ui/src/app/app-routing.module.ts new file mode 100644 index 0000000..0297262 --- /dev/null +++ b/mediarepo-ui/src/app/app-routing.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = []; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/mediarepo-ui/src/app/app.component.html b/mediarepo-ui/src/app/app.component.html new file mode 100644 index 0000000..c28b688 --- /dev/null +++ b/mediarepo-ui/src/app/app.component.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + +
+ + +
+ + + Rocket Ship + + + + + + + + + + {{ title }} app is running! + + + Rocket Ship Smoke + + + +
+ + +

Resources

+

Here are some links to help you get started:

+ + + + +

Next Steps

+

What do you want to do next with your app?

+ + + +
+ + + + + + + + + + + +
+ + +
+
ng generate component xyz
+
ng add @angular/material
+
ng add @angular/pwa
+
ng add _____
+
ng test
+
ng build
+
+ + + + + + + + + Gray Clouds Background + + + +
+ + + + + + + + + + diff --git a/mediarepo-ui/src/app/app.component.sass b/mediarepo-ui/src/app/app.component.sass new file mode 100644 index 0000000..e69de29 diff --git a/mediarepo-ui/src/app/app.component.spec.ts b/mediarepo-ui/src/app/app.component.spec.ts new file mode 100644 index 0000000..5478d30 --- /dev/null +++ b/mediarepo-ui/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'mediarepo-ui'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('mediarepo-ui'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('.content span')?.textContent).toContain('mediarepo-ui app is running!'); + }); +}); diff --git a/mediarepo-ui/src/app/app.component.ts b/mediarepo-ui/src/app/app.component.ts new file mode 100644 index 0000000..5affb51 --- /dev/null +++ b/mediarepo-ui/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.sass'] +}) +export class AppComponent { + title = 'mediarepo-ui'; +} diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts new file mode 100644 index 0000000..b1c6c96 --- /dev/null +++ b/mediarepo-ui/src/app/app.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + AppRoutingModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/mediarepo-ui/src/assets/.gitkeep b/mediarepo-ui/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/mediarepo-ui/src/environments/environment.prod.ts b/mediarepo-ui/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/mediarepo-ui/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/mediarepo-ui/src/environments/environment.ts b/mediarepo-ui/src/environments/environment.ts new file mode 100644 index 0000000..f56ff47 --- /dev/null +++ b/mediarepo-ui/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/mediarepo-ui/src/favicon.ico b/mediarepo-ui/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + MediarepoUi + + + + + + + + diff --git a/mediarepo-ui/src/main.ts b/mediarepo-ui/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/mediarepo-ui/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/mediarepo-ui/src/polyfills.ts b/mediarepo-ui/src/polyfills.ts new file mode 100644 index 0000000..373f538 --- /dev/null +++ b/mediarepo-ui/src/polyfills.ts @@ -0,0 +1,65 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * IE11 requires the following for NgClass support on SVG elements + */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/mediarepo-ui/src/styles.sass b/mediarepo-ui/src/styles.sass new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/mediarepo-ui/src/styles.sass @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/mediarepo-ui/src/test.ts b/mediarepo-ui/src/test.ts new file mode 100644 index 0000000..b4dd603 --- /dev/null +++ b/mediarepo-ui/src/test.ts @@ -0,0 +1,27 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), + { teardown: { destroyAfterEach: true }}, +); + +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/mediarepo-ui/tsconfig.app.json b/mediarepo-ui/tsconfig.app.json new file mode 100644 index 0000000..82d91dc --- /dev/null +++ b/mediarepo-ui/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/mediarepo-ui/tsconfig.json b/mediarepo-ui/tsconfig.json new file mode 100644 index 0000000..6df8283 --- /dev/null +++ b/mediarepo-ui/tsconfig.json @@ -0,0 +1,30 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/mediarepo-ui/tsconfig.spec.json b/mediarepo-ui/tsconfig.spec.json new file mode 100644 index 0000000..092345b --- /dev/null +++ b/mediarepo-ui/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/mediarepo-ui/yarn.lock b/mediarepo-ui/yarn.lock new file mode 100644 index 0000000..3405c14 --- /dev/null +++ b/mediarepo-ui/yarn.lock @@ -0,0 +1,8025 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-1.0.1.tgz#1398e73e567c2a7992df6554c15bb94a89b68ba2" + integrity sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA== + dependencies: + "@jridgewell/resolve-uri" "1.0.0" + sourcemap-codec "1.4.8" + +"@angular-devkit/architect@0.1202.9": + version "0.1202.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.9.tgz#de1bce9bd74e5310232c609c2881e37705b4ad84" + integrity sha512-s2NcFqZjsdYoR0vhJWLCwykF6hG7F0C5fJJs49i6IJMKj5Ai58z7d2IFYvD8nA60paMvjFS14OQ+E/FEEEZ88Q== + dependencies: + "@angular-devkit/core" "12.2.9" + rxjs "6.6.7" + +"@angular-devkit/build-angular@~12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-12.2.9.tgz#9a00ea7cc98781a5eba95aa7c12b3aab4694285b" + integrity sha512-A8yddhGpUnrTcA4WCiUxwklFbfkNMfvlST5CT9VLVjz4MEwwOpdaNmIF39+NMr4XTgOBbP6Bq/t3ciIsB5+/Uw== + dependencies: + "@ampproject/remapping" "1.0.1" + "@angular-devkit/architect" "0.1202.9" + "@angular-devkit/build-optimizer" "0.1202.9" + "@angular-devkit/build-webpack" "0.1202.9" + "@angular-devkit/core" "12.2.9" + "@babel/core" "7.14.8" + "@babel/generator" "7.14.8" + "@babel/helper-annotate-as-pure" "7.14.5" + "@babel/plugin-proposal-async-generator-functions" "7.14.7" + "@babel/plugin-transform-async-to-generator" "7.14.5" + "@babel/plugin-transform-runtime" "7.14.5" + "@babel/preset-env" "7.14.8" + "@babel/runtime" "7.14.8" + "@babel/template" "7.14.5" + "@discoveryjs/json-ext" "0.5.3" + "@jsdevtools/coverage-istanbul-loader" "3.0.5" + "@ngtools/webpack" "12.2.9" + ansi-colors "4.1.1" + babel-loader "8.2.2" + browserslist "^4.9.1" + cacache "15.2.0" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.2" + copy-webpack-plugin "9.0.1" + core-js "3.16.0" + critters "0.0.10" + css-loader "6.2.0" + css-minimizer-webpack-plugin "3.0.2" + esbuild-wasm "0.13.4" + find-cache-dir "3.3.1" + glob "7.1.7" + https-proxy-agent "5.0.0" + inquirer "8.1.2" + karma-source-map-support "1.4.0" + less "4.1.1" + less-loader "10.0.1" + license-webpack-plugin "2.3.20" + loader-utils "2.0.0" + mini-css-extract-plugin "2.2.1" + minimatch "3.0.4" + open "8.2.1" + ora "5.4.1" + parse5-html-rewriting-stream "6.0.1" + piscina "3.1.0" + postcss "8.3.6" + postcss-import "14.0.2" + postcss-loader "6.1.1" + postcss-preset-env "6.7.0" + regenerator-runtime "0.13.9" + resolve-url-loader "4.0.0" + rxjs "6.6.7" + sass "1.36.0" + sass-loader "12.1.0" + semver "7.3.5" + source-map-loader "3.0.0" + source-map-support "0.5.19" + style-loader "3.2.1" + stylus "0.54.8" + stylus-loader "6.1.0" + terser "5.7.1" + terser-webpack-plugin "5.1.4" + text-table "0.2.0" + tree-kill "1.2.2" + tslib "2.3.0" + webpack "5.50.0" + webpack-dev-middleware "5.0.0" + webpack-dev-server "3.11.2" + webpack-merge "5.8.0" + webpack-subresource-integrity "1.5.2" + optionalDependencies: + esbuild "0.13.4" + +"@angular-devkit/build-optimizer@0.1202.9": + version "0.1202.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.9.tgz#45c3c7b45126164151e9ca33d0d668a7464a8720" + integrity sha512-yDR7f2fRWzJdqa7U0eIYu5fCRIae3tcSsYE18UPiV5ypGK3talMIpZ1ibkklr9Nm9SAB6Js1/EdVBGB5jo3R9A== + dependencies: + source-map "0.7.3" + tslib "2.3.0" + typescript "4.3.5" + +"@angular-devkit/build-webpack@0.1202.9": + version "0.1202.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1202.9.tgz#fc0676e0e7f8dae802a8ba3335863feaf1e2b7d8" + integrity sha512-UKVxFTRSyDpQDxM1yk1OJiynhbryrbsy+WgZ/gFcnZcrRGtrpAWOq+uMXfq05zET6CNqpOKBnxy9LSHAwXR5Ig== + dependencies: + "@angular-devkit/architect" "0.1202.9" + rxjs "6.6.7" + +"@angular-devkit/core@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.9.tgz#58f41ca4fea44307d90fb23af605ee06fe3c5552" + integrity sha512-iPHQiga08bbryiVq3QYzwpuq9sNb8CB/MVy65MHJ0fuW1z6RYDeUh1EziitBBUT2d81KWKPO1wQ2DuUoxOg4mg== + dependencies: + ajv "8.6.2" + ajv-formats "2.1.0" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/schematics@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.9.tgz#5dd639f5290b9dcb2e61b0ae167fc5258ec22a51" + integrity sha512-OcMDCdlIxiir8XntrNXdXEPi9/8BRx54oYZeRosr0sJZlz4pPzsHs36t5uX2DURYYMkNNMaBnf2luUIC+77ZsA== + dependencies: + "@angular-devkit/core" "12.2.9" + ora "5.4.1" + rxjs "6.6.7" + +"@angular/animations@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.2.9.tgz#32183c0c42fc68592ccff46c7d9c664dffc5b190" + integrity sha512-duGhAuXw4OtgnWi5KqS/qnnWDtvG3jbPjjalTMhFPHHdUl7p3pJ2sM9WX7Fqp3QPnxBnQ+vdgQYbfUQ7c/g2cA== + dependencies: + tslib "^2.2.0" + +"@angular/cli@~12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.2.9.tgz#03ef8b1ded33e7059690da85cf218c8a2e384f9a" + integrity sha512-aYAb6LkqIpKOZE8Kkhst5NNWpM4W1o1mmPTt6Nm6b/4wVLSC+mDp1IBCJSihDWysDetXA5J3kNJ4R2XnpHpIKw== + dependencies: + "@angular-devkit/architect" "0.1202.9" + "@angular-devkit/core" "12.2.9" + "@angular-devkit/schematics" "12.2.9" + "@schematics/angular" "12.2.9" + "@yarnpkg/lockfile" "1.1.0" + ansi-colors "4.1.1" + debug "4.3.2" + ini "2.0.0" + inquirer "8.1.2" + jsonc-parser "3.0.0" + npm-package-arg "8.1.5" + npm-pick-manifest "6.1.1" + open "8.2.1" + ora "5.4.1" + pacote "11.3.5" + resolve "1.20.0" + semver "7.3.5" + symbol-observable "4.0.0" + uuid "8.3.2" + +"@angular/common@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-12.2.9.tgz#8ccf16e1990c375fb9893a7b464002569900005a" + integrity sha512-V7leBrq80CSJWHWVE3LEL6Z6onP2ibsITY3++86Uddz8AxzfOtNRslbs4/qCWc82nT7CIEn8a28NLP/BdOwNew== + dependencies: + tslib "^2.2.0" + +"@angular/compiler-cli@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-12.2.9.tgz#a7c7292f5bb0324f374f978b9bd5ff34bc67d91a" + integrity sha512-jswNKFm3MNcY4oDO/8HcFLLVxDEcTOyqp9CeKzlbjBKb04Ntjaqpm9CKzlxLOtJJj9BSMHTz1CjE0hSNv76NPg== + dependencies: + "@babel/core" "^7.8.6" + "@babel/types" "^7.8.6" + canonical-path "1.0.0" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + dependency-graph "^0.11.0" + magic-string "^0.25.0" + minimist "^1.2.0" + reflect-metadata "^0.1.2" + semver "^7.0.0" + source-map "^0.6.1" + sourcemap-codec "^1.4.8" + tslib "^2.2.0" + yargs "^17.0.0" + +"@angular/compiler@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.2.9.tgz#f9a9426a1febb01edddedb2f881f8cdf56ff2c23" + integrity sha512-87Qn8HuQ+6ECUnapQxpgIvwuUs6i1oM6lmLSKrYe0/WpIzTabB30eXWCKfvqYrv516cMdrq+nLCIXJx1tPqzSw== + dependencies: + tslib "^2.2.0" + +"@angular/core@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-12.2.9.tgz#66cd2268e479e6a647ad08cac45a9dbb42597736" + integrity sha512-RgUmn0YM4GMcViTEkWxDVGCyz8+subF+98dJie+bwJszATMxRK2TSINEg2X/Y0LgNxpRt4mKzIK2kz62oaDH7g== + dependencies: + tslib "^2.2.0" + +"@angular/forms@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.2.9.tgz#6d39b03413e420d3c3914ac018bc6f6f90ead39a" + integrity sha512-DugLX9h/hmphjdx0wGOp9koEpzFZpcMiYXfYO2rLyzc1NwopAcbSJTCvU+adfShZgh/b5v+7rb5n10JROj/ODw== + dependencies: + tslib "^2.2.0" + +"@angular/platform-browser-dynamic@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.9.tgz#d63918b9566dd53ca4a81c864bc9bc582f510262" + integrity sha512-bBNsq2rrL08IaVCps9j54iu3Xoxf1PkjtbEyP5EqXbjccsF7KDM32+5Cjjf0AwYtzaWbjXPSP7awAXpCCsqSdA== + dependencies: + tslib "^2.2.0" + +"@angular/platform-browser@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-12.2.9.tgz#d95401af5136b182ec4f4262be6e4b84570be8d0" + integrity sha512-moO5Fz4b15EWYQthOaQThmy0gm/d5W/+9RmCiZs2ZHiVjuC358lnFy626VdkZmJ/MLwMwqHpyQS9JhCYOZGOdw== + dependencies: + tslib "^2.2.0" + +"@angular/router@~12.2.0": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-12.2.9.tgz#765d02fd5b8206ba50a296700cc69b0068f6f908" + integrity sha512-Qh7Ugh6N7PIK4+ydRPHiKy8Q3wlB/ieXVyqYgkNfGFZ+QtNHpWgWBUXJuGPnmKk0Yn02EwSPOuPWEHV92rayhw== + dependencies: + tslib "^2.2.0" + +"@assemblyscript/loader@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" + integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" + integrity sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.8" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.8" + "@babel/helpers" "^7.14.8" + "@babel/parser" "^7.14.8" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.8" + "@babel/types" "^7.14.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/core@^7.7.5", "@babel/core@^7.8.6": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" + integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== + dependencies: + "@babel/types" "^7.14.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.14.8", "@babel/generator@^7.15.4", "@babel/generator@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.14.8", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== + dependencies: + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helpers@^7.14.8", "@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.5", "@babel/parser@^7.14.8", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-async-generator-functions@^7.14.7": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" + integrity sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.15.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@7.14.5", "@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.14.5": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== + dependencies: + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== + dependencies: + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + +"@babel/plugin-transform-parameters@^7.14.5", "@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" + integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.14.6": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" + integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.8.tgz#254942f5ca80ccabcfbb2a9f524c74bca574005b" + integrity sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.7" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@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-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.5" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.8" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.15.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" + integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.8.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/template@^7.14.5", "@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.8", "@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4", "@babel/types@^7.8.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@discoveryjs/json-ext@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" + integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== + +"@gar/promisify@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/resolve-uri@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz#3fdf5798f0b49e90155896f6291df186eac06c83" + integrity sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA== + +"@jsdevtools/coverage-istanbul-loader@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" + integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.3" + loader-utils "^2.0.0" + merge-source-map "^1.1.0" + schema-utils "^2.7.0" + +"@ngtools/webpack@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-12.2.9.tgz#e13d815d35e155bea6e2b13f6f54bc3275ed0670" + integrity sha512-IQkzvompjLdWbZ+33crtyVF8huF53C36k1FNFdq3x2j4Kw4ssDd6K9fq3aZpRCK0J8O79HJ5j4QH6ZtWjwajLg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" + integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/git@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.8.2": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" + integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@schematics/angular@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.9.tgz#6787a7b79020fb031e46e59f36767d6579dc5d50" + integrity sha512-IIczXVwegREekub0+bBxOc0dDL7j8p5rG6rB/2btJRR+tg04milP+BkvnQgksmIkW1OcZ5beRSB37R3jY/W/PA== + dependencies: + "@angular-devkit/core" "12.2.9" + "@angular-devkit/schematics" "12.2.9" + jsonc-parser "3.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/component-emitter@^1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" + integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== + +"@types/cookie@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.8": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" + integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/glob@^7.1.1": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/jasmine@~3.8.0": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.8.2.tgz#27ab0aaac29581bcbde5774e1843f90df977078e" + integrity sha512-u5h7dqzy2XpXTzhOzSNQUQpKGFvROF8ElNX9P/TJvsHnTg/JvsAseVsGWQAQQldqanYaM+5kwxW909BBFAUYsg== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*", "@types/node@>=10.0.0": + version "16.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" + integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== + +"@types/node@^12.11.1": + version "12.20.28" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.28.tgz#4b20048c6052b5f51a8d5e0d2acbf63d5a17e1e2" + integrity sha512-cBw8gzxUPYX+/5lugXIPksioBSbE42k0fZ39p+4yRzfYjN6++eq9kAPdlY9qm+MXyfbk9EmvCYAYRn380sF46w== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/webpack-sources@^0.1.5": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.9.tgz#da69b06eb34f6432e6658acb5a6893c55d983920" + integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-formats@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" + integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@8.6.2: + version "8.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.1.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-loader@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" + +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-js@^1.2.0, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.17.3, browserslist@^4.6.4, browserslist@^4.9.1: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== + dependencies: + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" + escalade "^3.1.1" + node-releases "^1.1.77" + picocolors "^0.2.1" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^15.0.5, cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== + +canonical-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" + integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +circular-dependency-plugin@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" + integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.0.1, colord@^2.6: + version "2.8.0" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.8.0.tgz#64fb7aa03de7652b5a39eee50271a104c2783b12" + integrity sha512-kNkVV4KFta3TYQv0bzs4xNwLaeag261pxgzGQSh4cQ1rEhYjcTJfFRP0SDlbhLONg0eSoLzrDd79PosjbltufA== + +colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +copy-anything@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" + integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== + dependencies: + is-what "^3.12.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz#b71d21991599f61a4ee00ba79087b8ba279bbb59" + integrity sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw== + dependencies: + fast-glob "^3.2.5" + glob-parent "^6.0.0" + globby "^11.0.3" + normalize-path "^3.0.0" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.15.0, core-js-compat@^3.16.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.2.tgz#e40c266fbd613948dd8d2d2156345da8ac03c142" + integrity sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ== + dependencies: + browserslist "^4.17.3" + semver "7.0.0" + +core-js@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.0.tgz#1d46fb33720bc1fa7f90d20431f36a5540858986" + integrity sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +critters@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.10.tgz#edd0e962fc5af6c4adb6dbf1a71bae2d3f917000" + integrity sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw== + dependencies: + chalk "^4.1.0" + css "^3.0.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + pretty-bytes "^5.3.0" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" + integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== + +css-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== + dependencies: + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.2.0.tgz#9663d9443841de957a3cb9bcea2eda65b3377071" + integrity sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + 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.1.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz#8fadbdf10128cb40227bff275a4bb47412534245" + integrity sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + p-limit "^3.0.2" + postcss "^8.3.5" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz#359943bf00c5c8e05489f12dd25f3006f2c1cbd2" + integrity sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.0" + postcss-convert-values "^5.0.1" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.2" + postcss-merge-rules "^5.0.2" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.2" + postcss-minify-params "^5.0.1" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.2" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.1" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.2" + postcss-unique-selectors "^5.0.1" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@^5.0.6: + version "5.0.8" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.8.tgz#39ad166256980fcc64faa08c9bb18bb5789ecfa9" + integrity sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg== + dependencies: + cssnano-preset-default "^5.1.4" + is-resolvable "^1.1.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.2, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.857: + version "1.3.862" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz#c1c5d4382449e2c9b0e67fe1652f4fc451d6d8c0" + integrity sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" + integrity sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA== + dependencies: + base64-arraybuffer "0.1.4" + +engine.io@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" + integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + +enhanced-resolve@^5.8.0: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1, errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" + integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== + +esbuild-android-arm64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz#5178a20d2b7aba741a31c19609f9e67b346996b9" + integrity sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA== + +esbuild-darwin-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz#7a3e66c8e1271b650541b25eed65c84f3564a69d" + integrity sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA== + +esbuild-darwin-arm64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz#793feca6032b2a57ef291eb9b2d33768d60a49d6" + integrity sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg== + +esbuild-freebsd-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz#294aec3c2cf4b41fb6900212fc9c33dd8fbbb4a2" + integrity sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw== + +esbuild-freebsd-arm64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz#09fe66c751c12f9b976976b1d83f3de594cb2787" + integrity sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA== + +esbuild-linux-32@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz#a9f0793d7bcc9cef4f4ffa4398c525877fba5839" + integrity sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA== + +esbuild-linux-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz#c0d0b4c9d62e3bbf8bdf2cece37403aa6d60fc2e" + integrity sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ== + +esbuild-linux-arm64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz#1292d97bfa64a08d12728f8a7837bf92776c779b" + integrity sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ== + +esbuild-linux-arm@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz#186cd9b8885ac132b9953a4a0afe668168debd10" + integrity sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA== + +esbuild-linux-mips64le@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz#42049bf72bc586817b4a51cc9e32148d13e5e807" + integrity sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw== + +esbuild-linux-ppc64le@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz#adf1ce2ef2302757c4383887da6ac4dd25be9d4f" + integrity sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q== + +esbuild-openbsd-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz#1c8122101898c52a20c8786935cf3eb7a19b83b4" + integrity sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw== + +esbuild-sunos-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz#4ec95faa14a60f295fe485bebffefff408739337" + integrity sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ== + +esbuild-wasm@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.13.4.tgz#9ae8ec5234cc651b2d74b23d4adac984055cff1c" + integrity sha512-2dN7njr9/2QzKLqbTEgXr73vDbSqffdJMv4EfaMQoy04cej0owbGHH5apPgED0wN9I5e7sBT0/Q81tVy3wQBlA== + +esbuild-windows-32@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz#3182c380487b797b04d0ec2c80c2945666869080" + integrity sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg== + +esbuild-windows-64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz#b9e995f92d81f433a04f33611e603e82f9232e69" + integrity sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q== + +esbuild-windows-arm64@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz#fb239532f07b764d158f4cc787178ef4c6fadb5c" + integrity sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg== + +esbuild@0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.4.tgz#ce2deb56c4fb360938311cbfc67f8e467bb6841b" + integrity sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg== + optionalDependencies: + esbuild-android-arm64 "0.13.4" + esbuild-darwin-64 "0.13.4" + esbuild-darwin-arm64 "0.13.4" + esbuild-freebsd-64 "0.13.4" + esbuild-freebsd-arm64 "0.13.4" + esbuild-linux-32 "0.13.4" + esbuild-linux-64 "0.13.4" + esbuild-linux-arm "0.13.4" + esbuild-linux-arm64 "0.13.4" + esbuild-linux-mips64le "0.13.4" + esbuild-linux-ppc64le "0.13.4" + esbuild-openbsd-64 "0.13.4" + esbuild-sunos-64 "0.13.4" + esbuild-windows-32 "0.13.4" + esbuild-windows-64 "0.13.4" + esbuild-windows-arm64 "0.13.4" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter-asyncresource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" + integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.5: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +follow-redirects@^1.0.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "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.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + 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" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hdr-histogram-js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz#ecb1ff2bcb6181c3e93ff4af9472c28c7e97284e" + integrity sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q== + dependencies: + "@assemblyscript/loader" "^0.10.1" + base64-js "^1.2.0" + pako "^1.0.3" + +hdr-histogram-percentiles-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" + integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@5.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" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +inquirer@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" + integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.3.0" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-core-module@^2.2.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.1, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.3.tgz#974d682037f6d12b15dc55f9a2a5f8f1ea923831" + integrity sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@^3.6.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.9.0.tgz#09a3c8169fe98ec69440476d04a0e4cb4d59e452" + integrity sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ== + +jasmine-core@~3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.8.0.tgz#815399aae5aa5d9beeb1262805f981b99ffc9bf0" + integrity sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg== + +jest-worker@^27.0.2, jest-worker@^27.0.6: + version "27.2.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.5.tgz#ed42865661959488aa020e8a325df010597c36d4" + integrity sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonc-parser@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +karma-chrome-launcher@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-coverage@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-2.0.3.tgz#c10f4711f4cf5caaaa668b1d6f642e7da122d973" + integrity sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g== + dependencies: + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.1" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz#52c489a74d760934a1089bfa5ea4a8fcb84cc28b" + integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== + +karma-jasmine@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-4.0.1.tgz#b99e073b6d99a5196fc4bffc121b89313b0abd82" + integrity sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw== + dependencies: + jasmine-core "^3.6.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + +karma@~6.3.0: + version "6.3.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" + integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.3.0" + mime "^2.5.2" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^3.1.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.28" + yargs "^16.1.1" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +less-loader@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.0.1.tgz#c05aaba68d00400820275f21c2ad87cb9fa9923f" + integrity sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA== + dependencies: + klona "^2.0.4" + +less@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" + integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + +license-webpack-plugin@2.3.20: + version "2.3.20" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz#f51fb674ca31519dbedbe1c7aabc036e5a7f2858" + integrity sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg== + dependencies: + "@types/webpack-sources" "^0.1.5" + webpack-sources "^1.2.0" + +lilconfig@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" + integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@0.25.7, magic-string@^0.25.0: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + +memfs@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.3.0.tgz#4da2d1fc40a04b170a56622c7164c6be2c4cbef2" + integrity sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg== + dependencies: + fs-monkey "1.0.3" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4, mime@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mini-css-extract-plugin@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.1.tgz#a44bbfc8ede9211f31474b91c4e8863bf52dd294" + integrity sha512-A0GBXpz8WIPgh2HfASJ0EeY8grd2dGxmC4R8uTujFJXZY7zFy0nvYSYW6SKCLKlz7y45BdHONfaxZQMIZpeF/w== + dependencies: + schema-utils "^3.1.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" + integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanocolors@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6" + integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ== + +nanoid@^3.1.23, nanoid@^3.1.28: + version "3.1.29" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" + integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2, negotiator@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-napi@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" + integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp-build@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + +node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-package-arg@8.1.5, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== + dependencies: + npm-install-checks "^4.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" + +npm-registry-fetch@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" + integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== + dependencies: + make-fetch-happen "^9.0.1" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/open/-/open-8.2.1.tgz#82de42da0ccbf429bc12d099dad2e0975e14e8af" + integrity sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +ora@5.4.1, ora@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pacote@11.3.5: + version "11.3.5" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" + integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== + dependencies: + "@npmcli/git" "^2.1.0" + "@npmcli/installed-package-contents" "^1.0.6" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.8.2" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^11.0.0" + promise-retry "^2.0.1" + read-package-json-fast "^2.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.1.0" + +pako@^1.0.3: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5-html-rewriting-stream@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" + integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== + dependencies: + parse5 "^6.0.1" + parse5-sax-parser "^6.0.1" + +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5-sax-parser@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" + integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== + dependencies: + parse5 "^6.0.1" + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +piscina@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.1.0.tgz#2333636865b6cb69c5a370bbc499a98cabcf3e04" + integrity sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg== + dependencies: + eventemitter-asyncresource "^1.0.0" + hdr-histogram-js "^2.0.1" + hdr-histogram-percentiles-obj "^3.0.0" + optionalDependencies: + nice-napi "^1.0.2" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88" + integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-convert-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232" + integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import@14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-loader@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.1.1.tgz#58dd0a3accd9bc87cc52eff75244db578d11301a" + integrity sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + semver "^7.3.5" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" + integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== + dependencies: + css-color-names "^1.0.1" + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" + integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + vendors "^1.0.3" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz#7c175c108f06a5629925d698b3c4cf7bd3864ee5" + integrity sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ== + dependencies: + colord "^2.6" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" + integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" + integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" + integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== + dependencies: + browserslist "^4.16.0" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f" + integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.3.0" + +postcss-unique-selectors@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" + integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + uniqs "^2.0.0" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@8.3.6: + version "8.3.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" + integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.15, postcss@^8.3.5: + version "8.3.9" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31" + integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw== + dependencies: + nanoid "^3.1.28" + picocolors "^0.2.1" + source-map-js "^0.6.2" + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-package-json-fast@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.2: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@0.13.9, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url-loader@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.20.0, resolve@^1.1.7, resolve@^1.14.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@6.6.7, rxjs@~6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.2.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.1.0.tgz#b73324622231009da6fba61ab76013256380d201" + integrity sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.36.0.tgz#5912ef9d5d16714171ba11cb17edb274c4bbc07e" + integrity sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" + integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== + +socket.io-parser@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" + integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~4.1.0" + socket.io-adapter "~2.1.0" + socket.io-parser "~4.0.3" + +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +socks-proxy-agent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" + integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== + dependencies: + agent-base "^6.0.2" + debug "^4.3.1" + socks "^2.6.1" + +socks@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" + integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + source-map-js "^0.6.2" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.5, source-map-support@~0.5.19, source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@1.4.8, sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +style-loader@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.2.1.tgz#63cb920ec145c8669e9a50e92961452a1ef5dcde" + integrity sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg== + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +stylus-loader@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-6.1.0.tgz#7a3a719a27cb2b9617896d6da28fda94c3ed9762" + integrity sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw== + dependencies: + fast-glob "^3.2.5" + klona "^2.0.4" + normalize-path "^3.0.0" + +stylus@0.54.8: + version "0.54.8" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svgo@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.7.0.tgz#e164cded22f4408fe4978f082be80159caea1e2d" + integrity sha512-aDLsGkre4fTDCWvolyW+fs8ZJFABpzLXbtdK1y71CKnHzAnpDxKXPj2mNKj+pyOXUCzFHzuxRJ94XOFygOWV3w== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + nanocolors "^0.1.12" + stable "^0.1.8" + +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.2, tar@^6.1.0: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" + integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== + dependencies: + jest-worker "^27.0.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.0" + +terser-webpack-plugin@^5.1.3: + version "5.2.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" + integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== + dependencies: + jest-worker "^27.0.6" + p-limit "^3.1.0" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +terser@^5.7.0, terser@^5.7.2: + version "5.9.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslib@^1.10.0, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.2.0, tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@4.3.5, typescript@~4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + +ua-parser-js@^0.7.28: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" + integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webpack-dev-middleware@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz#0abe825275720e0a339978aea5f0b03b140c1584" + integrity sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw== + dependencies: + colorette "^1.2.2" + mem "^8.1.1" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^3.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.2.0, webpack-sources@^1.3.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d" + integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA== + +webpack-subresource-integrity@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz#e40b6578d3072e2d24104975249c52c66e9a743e" + integrity sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw== + dependencies: + webpack-sources "^1.3.0" + +webpack@5.50.0: + version "5.50.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.50.0.tgz#5562d75902a749eb4d75131f5627eac3a3192527" + integrity sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.0" + es-module-lexer "^0.7.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + 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.2.0" + webpack-sources "^3.2.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0: + version "17.2.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" + integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@~0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.4.tgz#0f70dcf6aba80f698af5735cbb257969396e8025" + integrity sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw== + dependencies: + tslib "^2.0.0" From 69c7ab7ac8ec7be44072d7da108945867c5970da Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 9 Oct 2021 15:14:26 +0200 Subject: [PATCH 002/183] Add repository overview Signed-off-by: trivernis --- mediarepo-ui/.eslintrc.json | 50 + mediarepo-ui/angular.json | 23 +- mediarepo-ui/package.json | 18 +- mediarepo-ui/src-tauri/.gitignore | 4 + mediarepo-ui/src-tauri/Cargo.lock | 3803 +++++++++++++++++ mediarepo-ui/src-tauri/Cargo.toml | 32 + mediarepo-ui/src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes mediarepo-ui/src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes mediarepo-ui/src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes mediarepo-ui/src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes mediarepo-ui/src-tauri/icons/icon.icns | Bin 0 -> 512919 bytes mediarepo-ui/src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes mediarepo-ui/src-tauri/icons/icon.png | Bin 0 -> 14183 bytes mediarepo-ui/src-tauri/rustfmt.toml | 14 + mediarepo-ui/src-tauri/src/build.rs | 3 + mediarepo-ui/src-tauri/src/commands/mod.rs | 1 + mediarepo-ui/src-tauri/src/commands/repo.rs | 59 + mediarepo-ui/src-tauri/src/context.rs | 22 + mediarepo-ui/src-tauri/src/error.rs | 27 + mediarepo-ui/src-tauri/src/main.rs | 24 + mediarepo-ui/src-tauri/src/settings.rs | 47 + mediarepo-ui/src-tauri/tauri.conf.json | 67 + mediarepo-ui/src/app/app-routing.module.ts | 13 +- mediarepo-ui/src/app/app.component-theme.scss | 39 + mediarepo-ui/src/app/app.component.html | 500 --- mediarepo-ui/src/app/app.component.scss | 1 + mediarepo-ui/src/app/app.component.ts | 26 +- mediarepo-ui/src/app/app.module.ts | 36 +- mediarepo-ui/src/app/models/Repository.ts | 7 + .../src/app/pages/home/home.component.html | 1 + .../home/home.component.sass} | 0 .../src/app/pages/home/home.component.spec.ts | 25 + .../src/app/pages/home/home.component.ts | 15 + .../repo-form/repo-form.component.html | 12 + .../repo-form/repo-form.component.scss | 11 + .../repo-form/repo-form.component.spec.ts | 25 + .../repo-form/repo-form.component.ts | 34 + .../repositories/repositories.component.html | 13 + .../repositories/repositories.component.scss | 16 + .../repositories.component.spec.ts | 25 + .../repositories/repositories.component.ts | 32 + .../repository-card.component.html | 7 + .../repository-card.component.scss | 1 + .../repository-card.component.spec.ts | 25 + .../repository-card.component.ts | 26 + .../dataloader/dataloader.service.spec.ts | 16 + .../services/dataloader/dataloader.service.ts | 22 + .../repository/repository.service.spec.ts | 16 + .../services/repository/repository.service.ts | 28 + mediarepo-ui/src/index.html | 5 +- mediarepo-ui/src/styles.sass | 1 - mediarepo-ui/src/styles.scss | 20 + mediarepo-ui/yarn.lock | 2797 +++++++++++- 62 files changed, 7376 insertions(+), 613 deletions(-) create mode 100644 mediarepo-ui/.eslintrc.json create mode 100644 mediarepo-ui/src-tauri/.gitignore create mode 100644 mediarepo-ui/src-tauri/Cargo.lock create mode 100644 mediarepo-ui/src-tauri/Cargo.toml create mode 100644 mediarepo-ui/src-tauri/icons/128x128.png create mode 100644 mediarepo-ui/src-tauri/icons/128x128@2x.png create mode 100644 mediarepo-ui/src-tauri/icons/32x32.png create mode 100644 mediarepo-ui/src-tauri/icons/Square107x107Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square142x142Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square150x150Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square284x284Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square30x30Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square310x310Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square44x44Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square71x71Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/Square89x89Logo.png create mode 100644 mediarepo-ui/src-tauri/icons/StoreLogo.png create mode 100644 mediarepo-ui/src-tauri/icons/icon.icns create mode 100644 mediarepo-ui/src-tauri/icons/icon.ico create mode 100644 mediarepo-ui/src-tauri/icons/icon.png create mode 100644 mediarepo-ui/src-tauri/rustfmt.toml create mode 100644 mediarepo-ui/src-tauri/src/build.rs create mode 100644 mediarepo-ui/src-tauri/src/commands/mod.rs create mode 100644 mediarepo-ui/src-tauri/src/commands/repo.rs create mode 100644 mediarepo-ui/src-tauri/src/context.rs create mode 100644 mediarepo-ui/src-tauri/src/error.rs create mode 100644 mediarepo-ui/src-tauri/src/main.rs create mode 100644 mediarepo-ui/src-tauri/src/settings.rs create mode 100644 mediarepo-ui/src-tauri/tauri.conf.json create mode 100644 mediarepo-ui/src/app/app.component-theme.scss create mode 100644 mediarepo-ui/src/app/app.component.scss create mode 100644 mediarepo-ui/src/app/models/Repository.ts create mode 100644 mediarepo-ui/src/app/pages/home/home.component.html rename mediarepo-ui/src/app/{app.component.sass => pages/home/home.component.sass} (100%) create mode 100644 mediarepo-ui/src/app/pages/home/home.component.spec.ts create mode 100644 mediarepo-ui/src/app/pages/home/home.component.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.html create mode 100644 mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.scss create mode 100644 mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.spec.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repositories.component.html create mode 100644 mediarepo-ui/src/app/pages/repositories/repositories.component.scss create mode 100644 mediarepo-ui/src/app/pages/repositories/repositories.component.spec.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repositories.component.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.html create mode 100644 mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.scss create mode 100644 mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.spec.ts create mode 100644 mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts create mode 100644 mediarepo-ui/src/app/services/dataloader/dataloader.service.spec.ts create mode 100644 mediarepo-ui/src/app/services/dataloader/dataloader.service.ts create mode 100644 mediarepo-ui/src/app/services/repository/repository.service.spec.ts create mode 100644 mediarepo-ui/src/app/services/repository/repository.service.ts delete mode 100644 mediarepo-ui/src/styles.sass create mode 100644 mediarepo-ui/src/styles.scss diff --git a/mediarepo-ui/.eslintrc.json b/mediarepo-ui/.eslintrc.json new file mode 100644 index 0000000..47c17dd --- /dev/null +++ b/mediarepo-ui/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "tsconfig.json" + ], + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended" + ], + "rules": {} + } + ] +} diff --git a/mediarepo-ui/angular.json b/mediarepo-ui/angular.json index 82a5114..7f49e8e 100644 --- a/mediarepo-ui/angular.json +++ b/mediarepo-ui/angular.json @@ -2,7 +2,8 @@ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "cli": { - "packageManager": "yarn" + "packageManager": "yarn", + "defaultCollection": "@angular-eslint/schematics" }, "newProjectRoot": "projects", "projects": { @@ -10,7 +11,7 @@ "projectType": "application", "schematics": { "@schematics/angular:component": { - "style": "sass" + "style": "scss" }, "@schematics/angular:application": { "strict": true @@ -28,13 +29,13 @@ "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "sass", + "inlineStyleLanguage": "scss", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ - "src/styles.sass" + "src/styles.scss" ], "scripts": [] }, @@ -96,16 +97,26 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", - "inlineStyleLanguage": "sass", + "inlineStyleLanguage": "scss", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ - "src/styles.sass" + "./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css", + "src/styles.scss" ], "scripts": [] } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } } } } diff --git a/mediarepo-ui/package.json b/mediarepo-ui/package.json index 2dbf97e..db1d209 100644 --- a/mediarepo-ui/package.json +++ b/mediarepo-ui/package.json @@ -6,28 +6,42 @@ "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development", - "test": "ng test" + "test": "ng test", + "lint": "ng lint", + "tauri": "tauri" }, "private": true, "dependencies": { "@angular/animations": "~12.2.0", + "@angular/cdk": "12.2.9", "@angular/common": "~12.2.0", "@angular/compiler": "~12.2.0", "@angular/core": "~12.2.0", "@angular/forms": "~12.2.0", + "@angular/material": "12.2.9", "@angular/platform-browser": "~12.2.0", "@angular/platform-browser-dynamic": "~12.2.0", "@angular/router": "~12.2.0", + "@tauri-apps/api": "^1.0.0-beta.8", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" }, "devDependencies": { "@angular-devkit/build-angular": "~12.2.9", + "@angular-eslint/builder": "12.5.0", + "@angular-eslint/eslint-plugin": "12.5.0", + "@angular-eslint/eslint-plugin-template": "12.5.0", + "@angular-eslint/schematics": "12.5.0", + "@angular-eslint/template-parser": "12.5.0", "@angular/cli": "~12.2.9", "@angular/compiler-cli": "~12.2.0", + "@tauri-apps/cli": "^1.0.0-beta.10", "@types/jasmine": "~3.8.0", "@types/node": "^12.11.1", + "@typescript-eslint/eslint-plugin": "4.28.2", + "@typescript-eslint/parser": "4.28.2", + "eslint": "^7.26.0", "jasmine-core": "~3.8.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -36,4 +50,4 @@ "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.3.5" } -} +} \ No newline at end of file diff --git a/mediarepo-ui/src-tauri/.gitignore b/mediarepo-ui/src-tauri/.gitignore new file mode 100644 index 0000000..c123704 --- /dev/null +++ b/mediarepo-ui/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +WixTools diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock new file mode 100644 index 0000000..eb49e57 --- /dev/null +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -0,0 +1,3803 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" + +[[package]] +name = "app" +version = "0.1.0" +dependencies = [ + "directories", + "rmp-ipc", + "serde", + "serde_json", + "tauri", + "tauri-build", + "thiserror", + "tokio", + "toml", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + +[[package]] +name = "async-io" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +dependencies = [ + "concurrent-queue", + "futures-lite", + "libc", + "log", + "once_cell", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi", +] + +[[package]] +name = "atk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "attohttpc" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8bda305457262b339322106c776e3fd21df860018e566eb6a5b1aa4b6ae02d" +dependencies = [ + "flate2", + "http", + "log", + "native-tls", + "openssl", + "serde", + "serde_json", + "serde_urlencoded", + "url", + "wildmatch", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" +dependencies = [ + "arrayref", + "arrayvec 0.7.1", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", + "digest", + "rayon", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "memchr", +] + +[[package]] +name = "bumpalo" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "bzip2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cache-padded" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" + +[[package]] +name = "cairo-rs" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9164355c892b026d6257e696dde5f3cb39beb3718297f0f161b562fe2ee3ab86" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c9c3928781e8a017ece15eace05230f04b647457d170d2d9641c94a444ff80" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "cc" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfb" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" +dependencies = [ + "byteorder", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "com" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a30a2b2a013da986dc5cc3eda3d19c0d59d53f835be1b2356eb8d00f000c793" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7606b05842fea68ddcc89e8053b8860ebcb2a0ba8d6abfe3a148e5d5a8d3f0c1" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn", +] + +[[package]] +name = "com_macros_support" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97e9a6d20f4ac8830e309a455d7e9416e65c6af5a97c88c55fbb4c2012e107da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "concurrent-queue" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "const-sha1" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deflate" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users 0.3.5", + "winapi", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users 0.4.0", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.0", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "embed_plist" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99" + +[[package]] +name = "enumflags2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fastrand" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +dependencies = [ + "instant", +] + +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.10", + "winapi", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide 0.4.4", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" + +[[package]] +name = "futures-executor" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +dependencies = [ + "autocfg", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" + +[[package]] +name = "futures-task" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" + +[[package]] +name = "futures-util" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +dependencies = [ + "autocfg", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a453eae5ec10345b3a96ca1b547328bfc94edd40aa95b08f14bb4c35863db140" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590" +dependencies = [ + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "gdk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "pkg-config", + "system-deps 3.2.0", +] + +[[package]] +name = "generator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "winapi", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "gio" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a29d8062af72045518271a2cd98b4e1617ce43f5b4223ad0fb9a0eff8f718c" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys 0.14.0", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac" +dependencies = [ + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "system-deps 1.3.2", + "winapi", +] + +[[package]] +name = "gio-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", + "winapi", +] + +[[package]] +name = "glib" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a930b7208e6e0ab839eea5f65ac2b82109f729621430d47fe905e2e09d33f4" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "once_cell", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1" +dependencies = [ + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "glib-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" +dependencies = [ + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "globset" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" +dependencies = [ + "glib-sys 0.10.1", + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "gobject-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6603bb79ded6ac6f3bac203794383afa8b1d6a8656d34a93a88f0b22826cd46c" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk3-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "html5ever" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "http" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-range" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" + +[[package]] +name = "ico" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804" +dependencies = [ + "byteorder", + "png 0.11.0", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "infer" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +dependencies = [ + "cfb", +] + +[[package]] +name = "inflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" +dependencies = [ + "adler32", +] + +[[package]] +name = "instant" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "javascriptcore-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca9c7d1445bba2889672fbadc16c3d5007bfdcf0a15a18a3a50fe9fab2c7427" +dependencies = [ + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f46ada8a08dcd75a10afae872fbfb51275df4a8ae0d46b8cc7c708f08dd2998" +dependencies = [ + "libc", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "loom" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b9df80a3804094bf49bb29881d18f6f05048db72127e84e09c26fc7c2324f5" +dependencies = [ + "cfg-if 1.0.0", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +dependencies = [ + "cc", + "chrono", + "dirs", + "objc-foundation", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minisign-verify" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db0507fe8e3c68cd62961cf9f87f6c2b21d884d3515a7150a4a3fa9d014e5c12" + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "native-tls" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nb-connect" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" +dependencies = [ + "libc", + "socket2", +] + +[[package]] +name = "ndk" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-glue" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +dependencies = [ + "darling", + "proc-macro-crate 0.1.5", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags", + "cc", + "cfg-if 0.1.10", + "libc", + "void", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "notify-rust" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825e9c9efdcb4d14920f72e2ef329b4dae0219791834c000c42c1475dad341f8" +dependencies = [ + "mac-notification-sys", + "serde", + "winrt-notification", + "zbus", + "zvariant", + "zvariant_derive", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "open" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46b233de7d83bc167fe43ae2dda3b5b84e80e09cceba581e4decb958a4896bf" +dependencies = [ + "pathdiff", + "winapi", +] + +[[package]] +name = "openssl" +version = "0.10.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" + +[[package]] +name = "openssl-sys" +version = "0.9.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_info" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac91020bfed8cc3f8aa450d4c3b5fa1d3373fc091c8a92009f3b27749d5a227" +dependencies = [ + "log", + "serde", + "winapi", +] + +[[package]] +name = "os_pipe" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pango" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc88307d9797976ea62722ff2ec5de3fae279c6e20100ed3f49ca1a4bf3f96" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.10", + "smallvec", + "winapi", +] + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.4", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" + +[[package]] +name = "png" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" +dependencies = [ + "bitflags", + "deflate 0.7.20", + "inflate", + "num-iter", +] + +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags", + "crc32fast", + "deflate 0.8.6", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "polling" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "log", + "wepoll-ffi", + "winapi", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + +[[package]] +name = "proc-macro2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core 0.6.3", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" +dependencies = [ + "libc", +] + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.3", + "redox_syscall 0.2.10", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rfd" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609ed912e110af7d7084b6b17d2a68b25e766208e015a37beba1be3c2d7cbb3b" +dependencies = [ + "block", + "dispatch", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "js-sys", + "lazy_static", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winapi", +] + +[[package]] +name = "rmp" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f55e5fa1446c4d5dd1f5daeed2a4fe193071771a2636274d0d7a3b082aa7ad6" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "rmp-ipc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af495ca346adde10163eb920b52b5a3992fb209b31df58ece4ed0f855661978c" +dependencies = [ + "lazy_static", + "log", + "rmp-serde", + "serde", + "thiserror", + "tokio", + "typemap_rev", +] + +[[package]] +name = "rmp-serde" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723ecff9ad04f4ad92fe1c8ca6c20d2196d9286e9c60727c4cb5511629260e9d" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rust-argon2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustversion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-foundation-sys 0.8.2", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +dependencies = [ + "dtoa", + "itoa", + "serde", + "url", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sharded-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740223c51853f3145fe7c90360d2d4232f2b62e3449489c207eccde818979982" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_child" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6be9f7d5565b1483af3e72975e2dee33879b3b86bd48c0929fccf6585d79e65a" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "siphasher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" + +[[package]] +name = "slab" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" + +[[package]] +name = "smallvec" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e" +dependencies = [ + "bitflags", + "gio-sys 0.10.1", + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "pkg-config", + "system-deps 1.3.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +dependencies = [ + "loom", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared 0.8.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "strum" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" + +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" +dependencies = [ + "strum_macros 0.21.1", +] + +[[package]] +name = "strum_macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "system-deps" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" +dependencies = [ + "heck", + "pkg-config", + "strum 0.18.0", + "strum_macros 0.18.0", + "thiserror", + "toml", + "version-compare 0.0.10", +] + +[[package]] +name = "system-deps" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" +dependencies = [ + "anyhow", + "cfg-expr", + "heck", + "itertools", + "pkg-config", + "strum 0.21.0", + "strum_macros 0.21.1", + "thiserror", + "toml", + "version-compare 0.0.11", +] + +[[package]] +name = "tao" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "core-video-sys", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "glib-sys 0.14.0", + "gtk", + "instant", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "raw-window-handle", + "scopeguard", + "serde", + "unicode-segmentation", + "winapi", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tauri" +version = "1.0.0-beta.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09" +dependencies = [ + "attohttpc", + "base64", + "bincode", + "cfg_aliases", + "dirs-next", + "either", + "embed_plist", + "flate2", + "futures", + "futures-lite", + "glib", + "gtk", + "http", + "ignore", + "minisign-verify", + "notify-rust", + "once_cell", + "open", + "os_info", + "os_pipe", + "percent-encoding", + "rand 0.8.4", + "raw-window-handle", + "rfd", + "semver 1.0.4", + "serde", + "serde_json", + "serde_repr", + "shared_child", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "zip", +] + +[[package]] +name = "tauri-build" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9c9a9bea25b9d6f5845b8662e18447e17218f99860cab37e39e2b57a9fcd49" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1663739ab53e281919676f216fb56a031104d0d2cd1a2dd5b012d279bcdb0ea4" +dependencies = [ + "blake3", + "kuchiki", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "walkdir", + "zstd", +] + +[[package]] +name = "tauri-macros" +version = "1.0.0-beta.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddf9f5868402323f35ef94fa6ab1d5d10b29aea9de598d829723aa1db5693b4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "tauri-codegen", +] + +[[package]] +name = "tauri-runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c52eccfb7f2ce5a09262bdc3671f0f07f637e27f8aa25e5f38145cddcd4e01" +dependencies = [ + "gtk", + "http", + "http-range", + "infer", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "uuid", + "winapi", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fed8dd0a448c303fa764859d6dfa1c746c4f2c6c30a83c162f8bebb12e4af4e" +dependencies = [ + "gtk", + "ico", + "infer", + "png 0.16.8", + "tauri-runtime", + "tauri-utils", + "uuid", + "winapi", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb9b79594f22b6ed0cc8362e0dfde5b7969962de3cd8ca683de702e59e8221b" +dependencies = [ + "html5ever", + "kuchiki", + "phf 0.10.0", + "proc-macro2", + "quote", + "serde", + "serde_json", + "thiserror", + "url", + "zstd", +] + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "rand 0.8.4", + "redox_syscall 0.2.10", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "tendril" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "tinyvec" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "winapi", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-log" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "typemap_rev" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" + +[[package]] +name = "typenum" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" + +[[package]] +name = "web-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e47b7f870883fc21612d2a51b74262f7f2cc5371f1621370817292a35300a9" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys 0.14.0", + "glib", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66ccc9f0cb4de7c3b92376a5bf64e7ddffb33852f092721731a039ec38dda98" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup-sys", + "system-deps 3.2.0", +] + +[[package]] +name = "webview2" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b132bb76313456e93b17037262a030d54c9fe0f11838ef1593f845e3807ef8a" +dependencies = [ + "com", + "once_cell", + "webview2-sys", + "widestring", + "winapi", +] + +[[package]] +name = "webview2-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b7889e893ac4c50d7346356be3ce13a85e56512c38b8fde0526559b8012a4c" +dependencies = [ + "com", + "winapi", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "widestring" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" + +[[package]] +name = "wildmatch" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f5f8d2ea79bf690bbee453fd4a1516ae426e5d5c7215d96cc0c3dc134fc4a0" +dependencies = [ + "const-sha1", + "windows_gen", + "windows_macros", + "windows_reader", +] + +[[package]] +name = "windows_gen" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e6994f42f8481387778cc608407d6703410672d57f32a66009419d7a18aa912" +dependencies = [ + "windows_quote", + "windows_reader", +] + +[[package]] +name = "windows_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cc2357b1b03c19f056cb0e6d06011f80f54beadb4e36aee2ca98493c7cfc3c" +dependencies = [ + "syn", + "windows_gen", + "windows_quote", + "windows_reader", +] + +[[package]] +name = "windows_quote" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cf987b5288c15e1997226848f78f3ed3ef8b78dcfd71a201c8c8684163a7e4d" + +[[package]] +name = "windows_reader" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237b53e8b40766ea7db5da0d8c6c1442d21d0429f0ee7500d7b5688967bd9d7b" + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] + +[[package]] +name = "winrt-notification" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0cc832b8c66c42b3ee6b625c124fe2d0b3ff7fb2cec18b28926e9c4bfdb72da" +dependencies = [ + "strum 0.21.0", + "windows", + "xml-rs", +] + +[[package]] +name = "wry" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9549393a3917b5303277abb0267f8eecf9fd629b25f1c04e5284aa58b61915" +dependencies = [ + "cocoa", + "core-graphics 0.22.2", + "gdk", + "gio", + "glib", + "gtk", + "http", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2", + "webview2-sys", + "winapi", +] + +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + +[[package]] +name = "zbus" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" +dependencies = [ + "async-io", + "byteorder", + "derivative", + "enumflags2", + "fastrand", + "futures", + "nb-connect", + "nix", + "once_cell", + "polling", + "scoped-tls", + "serde", + "serde_repr", + "zbus_macros", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" +dependencies = [ + "proc-macro-crate 0.1.5", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +dependencies = [ + "byteorder", + "bzip2", + "crc32fast", + "flate2", + "thiserror", + "time", +] + +[[package]] +name = "zstd" +version = "0.9.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "zvariant" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1a9373dead84d640ccf5798f2928917e6aa1ab3f130751406bb13e0a9dd9913" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46ee71e0e88747ec582d290dbe98ff7907ff28770c7a35f16da41e5e6f1f4fa3" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml new file mode 100644 index 0000000..9749899 --- /dev/null +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "app" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +default-run = "app" +edition = "2018" +build = "src/build.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.0.0-beta.4" } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.0.0-beta.8", features = ["api-all"] } +rmp-ipc = "0.4.0" +thiserror = "1.0.30" +directories = "4.0.1" +toml = "0.5.8" + +[dependencies.tokio] +version = "1.12.0" +features = ["fs", "io-std", "io-util"] + +[features] +default = [ "custom-protocol" ] +custom-protocol = [ "tauri/custom-protocol" ] diff --git a/mediarepo-ui/src-tauri/icons/128x128.png b/mediarepo-ui/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/128x128@2x.png b/mediarepo-ui/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/Square107x107Logo.png b/mediarepo-ui/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/Square284x284Logo.png b/mediarepo-ui/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/Square30x30Logo.png b/mediarepo-ui/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/Square310x310Logo.png b/mediarepo-ui/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/Square71x71Logo.png b/mediarepo-ui/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 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 z 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�wB40g3N9Va*+ibOpQ4M)?M%VNP`VV%KOQdI}Z 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 literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/icon.ico b/mediarepo-ui/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/mediarepo-ui/src-tauri/icons/icon.png b/mediarepo-ui/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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, + address: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct RepoConfig { + pub listen_address: String, + pub database_path: String, + pub default_file_store: String, +} + +#[tauri::command] +pub async fn get_repositories(context: tauri::State<'_, Context>) -> AppResult> { + let settings = context.settings.read().await; + + Ok(settings.repositories.clone()) +} + +#[tauri::command] +pub async fn add_repository(name: String, path: String, context: tauri::State<'_, Context>) -> AppResult> { + let repo_path = path.clone(); + let path = PathBuf::from(path); + let RepoConfig { listen_address, .. } = read_repo_config(path.join(REPO_CONFIG_FILE)).await?; + + let repo = Repository { + name, + path: Some(repo_path), + address: listen_address, + }; + + let mut repositories = Vec::new(); + { + let mut settings = context.settings.write().await; + settings.repositories.push(repo); + save_settings(&settings)?; + repositories.append(&mut settings.repositories.clone()); + } + + Ok(repositories) +} + +async fn read_repo_config(path: PathBuf) -> AppResult { + let toml_str = fs::read_to_string(path).await?; + let config = toml::from_str(&toml_str)?; + + Ok(config) +} diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs new file mode 100644 index 0000000..9ac5d7d --- /dev/null +++ b/mediarepo-ui/src-tauri/src/context.rs @@ -0,0 +1,22 @@ +use std::sync::Arc; +use rmp_ipc::client::IPCClient; +use tokio::sync::RwLock; +use crate::commands::repo::Repository; +use crate::settings::Settings; + +#[derive(Clone)] +pub struct Context { + pub active_repository: Option, + pub client: Option>, + pub settings: Arc> +} + +impl Context { + pub fn new(settings: Settings) -> Self { + Self { + client: None, + active_repository: None, + settings: Arc::new(RwLock::new(settings)) + } + } +} diff --git a/mediarepo-ui/src-tauri/src/error.rs b/mediarepo-ui/src-tauri/src/error.rs new file mode 100644 index 0000000..ae0e899 --- /dev/null +++ b/mediarepo-ui/src-tauri/src/error.rs @@ -0,0 +1,27 @@ +use std::io::Error; +use serde::Serialize; + +pub type AppResult = Result; + +#[derive(Debug, Serialize)] +pub enum AppError { + Msg(String) +} + +impl From for AppError { + fn from(e: Error) -> Self { + Self::Msg(e.to_string()) + } +} + +impl From for AppError { + fn from(e: toml::de::Error) -> Self { + Self::Msg(format!("Failed to deserialize toml: {:?}", e)) + } +} + +impl From for AppError { + fn from(e: toml::ser::Error) -> Self { + Self::Msg(format!("Failed to serialize to toml: {:?}", e)) + } +} diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs new file mode 100644 index 0000000..380f721 --- /dev/null +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -0,0 +1,24 @@ +#![cfg_attr( + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" +)] + +use crate::commands::repo::{get_repositories, add_repository}; +use crate::context::Context; +use crate::settings::load_settings; + +mod commands; +pub mod context; +pub mod error; +mod settings; + +fn main() { + let settings = load_settings().expect("Failed to load settings"); + let context = Context::new(settings); + + tauri::Builder::default() + .manage(context) + .invoke_handler(tauri::generate_handler![get_repositories, add_repository]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/mediarepo-ui/src-tauri/src/settings.rs b/mediarepo-ui/src-tauri/src/settings.rs new file mode 100644 index 0000000..267b028 --- /dev/null +++ b/mediarepo-ui/src-tauri/src/settings.rs @@ -0,0 +1,47 @@ +use serde::{Serialize, Deserialize}; +use crate::commands::repo::Repository; +use crate::error::AppResult; +use directories::ProjectDirs; +use std::fs; +use std::path::PathBuf; + +static SETTINGS_FILE: &str = "settings.toml"; + +#[derive(Default, Serialize, Deserialize)] +pub struct Settings { + pub repositories: Vec, +} + +fn get_settings_path() -> PathBuf { + let dirs = ProjectDirs::from("com", "trivernis", "mediarepo").unwrap(); + let config_path = dirs.config_dir().to_path_buf(); + + config_path.join(SETTINGS_FILE) +} + +/// Writes the settings to the file +pub fn save_settings(settings: &Settings) -> AppResult<()> { + let settings_path = get_settings_path(); + let settings_string = toml::to_string(&settings)?; + fs::write(&settings_path, &settings_string.into_bytes())?; + + Ok(()) +} + +/// Loads the settings from the file +pub fn load_settings() -> AppResult { + let dirs = ProjectDirs::from("com", "trivernis", "mediarepo").unwrap(); + let config_path = dirs.config_dir().to_path_buf(); + if !config_path.exists() { + fs::create_dir_all(&config_path)?; + } + let settings_path = config_path.join(SETTINGS_FILE); + if !settings_path.exists() { + let settings = Settings::default(); + save_settings(&settings)?; + } + let config_str = fs::read_to_string(settings_path)?; + let settings = toml::from_str(&config_str)?; + + Ok(settings) +} diff --git a/mediarepo-ui/src-tauri/tauri.conf.json b/mediarepo-ui/src-tauri/tauri.conf.json new file mode 100644 index 0000000..57a804c --- /dev/null +++ b/mediarepo-ui/src-tauri/tauri.conf.json @@ -0,0 +1,67 @@ +{ + "package": { + "productName": "mediarepo-ui", + "version": "0.1.0" + }, + "build": { + "distDir": "../dist/mediarepo-ui", + "devPath": "http://localhost:4200", + "beforeDevCommand": "yarn start", + "beforeBuildCommand": "yarn build" + }, + "tauri": { + "bundle": { + "active": true, + "targets": "all", + "identifier": "com.tauri.dev", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "resources": [], + "externalBin": [], + "copyright": "", + "category": "DeveloperTool", + "shortDescription": "", + "longDescription": "", + "deb": { + "depends": [], + "useBootstrapper": false + }, + "macOS": { + "frameworks": [], + "minimumSystemVersion": "", + "useBootstrapper": false, + "exceptionDomain": "", + "signingIdentity": null, + "entitlements": null + }, + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "updater": { + "active": false + }, + "allowlist": { + "all": true + }, + "windows": [ + { + "title": "Mediarepo", + "width": 800, + "height": 600, + "resizable": true, + "fullscreen": false + } + ], + "security": { + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" + } + } +} \ No newline at end of file diff --git a/mediarepo-ui/src/app/app-routing.module.ts b/mediarepo-ui/src/app/app-routing.module.ts index 0297262..7d7e101 100644 --- a/mediarepo-ui/src/app/app-routing.module.ts +++ b/mediarepo-ui/src/app/app-routing.module.ts @@ -1,10 +1,15 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import {NgModule} from '@angular/core'; +import {RouterModule, Routes} from '@angular/router'; +import {RepositoriesComponent} from "./pages/repositories/repositories.component"; +import {HomeComponent} from "./pages/home/home.component"; -const routes: Routes = []; +const routes: Routes = [ + {path: "repositories", component: RepositoriesComponent}, + {path: "", component: HomeComponent}]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) -export class AppRoutingModule { } +export class AppRoutingModule { +} diff --git a/mediarepo-ui/src/app/app.component-theme.scss b/mediarepo-ui/src/app/app.component-theme.scss new file mode 100644 index 0000000..a3bdeac --- /dev/null +++ b/mediarepo-ui/src/app/app.component-theme.scss @@ -0,0 +1,39 @@ +@use 'sass:map'; +@use '~@angular/material' as mat; + +@mixin color($theme) { + $color-config: mat.get-color-config($theme); + $primary-palette: map.get($color-config, 'primary'); + $warn-palette: map.get($color-config, 'warn'); + + body { + background-color: darken(mat.get-color-from-palette($primary-palette, 'darker'), 35); + color: white + } + + .warn { + color: mat.get-color-from-palette($warn-palette); + } +} + +@mixin typography($theme) { + // Get the typography config from the theme. + $typography-config: mat.get-typography-config($theme); + + body { + font-family: mat.font-family($typography-config); + } +} + +@mixin theme($theme) { + $color-config: mat.get-color-config($theme); + @if $color-config != null { + @include color($theme); + } + + $typography-config: mat.get-typography-config($theme); + @if $typography-config != null { + @include typography($theme); + } +} + diff --git a/mediarepo-ui/src/app/app.component.html b/mediarepo-ui/src/app/app.component.html index c28b688..0680b43 100644 --- a/mediarepo-ui/src/app/app.component.html +++ b/mediarepo-ui/src/app/app.component.html @@ -1,501 +1 @@ - - - - - - - - - - - - -

- -
- - -
- - - Rocket Ship - - - - - - - - - - {{ title }} app is running! - - - Rocket Ship Smoke - - - -
- - -

Resources

-

Here are some links to help you get started:

- - - - -

Next Steps

-

What do you want to do next with your app?

- - - -
- - - - - - - - - - - -
- - -
-
ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
-
ng add _____
-
ng test
-
ng build
-
- - - - - - - - - Gray Clouds Background - - - -
- - - - - - - - - diff --git a/mediarepo-ui/src/app/app.component.scss b/mediarepo-ui/src/app/app.component.scss new file mode 100644 index 0000000..42bdf1f --- /dev/null +++ b/mediarepo-ui/src/app/app.component.scss @@ -0,0 +1 @@ +@import "src/styles"; diff --git a/mediarepo-ui/src/app/app.component.ts b/mediarepo-ui/src/app/app.component.ts index 5affb51..299a652 100644 --- a/mediarepo-ui/src/app/app.component.ts +++ b/mediarepo-ui/src/app/app.component.ts @@ -1,10 +1,34 @@ import { Component } from '@angular/core'; +import {Router} from "@angular/router"; +import {RepositoryService} from "./services/repository/repository.service"; +import {DataloaderService} from "./services/dataloader/dataloader.service"; +import {MatSnackBar} from "@angular/material/snack-bar"; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.sass'] + styleUrls: ['./app.component.scss'] }) export class AppComponent { title = 'mediarepo-ui'; + + constructor( + private router: Router, + private snackBar: MatSnackBar, + private dataloaderService: DataloaderService, + private repoService: RepositoryService + ) { + } + + async ngOnInit() { + this.dataloaderService.loaderError.subscribe({ + error: (err) => { + this.snackBar.open(err, undefined, {panelClass: "warn"}) + } + }) + await this.dataloaderService.loadData(); + if (this.repoService.selectedRepository.getValue() == undefined) { + await this.router.navigate(["repositories"]) + } + } } diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index b1c6c96..6fd6c2e 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -3,15 +3,41 @@ import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { RepositoriesComponent } from './pages/repositories/repositories.component'; +import { HomeComponent } from './pages/home/home.component'; +import { RepositoryCardComponent } from './pages/repositories/repository-card/repository-card.component'; +import {MatCardModule} from "@angular/material/card"; +import {MatListModule} from "@angular/material/list"; +import {MatButtonModule} from "@angular/material/button"; +import {MatToolbarModule} from "@angular/material/toolbar"; +import {MatSnackBar, MatSnackBarModule} from "@angular/material/snack-bar"; +import {MatFormFieldModule} from "@angular/material/form-field"; +import {MatInputModule} from "@angular/material/input"; +import {ReactiveFormsModule} from "@angular/forms"; +import { RepoFormComponent } from './pages/repositories/repo-form/repo-form.component'; @NgModule({ declarations: [ - AppComponent - ], - imports: [ - BrowserModule, - AppRoutingModule + AppComponent, + RepositoriesComponent, + HomeComponent, + RepositoryCardComponent, + RepoFormComponent ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/models/Repository.ts b/mediarepo-ui/src/app/models/Repository.ts new file mode 100644 index 0000000..acdce38 --- /dev/null +++ b/mediarepo-ui/src/app/models/Repository.ts @@ -0,0 +1,7 @@ +export class Repository { + constructor( + public name: string, + public address: string, + public secret: string + ) {} +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html new file mode 100644 index 0000000..5f2c53f --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -0,0 +1 @@ +

home works!

diff --git a/mediarepo-ui/src/app/app.component.sass b/mediarepo-ui/src/app/pages/home/home.component.sass similarity index 100% rename from mediarepo-ui/src/app/app.component.sass rename to mediarepo-ui/src/app/pages/home/home.component.sass diff --git a/mediarepo-ui/src/app/pages/home/home.component.spec.ts b/mediarepo-ui/src/app/pages/home/home.component.spec.ts new file mode 100644 index 0000000..2c5a172 --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/home.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HomeComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts new file mode 100644 index 0000000..eccb3e6 --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.sass'] +}) +export class HomeComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.html b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.html new file mode 100644 index 0000000..fbef0d7 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.html @@ -0,0 +1,12 @@ +
+ + Name + + + + Path + + + + +
diff --git a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.scss b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.scss new file mode 100644 index 0000000..05a76f3 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.scss @@ -0,0 +1,11 @@ +#add-button { + margin: 1em +} + +#path-input { + width: 60% +} + +mat-form-field, button { + margin: 0.2em +} diff --git a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.spec.ts b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.spec.ts new file mode 100644 index 0000000..18e4401 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RepoFormComponent } from './repo-form.component'; + +describe('RepoFormComponent', () => { + let component: RepoFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RepoFormComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RepoFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts new file mode 100644 index 0000000..da5d3ed --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl, FormGroup, Validators} from "@angular/forms"; +import {RepositoryService} from "../../../services/repository/repository.service"; +import {MatSnackBar} from "@angular/material/snack-bar"; + +@Component({ + selector: 'app-repo-form', + templateUrl: './repo-form.component.html', + styleUrls: ['./repo-form.component.scss'] +}) +export class RepoFormComponent implements OnInit { + + repoForm = new FormGroup({ + name: new FormControl("", Validators.required), + path: new FormControl("", Validators.required), + }) + + + constructor(private repoService: RepositoryService, private snackBar: MatSnackBar) { } + + ngOnInit(): void { + } + + async addRepository() { + let {name, path} = this.repoForm.value; + try { + await this.repoService.addRepository(name, path); + } catch(err) { + this.snackBar.open(err.Msg, undefined, { + panelClass: "warn" + }) + } + } +} diff --git a/mediarepo-ui/src/app/pages/repositories/repositories.component.html b/mediarepo-ui/src/app/pages/repositories/repositories.component.html new file mode 100644 index 0000000..8e0b7e6 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repositories.component.html @@ -0,0 +1,13 @@ + + Repositories + +
+
+ +
+
+
+ +
+
+
diff --git a/mediarepo-ui/src/app/pages/repositories/repositories.component.scss b/mediarepo-ui/src/app/pages/repositories/repositories.component.scss new file mode 100644 index 0000000..c67c60a --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repositories.component.scss @@ -0,0 +1,16 @@ +@import 'src/styles'; + + +.repository-container { + margin: 1em; +} + +.repo-page-content { + margin: 0 10%; +} + +.add-repo-tools { + margin: 1em 0 +} + + diff --git a/mediarepo-ui/src/app/pages/repositories/repositories.component.spec.ts b/mediarepo-ui/src/app/pages/repositories/repositories.component.spec.ts new file mode 100644 index 0000000..ada2a07 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repositories.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RepositoriesComponent } from './repositories.component'; + +describe('RepositoriesComponent', () => { + let component: RepositoriesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RepositoriesComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RepositoriesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/pages/repositories/repositories.component.ts b/mediarepo-ui/src/app/pages/repositories/repositories.component.ts new file mode 100644 index 0000000..b35dbb3 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repositories.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; +import {Repository} from "../../models/Repository"; +import {RepositoryService} from "../../services/repository/repository.service"; +import {MatSnackBar} from "@angular/material/snack-bar"; +import {FormBuilder, FormGroup} from "@angular/forms"; + +@Component({ + selector: 'app-repositories', + templateUrl: './repositories.component.html', + styleUrls: ['./repositories.component.scss'] +}) +export class RepositoriesComponent implements OnInit { + + repositories: Repository[] = []; + + constructor( + private repoService: RepositoryService, + ) { + } + + ngOnInit(): void { + this.repoService.repositories.subscribe({ + next: (repos) => { + this.repositories = repos; + } + }); + } + + async addRepository() { + + } +} diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.html b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.html new file mode 100644 index 0000000..1c37d9e --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.html @@ -0,0 +1,7 @@ + + {{repository?.name}} + {{repository?.address}} + + + + diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.scss b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.scss new file mode 100644 index 0000000..42bdf1f --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.scss @@ -0,0 +1 @@ +@import "src/styles"; diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.spec.ts b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.spec.ts new file mode 100644 index 0000000..e68dc01 --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RepositoryCardComponent } from './repository-card.component'; + +describe('RepositoryCardComponent', () => { + let component: RepositoryCardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RepositoryCardComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RepositoryCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts new file mode 100644 index 0000000..e88daad --- /dev/null +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts @@ -0,0 +1,26 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {Repository} from "../../../models/Repository"; +import {RepositoryService} from "../../../services/repository/repository.service"; +import {Router} from "@angular/router"; + +@Component({ + selector: 'app-repository-card', + templateUrl: './repository-card.component.html', + styleUrls: ['./repository-card.component.scss'] +}) +export class RepositoryCardComponent implements OnInit { + + @Input() repository?: Repository; + + constructor(private repoService: RepositoryService, private router: Router) {} + + ngOnInit(): void { + } + + async selectRepository() { + if (this.repository) { + this.repoService.setRepository(this.repository); + await this.router.navigate([""]); + } + } +} diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.spec.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.spec.ts new file mode 100644 index 0000000..afedadd --- /dev/null +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DataloaderService } from './dataloader.service'; + +describe('DataloaderService', () => { + let service: DataloaderService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DataloaderService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts new file mode 100644 index 0000000..4e0a1b0 --- /dev/null +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import {RepositoryService} from "../repository/repository.service"; +import {BehaviorSubject} from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class DataloaderService { + + loaderError = new BehaviorSubject(undefined); + + constructor(private repositoryService: RepositoryService) { } + + public async loadData() { + try { + await this.repositoryService.loadRepositories(); + } catch (err) { + this.loaderError.error(err); + console.error(err); + } + } +} diff --git a/mediarepo-ui/src/app/services/repository/repository.service.spec.ts b/mediarepo-ui/src/app/services/repository/repository.service.spec.ts new file mode 100644 index 0000000..9894fbf --- /dev/null +++ b/mediarepo-ui/src/app/services/repository/repository.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RepositoryService } from './repository.service'; + +describe('RepositoryService', () => { + let service: RepositoryService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RepositoryService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts new file mode 100644 index 0000000..0fdf364 --- /dev/null +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import {Repository} from "../../models/Repository"; +import {BehaviorSubject, Observable} from "rxjs"; +import {invoke} from "@tauri-apps/api/tauri"; + +@Injectable({ + providedIn: 'root' +}) +export class RepositoryService { + repositories = new BehaviorSubject([]); + public selectedRepository = new BehaviorSubject(undefined); + + constructor() {} + + public async loadRepositories() { + let repos = await invoke("get_repositories"); + this.repositories.next(repos); + } + + public setRepository(repo: Repository) { + this.selectedRepository.next(repo); + } + + public async addRepository(name: string, path: string) { + let repos = await invoke("add_repository", {name, path}); + this.repositories.next(repos); + } +} diff --git a/mediarepo-ui/src/index.html b/mediarepo-ui/src/index.html index cfb676c..b186a0f 100644 --- a/mediarepo-ui/src/index.html +++ b/mediarepo-ui/src/index.html @@ -6,8 +6,11 @@ + + + - + diff --git a/mediarepo-ui/src/styles.sass b/mediarepo-ui/src/styles.sass deleted file mode 100644 index 90d4ee0..0000000 --- a/mediarepo-ui/src/styles.sass +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/mediarepo-ui/src/styles.scss b/mediarepo-ui/src/styles.scss new file mode 100644 index 0000000..ca508d2 --- /dev/null +++ b/mediarepo-ui/src/styles.scss @@ -0,0 +1,20 @@ +@use 'sass:map'; +@use "~@angular/material" as mat; +@use 'src/app/app.component-theme' as app; +@include mat.core(); + +$theme: mat.define-dark-theme(( + color: ( + primary: mat.define-palette(mat.$deep-purple-palette), + accent: mat.define-palette(mat.$green-palette), + warn: mat.define-palette(mat.$red-palette), + background: mat.define-palette(mat.$grey-palette) + ), + typography: mat.define-typography-config( + $font-family: 'Noto Sans', + ) +)); + +@include mat.all-component-themes($theme); +@include app.theme($theme); + diff --git a/mediarepo-ui/yarn.lock b/mediarepo-ui/yarn.lock index 3405c14..9e06e4f 100644 --- a/mediarepo-ui/yarn.lock +++ b/mediarepo-ui/yarn.lock @@ -133,6 +133,55 @@ ora "5.4.1" rxjs "6.6.7" +"@angular-eslint/builder@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-12.5.0.tgz#e53946ffe9873579ff2a9ce46d3b7e44ea62905d" + integrity sha512-abex1KdqEvUYbJqLkqhEeW4r0DuJPDzlMZYODMyBDDFTcBFYQCzLFUkhIjRNet9Vjto3Y3DbkkFUfS4DEEwjTw== + dependencies: + "@nrwl/devkit" "12.6.0" + +"@angular-eslint/eslint-plugin-template@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.5.0.tgz#9b77647c7d850a956d4e2fc8343230f3076e5892" + integrity sha512-qvgJieWFiK61kyuGPbRWBBmsP2J/bRjYply/aAuqpctnlLnae1/+GCsosWWP/AzOlR2TvHN62j7ZW6GSxTkUOg== + dependencies: + "@typescript-eslint/experimental-utils" "4.28.2" + aria-query "^4.2.2" + axobject-query "^2.2.0" + +"@angular-eslint/eslint-plugin@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-12.5.0.tgz#cb4eca50338bf41398bd62796c1068b937ff53a1" + integrity sha512-BugzzvgghcaxHMvUFQBdu6dwB167CwiTxjIBT9KxIYYm0IY3RUKiyVQDdSs4tcwZqsyWNWuiju4ZfGPNHGjcWw== + dependencies: + "@angular-eslint/utils" "12.5.0" + "@typescript-eslint/experimental-utils" "4.28.2" + +"@angular-eslint/schematics@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/schematics/-/schematics-12.5.0.tgz#bbfe5f543f26ddb38727163a7426fcd99572b282" + integrity sha512-918oLA4Z/sQl/WWzeQNPmy23VgU1fAdlqKnZmBWFE6Mrpstoa8emX9dIl4mbQT1UbS9XtzI2OglmbX2lQR0jRw== + dependencies: + "@angular-eslint/eslint-plugin" "12.5.0" + "@angular-eslint/eslint-plugin-template" "12.5.0" + ignore "5.1.8" + strip-json-comments "3.1.1" + tmp "0.2.1" + +"@angular-eslint/template-parser@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-12.5.0.tgz#e4cade69ce485eba9f6b7f9fdcabfb6516d4ef25" + integrity sha512-aAcwoy0X6B2IUvuH6i0zK7leKqM1Lx3QqzFI2gyOWLIgtT81182Wm0VT+3GWwr4pudw+L6n4NhDVDvxBkRJFtA== + dependencies: + eslint-scope "^5.1.0" + +"@angular-eslint/utils@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-12.5.0.tgz#9e1164de3ceffc1b79d24bd5e5788d6bb63bc905" + integrity sha512-h3ayDMxndrWRwX4sSe3Xs4QpGz+wIa6cAYtDKGu3H9HPlEacQCkKkTPCDy1d+993iL+9XynWIKuNCK9pX9YHgA== + dependencies: + "@typescript-eslint/experimental-utils" "4.28.2" + "@angular/animations@~12.2.0": version "12.2.9" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.2.9.tgz#32183c0c42fc68592ccff46c7d9c664dffc5b190" @@ -140,6 +189,15 @@ dependencies: tslib "^2.2.0" +"@angular/cdk@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-12.2.9.tgz#f39e4d7cdb3568ad8e1d412e3500772e2d4c605c" + integrity sha512-9Wgj69iGAZ4teQqW/zPbVg2RGna+m9i3v0zkWGx/+Uo95rikJCUZBQM4bfeOe+bSJrS77jV5EisBWG7ayNUSzQ== + dependencies: + tslib "^2.2.0" + optionalDependencies: + parse5 "^5.0.0" + "@angular/cli@~12.2.9": version "12.2.9" resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.2.9.tgz#03ef8b1ded33e7059690da85cf218c8a2e384f9a" @@ -213,6 +271,13 @@ dependencies: tslib "^2.2.0" +"@angular/material@12.2.9": + version "12.2.9" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-12.2.9.tgz#b4a1e138c7fd2341bd27aa6012b4738f61b5ad2d" + integrity sha512-+eM67RF038S56m3wsj37h0PyyRD18cQ8V2zmKG1UezH0nnosbmCAwzH9BfcNiIB+/V+k5QMJ/JVu5MjDQqX37w== + dependencies: + tslib "^2.2.0" + "@angular/platform-browser-dynamic@~12.2.0": version "12.2.9" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.9.tgz#d63918b9566dd53ca4a81c864bc9bc582f510262" @@ -239,6 +304,13 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" @@ -516,7 +588,7 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/highlight@^7.14.5": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== @@ -1124,6 +1196,14 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/runtime-corejs3@^7.10.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" + integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== + dependencies: + core-js-pure "^3.16.0" + regenerator-runtime "^0.13.4" + "@babel/runtime@7.14.8": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" @@ -1131,7 +1211,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.8.4": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== @@ -1189,11 +1269,40 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@gar/promisify@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -1301,6 +1410,34 @@ node-gyp "^7.1.0" read-package-json-fast "^2.0.1" +"@nrwl/devkit@12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-12.6.0.tgz#a2bdd4c144f05597302580bcf31443abdd9dc6be" + integrity sha512-tvw/4n2JD/38UuzdxFCoj1+x02BAKK4EvtLhwUK5XSBF0wDYFBp5rHfxvUD9ZcoiRRrZA4QGFjhDljrfj95F2A== + dependencies: + "@nrwl/tao" "12.6.0" + ejs "^3.1.5" + ignore "^5.0.4" + rxjs "^6.5.4" + semver "7.3.4" + tslib "^2.0.0" + +"@nrwl/tao@12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-12.6.0.tgz#b0ef91cbc0a8b7747407d1f25b0be669d9a8ddc7" + integrity sha512-h6X+mqmTlZjA9nqlyPAu9TFNORHAMcC1BD8H8kA8lTHN1nktLHQ266qpHVLsxcqww2EYsVqQaKaOpUacck49+w== + dependencies: + chalk "4.1.0" + enquirer "~2.3.6" + fs-extra "^9.1.0" + jsonc-parser "3.0.0" + rxjs "^6.5.4" + rxjs-for-await "0.0.2" + semver "7.3.4" + tmp "~0.2.1" + tslib "^2.0.0" + yargs-parser "20.0.0" + "@schematics/angular@12.2.9": version "12.2.9" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.9.tgz#6787a7b79020fb031e46e59f36767d6579dc5d50" @@ -1310,6 +1447,75 @@ "@angular-devkit/schematics" "12.2.9" jsonc-parser "3.0.0" +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@sindresorhus/is@^4.0.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.0.tgz#667bfc6186ae7c9e0b45a08960c551437176e1ca" + integrity sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tauri-apps/api@^1.0.0-beta.8": + version "1.0.0-beta.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-beta.8.tgz#a43dc4a4515148f29bfb616db85445b771e84f78" + integrity sha512-a56lXB7XvQ4+fKtT0pxpkjTSKhyrQ1Vmjyvt2ox3mT9xw3l7s8IOKHJ1WuqW6TA6xdoy3Cyja3Z3prw8hflS7g== + +"@tauri-apps/cli@^1.0.0-beta.10": + version "1.0.0-beta.10" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-beta.10.tgz#753a011d6fbbf1a903e18593b5b99d7dee8ccc5b" + integrity sha512-T0cvV5Y5vCeEw6tQ7DfuGhXxxe26AwW9i3oYT/AQZlwrLG9Xk02Pp0/lKqd/WeddE3X/IFfSm8YMRCz3VElIWQ== + dependencies: + "@tauri-apps/toml" "2.2.4" + chalk "4.1.2" + cross-env "7.0.3" + cross-spawn "7.0.3" + fs-extra "10.0.0" + global-agent "3.0.0" + got "11.8.2" + imagemin "8.0.1" + imagemin-optipng "8.0.0" + imagemin-zopfli "7.0.0" + inquirer "8.1.2" + is-png "3.0.0" + minimist "1.2.5" + ms "2.1.3" + png2icons "2.0.1" + read-chunk "3.2.0" + semver "7.3.5" + sharp "0.28.3" + update-notifier "5.1.0" + +"@tauri-apps/toml@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/toml/-/toml-2.2.4.tgz#2b4f637aded7fc3a7302724605682c8fa3ac7505" + integrity sha512-NJV/pdgJObDlDWi5+MTHZ2qyNvdL0dlHqQ72nzQYXWbW1LHMPXgCJYl0pLqL1XxxLtxtInYbtVCGVAcwhGxdkw== + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1320,6 +1526,16 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/component-emitter@^1.2.10": version "1.2.10" resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" @@ -1364,16 +1580,28 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + "@types/jasmine@~3.8.0": version "3.8.2" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.8.2.tgz#27ab0aaac29581bcbde5774e1843f90df977078e" integrity sha512-u5h7dqzy2XpXTzhOzSNQUQpKGFvROF8ElNX9P/TJvsHnTg/JvsAseVsGWQAQQldqanYaM+5kwxW909BBFAUYsg== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/keyv@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" + integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== + dependencies: + "@types/node" "*" + "@types/minimatch@*": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -1394,6 +1622,13 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -1408,6 +1643,75 @@ "@types/source-list-map" "*" source-map "^0.6.1" +"@typescript-eslint/eslint-plugin@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz#7a8320f00141666813d0ae43b49ee8244f7cf92a" + integrity sha512-PGqpLLzHSxq956rzNGasO3GsAPf2lY9lDUBXhS++SKonglUmJypaUtcKzRtUte8CV7nruwnDxtLUKpVxs0wQBw== + dependencies: + "@typescript-eslint/experimental-utils" "4.28.2" + "@typescript-eslint/scope-manager" "4.28.2" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz#4ebdec06a10888e9326e1d51d81ad52a361bd0b0" + integrity sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.28.2" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/typescript-estree" "4.28.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.2.tgz#6aff11bf4b91eb67ca7517962eede951e9e2a15d" + integrity sha512-Q0gSCN51eikAgFGY+gnd5p9bhhCUAl0ERMiDKrTzpSoMYRubdB8MJrTTR/BBii8z+iFwz8oihxd0RAdP4l8w8w== + dependencies: + "@typescript-eslint/scope-manager" "4.28.2" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/typescript-estree" "4.28.2" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz#451dce90303a3ce283750111495d34c9c204e510" + integrity sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A== + dependencies: + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/visitor-keys" "4.28.2" + +"@typescript-eslint/types@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.2.tgz#e6b9e234e0e9a66c4d25bab881661e91478223b5" + integrity sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA== + +"@typescript-eslint/typescript-estree@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz#680129b2a285289a15e7c6108c84739adf3a798c" + integrity sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg== + dependencies: + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/visitor-keys" "4.28.2" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz#bf56a400857bb68b59b311e6d0a5fbef5c3b5130" + integrity sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w== + dependencies: + "@typescript-eslint/types" "4.28.2" + eslint-visitor-keys "^2.0.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -1567,6 +1871,16 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.4.1: version "8.5.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" @@ -1631,7 +1945,7 @@ ajv@8.6.2: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1641,7 +1955,7 @@ ajv@^6.1.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0: +ajv@^8.0.0, ajv@^8.0.1: version "8.6.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== @@ -1656,7 +1970,14 @@ alphanum-sort@^1.0.2: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -ansi-colors@4.1.1: +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== @@ -1698,6 +2019,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1733,6 +2059,18 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +arch@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +archive-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" + integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= + dependencies: + file-type "^4.2.0" + are-we-there-yet@~1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" @@ -1741,6 +2079,21 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1756,6 +2109,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1778,6 +2136,11 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1805,6 +2168,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1815,6 +2183,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1827,6 +2200,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1855,6 +2233,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + babel-loader@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -1946,6 +2329,54 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bin-build@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" + integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA== + dependencies: + decompress "^4.0.0" + download "^6.2.2" + execa "^0.7.0" + p-map-series "^1.0.0" + tempfile "^2.0.0" + +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + +bin-version-check@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" + integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== + dependencies: + bin-version "^3.0.0" + semver "^5.6.0" + semver-truncate "^1.1.2" + +bin-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839" + integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== + dependencies: + execa "^1.0.0" + find-versions "^3.0.0" + +bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" + integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== + dependencies: + bin-check "^4.1.0" + bin-version-check "^4.0.0" + download "^7.1.0" + import-lazy "^3.1.0" + os-filter-obj "^2.0.0" + pify "^4.0.1" + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -1963,7 +2394,15 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^4.1.0: +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -2005,6 +2444,25 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +boolean@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.4.tgz#f51a2fb5838a99e06f9b6ec1edb674de67026435" + integrity sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2047,6 +2505,29 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4 node-releases "^1.1.77" picocolors "^0.2.1" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2057,7 +2538,7 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2142,6 +2623,50 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -2155,11 +2680,29 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -2185,16 +2728,25 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +caw@^2.0.0, caw@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" + integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + get-proxy "^2.0.0" + isurl "^1.0.0-alpha5" + tunnel-agent "^0.6.0" + url-to-options "^1.0.1" + +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" -chalk@^4.1.0, chalk@^4.1.1: +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2202,6 +2754,26 @@ chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2241,6 +2813,11 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -2251,6 +2828,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + circular-dependency-plugin@5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" @@ -2271,6 +2853,11 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -2315,6 +2902,13 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clone-response@1.0.2, clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -2333,7 +2927,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2352,11 +2946,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colord@^2.0.1, colord@^2.6: version "2.8.0" resolved "https://registry.yarnpkg.com/colord/-/colord-2.8.0.tgz#64fb7aa03de7652b5a39eee50271a104c2783b12" @@ -2379,7 +2989,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0: +commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2424,6 +3034,26 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -2444,7 +3074,12 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -content-disposition@0.5.3: +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ= + +content-disposition@0.5.3, content-disposition@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== @@ -2511,6 +3146,11 @@ core-js-compat@^3.15.0, core-js-compat@^3.16.2: browserslist "^4.17.3" semver "7.0.0" +core-js-pure@^3.16.0: + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.2.tgz#d8cc11d4885ea919f3de776d45e720e4c769d406" + integrity sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA== + core-js@3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.0.tgz#1d46fb33720bc1fa7f90d20431f36a5540858986" @@ -2556,6 +3196,31 @@ critters@0.0.10: parse5-htmlparser2-tree-adapter "^6.0.1" pretty-bytes "^5.3.0" +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@7.0.3, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2567,6 +3232,11 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + css-blank-pseudo@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" @@ -2750,6 +3420,13 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -2779,7 +3456,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@4.3.2, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1: +debug@4, debug@4.3.2, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -2800,7 +3477,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.2.0: +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2810,34 +3487,128 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + mimic-response "^1.0.0" -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + mimic-response "^2.0.0" -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: - clone "^1.0.2" + mimic-response "^3.1.0" -define-lazy-prop@^2.0.0: +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.0.0, decompress@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== @@ -2909,6 +3680,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -2946,6 +3722,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serialize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -2986,6 +3769,53 @@ domutils@^2.6.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +download@^6.2.2: + version "6.2.5" + resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" + integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA== + dependencies: + caw "^2.0.0" + content-disposition "^0.5.2" + decompress "^4.0.0" + ext-name "^5.0.0" + file-type "5.2.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^7.0.0" + make-dir "^1.0.0" + p-event "^1.0.0" + pify "^3.0.0" + +download@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" + integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== + dependencies: + archive-type "^4.0.0" + caw "^2.0.1" + content-disposition "^0.5.2" + decompress "^4.2.0" + ext-name "^5.0.0" + file-type "^8.1.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^8.3.1" + make-dir "^1.2.0" + p-event "^2.1.0" + pify "^3.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2999,6 +3829,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + electron-to-chromium@^1.3.857: version "1.3.862" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz#c1c5d4382449e2c9b0e67fe1652f4fc451d6d8c0" @@ -3031,7 +3868,7 @@ encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3066,6 +3903,13 @@ enhanced-resolve@^5.8.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.5, enquirer@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" @@ -3093,7 +3937,7 @@ errno@^0.1.1, errno@^0.1.3: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -3105,6 +3949,11 @@ es-module-lexer@^0.7.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + esbuild-android-arm64@0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz#5178a20d2b7aba741a31c19609f9e67b346996b9" @@ -3217,17 +4066,27 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@5.1.1: +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1, eslint-scope@^5.1.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3235,6 +4094,97 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.26.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -3247,7 +4197,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -3284,6 +4234,30 @@ eventsource@^1.0.7: dependencies: original "^1.0.0" +exec-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" + integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA== + dependencies: + execa "^0.7.0" + p-finally "^1.0.0" + pify "^3.0.0" + rimraf "^2.5.4" + tempfile "^2.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3297,6 +4271,13 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3310,6 +4291,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -3346,6 +4332,21 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3399,12 +4400,12 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1, fast-glob@^3.2.5: +fast-glob@^3.1.1, fast-glob@^3.2.5, fast-glob@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== @@ -3420,6 +4421,11 @@ fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -3434,6 +4440,21 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3441,11 +4462,73 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-type@5.2.0, file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^16.5.3: + version "16.5.3" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06" + integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== + dependencies: + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.2.4" + token-types "^4.1.1" + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" + integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + +file-type@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" + integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" + integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3494,6 +4577,14 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3509,11 +4600,31 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-versions@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flatted@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -3560,6 +4671,28 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -3569,6 +4702,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -3604,6 +4747,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3637,13 +4785,45 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" -get-stream@^4.0.0: +get-proxy@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" + integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== + dependencies: + npm-conf "^1.1.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3656,6 +4836,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -3707,11 +4892,44 @@ glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +global-agent@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -3724,6 +4942,18 @@ globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globby@^12.0.0: + version "12.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.0.2.tgz#53788b2adf235602ed4cabfea5c70a1139e1ab11" + integrity sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.8" + merge2 "^1.4.1" + slash "^4.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3735,7 +4965,84 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +got@11.8.2: + version "11.8.2" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" + integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +got@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -3758,6 +5065,13 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3768,11 +5082,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -3816,6 +5142,11 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3837,6 +5168,11 @@ hdr-histogram-percentiles-obj@^3.0.0: resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + hosted-git-info@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" @@ -3864,7 +5200,12 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.1.0: +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== @@ -3948,6 +5289,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + https-proxy-agent@5.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" @@ -3982,7 +5331,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3994,17 +5343,53 @@ ignore-walk@^3.0.3: dependencies: minimatch "^3.0.4" -ignore@^5.1.4: +ignore@5.1.8, ignore@^5.0.4, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= -import-fresh@^3.2.1: +imagemin-optipng@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz#b88e5cf6da25cc8479e07cdf38c3ae0479df7ef2" + integrity sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A== + dependencies: + exec-buffer "^3.0.0" + is-png "^2.0.0" + optipng-bin "^7.0.0" + +imagemin-zopfli@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/imagemin-zopfli/-/imagemin-zopfli-7.0.0.tgz#a44daa3bb80e2620cd1dc883d823b20b4d3788d6" + integrity sha512-nmffj58rVb0O3AlCZLBBVKGyZ5MYPZZfKxUhvA7bwPGougHl/F7EUKSse9jkgXjdvtJYG2ojJeh5N67mYgBM9g== + dependencies: + exec-buffer "^3.0.0" + is-png "^2.0.0" + zopflipng-bin "^6.0.0" + +imagemin@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-8.0.1.tgz#8b29ecb78197d8f0eac6a782f2e6b38fb3780d9e" + integrity sha512-Q/QaPi+5HuwbZNtQRqUVk6hKacI6z9iWiCSQBisAv7uBynZwO7t1svkryKl7+iSQbkU/6t9DWnHz04cFs2WY7w== + dependencies: + file-type "^16.5.3" + globby "^12.0.0" + graceful-fs "^4.2.8" + junk "^3.1.0" + p-pipe "^4.0.0" + replace-ext "^2.0.0" + slash "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -4012,6 +5397,16 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -4025,6 +5420,13 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -4063,6 +5465,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" @@ -4091,6 +5498,14 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -4138,6 +5553,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -4157,6 +5577,13 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.2.0: version "2.7.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" @@ -4225,6 +5652,11 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -4256,6 +5688,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -4266,6 +5706,16 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -4278,6 +5728,16 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" @@ -4297,6 +5757,16 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4304,6 +5774,16 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-png@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-3.0.0.tgz#7bf5db7f32527d10c90594a751c15f74d46c8f5e" + integrity sha512-waa2qEuqgLjjYT14KOUQqAEIRRIv7ttkzPVctY/qv+IAKnzXf+JAPKQas50RgO0ECPDUG/iB1zQmwpyB9kkZtQ== + +is-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" + integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== + is-regex@^1.0.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4317,12 +5797,17 @@ is-resolvable@^1.1.0: resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^1.1.0: +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -4332,6 +5817,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + is-what@^3.12.0: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -4354,6 +5844,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -4427,6 +5922,24 @@ istanbul-reports@^3.0.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jasmine-core@^3.6.0: version "3.9.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.9.0.tgz#09a3c8169fe98ec69440476d04a0e4cb4d59e452" @@ -4451,6 +5964,14 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -4466,6 +5987,16 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -4491,7 +6022,12 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stringify-safe@~5.0.1: +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -4527,6 +6063,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -4542,6 +6087,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + karma-chrome-launcher@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" @@ -4609,6 +6159,27 @@ karma@~6.3.0: ua-parser-js "^0.7.28" yargs "^16.1.1" +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -4643,6 +6214,13 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + less-loader@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.0.1.tgz#c05aaba68d00400820275f21c2ad87cb9fa9923f" @@ -4667,6 +6245,14 @@ less@4.1.1: needle "^2.5.2" source-map "~0.6.0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + license-webpack-plugin@2.3.20: version "2.3.20" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz#f51fb674ca31519dbedbe1c7aabc036e5a7f2858" @@ -4685,6 +6271,17 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + loader-runner@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" @@ -4723,6 +6320,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4733,6 +6335,16 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4762,11 +6374,65 @@ log4js@^6.3.0: rfdc "^1.1.4" streamroller "^2.2.4" +logalot@^2.0.0, logalot@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI= + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + loglevel@^1.6.8: version "1.7.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +longest@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4= + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4781,6 +6447,13 @@ magic-string@0.25.7, magic-string@^0.25.0: dependencies: sourcemap-codec "^1.4.4" +make-dir@^1.0.0, make-dir@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4830,6 +6503,11 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -4837,6 +6515,13 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -4870,6 +6555,22 @@ memory-fs@^0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -4887,7 +6588,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -4924,7 +6625,7 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.50.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: version "1.50.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== @@ -4956,6 +6657,21 @@ mimic-fn@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + mini-css-extract-plugin@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.1.tgz#a44bbfc8ede9211f31474b91c4e8863bf52dd294" @@ -4975,7 +6691,7 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@1.2.5, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -5050,6 +6766,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -5077,7 +6798,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5132,6 +6853,16 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + needle@^2.5.2: version "2.9.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" @@ -5164,7 +6895,14 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@^3.0.0: +node-abi@^2.21.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" + integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== + dependencies: + semver "^5.4.1" + +node-addon-api@^3.0.0, node-addon-api@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -5207,6 +6945,16 @@ nopt@^5.0.0: dependencies: abbrev "1" +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -5224,6 +6972,20 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -5236,6 +6998,14 @@ npm-bundled@^1.1.1: dependencies: npm-normalize-package-bin "^1.0.1" +npm-conf@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + npm-install-checks@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" @@ -5296,7 +7066,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -5426,6 +7196,27 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +optipng-bin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-7.0.0.tgz#2dfcc68a5f006e7746e76ad64d317d6fb7c7f9ed" + integrity sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.0.0" + ora@5.4.1, ora@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -5448,21 +7239,67 @@ original@^1.0.0: dependencies: url-parse "^1.4.3" +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-event@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" + integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU= + dependencies: + p-timeout "^1.1.1" + +p-event@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" + integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== + dependencies: + p-timeout "^2.0.1" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5491,6 +7328,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-map-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= + dependencies: + p-reduce "^1.0.0" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -5503,6 +7347,16 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-pipe@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-4.0.0.tgz#7e5424569351b2ab452a47826acb93ce09ad6a2c" + integrity sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w== + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -5510,11 +7364,35 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-try@^2.0.0: +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0, p-try@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + pacote@11.3.5: version "11.3.5" resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" @@ -5552,6 +7430,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -5589,6 +7474,11 @@ parse5-sax-parser@^6.0.1: dependencies: parse5 "^6.0.1" +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -5609,6 +7499,13 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -5634,6 +7531,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -5644,11 +7546,30 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +peek-readable@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.0.1.tgz#9a045f291db254111c3412c1ce4fec27ddd4d202" + integrity sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -5664,11 +7585,16 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -5711,6 +7637,11 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" +png2icons@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/png2icons/-/png2icons-2.0.1.tgz#09d8f10b71302e98ca178d3324bc4deff9b90124" + integrity sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA== + portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -6302,6 +8233,40 @@ postcss@^8.2.15, postcss@^8.3.5: picocolors "^0.2.1" source-map-js "^0.6.2" +prebuild-install@^6.1.2: + version "6.1.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -6312,6 +8277,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -6325,6 +8295,11 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -6338,6 +8313,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -6361,6 +8341,13 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" @@ -6376,6 +8363,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -6391,6 +8387,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6413,6 +8414,16 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -6420,6 +8431,14 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-chunk@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca" + integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== + dependencies: + pify "^4.0.1" + with-open-file "^0.1.6" + read-package-json-fast@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" @@ -6428,7 +8447,24 @@ read-package-json-fast@^2.0.1: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -6441,7 +8477,7 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.4.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -6450,6 +8486,13 @@ readable-stream@^3.0.6, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-web-to-node-stream@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -6466,6 +8509,14 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + reflect-metadata@^0.1.2: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -6516,6 +8567,11 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + regexpu-core@^4.7.1: version "4.8.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" @@ -6528,6 +8584,20 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -6555,6 +8625,18 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-2.0.0.tgz#9471c213d22e1bcc26717cd6e50881d88f812b06" + integrity sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug== + request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -6601,6 +8683,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -6634,7 +8721,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.20.0, resolve@^1.1.7, resolve@^1.14.2: +resolve@1.20.0, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -6642,6 +8729,20 @@ resolve@1.20.0, resolve@^1.1.7, resolve@^1.14.2: is-core-module "^2.2.0" path-parse "^1.0.6" +responselike@1.0.2, responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -6670,7 +8771,7 @@ rfdc@^1.1.4: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6684,6 +8785,18 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -6696,7 +8809,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@6.6.7, rxjs@~6.6.0: +rxjs-for-await@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz#26598a1d6167147cc192172970e7eed4e620384b" + integrity sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw== + +rxjs@6.6.7, rxjs@^6.5.4, rxjs@~6.6.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -6715,7 +8833,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6779,6 +8897,13 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +seek-bzip@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" + integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== + dependencies: + commander "^2.8.1" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -6791,24 +8916,55 @@ selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +semver-truncate@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -6832,6 +8988,13 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -6894,6 +9057,20 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +sharp@0.28.3: + version "0.28.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.28.3.tgz#ecd74cefd020bee4891bb137c9850ee2ce277a8b" + integrity sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA== + dependencies: + color "^3.1.3" + detect-libc "^1.0.3" + node-addon-api "^3.2.0" + prebuild-install "^6.1.2" + semver "^7.3.5" + simple-get "^3.1.0" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -6901,21 +9078,68 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3, simple-get@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + smart-buffer@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -7018,6 +9242,27 @@ socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" + integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= + dependencies: + sort-keys "^1.0.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -7097,6 +9342,32 @@ sourcemap-codec@1.4.8, sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -7127,6 +9398,25 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM= + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -7176,6 +9466,11 @@ streamroller@^2.2.4: debug "^4.1.1" fs-extra "^8.1.0" +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7202,7 +9497,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -7253,11 +9548,57 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +strtok3@^6.2.4: + version "6.2.4" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.2.4.tgz#302aea64c0fa25d12a0385069ba66253fdc38a81" + integrity sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^4.0.1" + style-loader@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.2.1.tgz#63cb920ec145c8669e9a50e92961452a1ef5dcde" @@ -7294,6 +9635,11 @@ stylus@0.54.8: semver "^6.3.0" source-map "^0.7.3" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7340,11 +9686,57 @@ symbol-observable@4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== +table@^6.0.9: + version "6.7.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.0.2, tar@^6.1.0: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -7357,6 +9749,19 @@ tar@^6.0.2, tar@^6.1.0: mkdirp "^1.0.3" yallist "^4.0.0" +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + terser-webpack-plugin@5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" @@ -7399,12 +9804,12 @@ terser@^5.7.0, terser@^5.7.2: source-map "~0.7.2" source-map-support "~0.5.20" -text-table@0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -7414,11 +9819,23 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +timed-out@^4.0.0, timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -7426,12 +9843,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-fast-properties@^2.0.0: version "2.0.0" @@ -7445,6 +9860,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -7475,6 +9895,14 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +token-types@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.1.1.tgz#ef9e8c8e2e0ded9f1b3f8dbaa46a3228b113ba1a" + integrity sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -7488,12 +9916,24 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + tslib@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -tslib@^1.10.0, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -7508,6 +9948,13 @@ tslib@~2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -7520,6 +9967,23 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -7533,6 +9997,13 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typescript@4.3.5, typescript@~4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" @@ -7543,6 +10014,14 @@ ua-parser-js@^0.7.28: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +unbzip2-stream@^1.0.9: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -7600,11 +10079,23 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -7623,6 +10114,26 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-notifier@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -7635,6 +10146,20 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + url-parse@^1.4.3, url-parse@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" @@ -7643,6 +10168,11 @@ url-parse@^1.4.3, url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -7671,11 +10201,24 @@ uuid@8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" @@ -7883,7 +10426,7 @@ which@^1.2.1, which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.2: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -7897,11 +10440,32 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== +with-open-file@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729" + integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA== + dependencies: + p-finally "^1.0.0" + p-try "^2.1.0" + pify "^4.0.1" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -7925,6 +10489,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + ws@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -7937,6 +10511,16 @@ ws@~7.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -7947,6 +10531,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -7957,6 +10546,11 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.0.0.tgz#c65a1daaa977ad63cebdd52159147b789a4e19a9" + integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -8012,6 +10606,14 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -8023,3 +10625,12 @@ zone.js@~0.11.4: integrity sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw== dependencies: tslib "^2.0.0" + +zopflipng-bin@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/zopflipng-bin/-/zopflipng-bin-6.0.1.tgz#a91ef81bdba18e151dda3f34df23d3ecd7d04a1f" + integrity sha512-+aybvXv/xafL6I67uSH5yLHrSy4/OaSOV9tniw4yZFIHpINXUcctVHE/WzHxOONrL2GHzJ8Fd4iDrNyaS6TVbg== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.1" + logalot "^2.1.0" From 68ffdc323b095fdde7c164790cff9862fccc75c8 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 9 Oct 2021 16:17:36 +0200 Subject: [PATCH 003/183] Add repository connections Signed-off-by: trivernis --- mediarepo-ui/src-tauri/src/commands/repo.rs | 28 ++++++++++++-- mediarepo-ui/src-tauri/src/context.rs | 6 +-- mediarepo-ui/src-tauri/src/error.rs | 37 +++++++++++++++---- mediarepo-ui/src-tauri/src/main.rs | 4 +- mediarepo-ui/src-tauri/src/settings.rs | 3 +- mediarepo-ui/src/app/app.component-theme.scss | 3 +- mediarepo-ui/src/app/app.component.ts | 24 ++++++++---- .../repo-form/repo-form.component.ts | 7 ++-- .../repository-card.component.ts | 12 ++++-- .../services/dataloader/dataloader.service.ts | 8 ++-- .../error-broker/error-broker.service.spec.ts | 16 ++++++++ .../error-broker/error-broker.service.ts | 22 +++++++++++ .../services/repository/repository.service.ts | 3 +- 13 files changed, 134 insertions(+), 39 deletions(-) create mode 100644 mediarepo-ui/src/app/services/error-broker/error-broker.service.spec.ts create mode 100644 mediarepo-ui/src/app/services/error-broker/error-broker.service.ts diff --git a/mediarepo-ui/src-tauri/src/commands/repo.rs b/mediarepo-ui/src-tauri/src/commands/repo.rs index 6ab5e48..a76c39b 100644 --- a/mediarepo-ui/src-tauri/src/commands/repo.rs +++ b/mediarepo-ui/src-tauri/src/commands/repo.rs @@ -1,9 +1,11 @@ use std::path::PathBuf; +use rmp_ipc::IPCBuilder; use serde::{Serialize, Deserialize}; use crate::context::Context; -use crate::error::AppResult; +use crate::error::{AppError, AppResult}; use tokio::fs; use crate::settings::save_settings; +use rmp_ipc::context::Context as IPCContext; static REPO_CONFIG_FILE: &str = "repo.toml"; @@ -25,7 +27,7 @@ pub struct RepoConfig { pub async fn get_repositories(context: tauri::State<'_, Context>) -> AppResult> { let settings = context.settings.read().await; - Ok(settings.repositories.clone()) + Ok(settings.repositories.values().cloned().collect()) } #[tauri::command] @@ -43,17 +45,35 @@ pub async fn add_repository(name: String, path: String, context: tauri::State<'_ let mut repositories = Vec::new(); { let mut settings = context.settings.write().await; - settings.repositories.push(repo); + settings.repositories.insert(repo.name.clone(), repo); save_settings(&settings)?; - repositories.append(&mut settings.repositories.clone()); + repositories.append(&mut settings.repositories.values().cloned().collect()); } Ok(repositories) } +#[tauri::command] +pub async fn select_repository(name: String, context: tauri::State<'_, Context>) -> AppResult<()> { + let settings = context.settings.read().await; + let repo = settings.repositories.get(&name).ok_or(AppError::new(format!("Repository '{}' not found", name)))?; + let ipc = connect(&repo.address).await?; + let mut ipc_ctx = context.ipc.write().await; + *ipc_ctx = Some(ipc); + + Ok(()) +} + async fn read_repo_config(path: PathBuf) -> AppResult { let toml_str = fs::read_to_string(path).await?; let config = toml::from_str(&toml_str)?; Ok(config) } + +/// Connects to the IPC Server +async fn connect(address: &str) -> AppResult { + let ctx = IPCBuilder::new().address(address).build_client().await?; + + Ok(ctx) +} diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs index 9ac5d7d..701dad4 100644 --- a/mediarepo-ui/src-tauri/src/context.rs +++ b/mediarepo-ui/src-tauri/src/context.rs @@ -1,20 +1,20 @@ use std::sync::Arc; -use rmp_ipc::client::IPCClient; use tokio::sync::RwLock; +use rmp_ipc::context::Context as IPCContext; use crate::commands::repo::Repository; use crate::settings::Settings; #[derive(Clone)] pub struct Context { pub active_repository: Option, - pub client: Option>, + pub ipc: Arc>>, pub settings: Arc> } impl Context { pub fn new(settings: Settings) -> Self { Self { - client: None, + ipc: Arc::new(RwLock::new(None)), active_repository: None, settings: Arc::new(RwLock::new(settings)) } diff --git a/mediarepo-ui/src-tauri/src/error.rs b/mediarepo-ui/src-tauri/src/error.rs index ae0e899..ef7eab1 100644 --- a/mediarepo-ui/src-tauri/src/error.rs +++ b/mediarepo-ui/src-tauri/src/error.rs @@ -1,27 +1,50 @@ -use std::io::Error; +use std::error::Error; +use std::fmt::{Display, Formatter}; use serde::Serialize; pub type AppResult = Result; #[derive(Debug, Serialize)] -pub enum AppError { - Msg(String) +pub struct AppError { + message: String } +impl AppError { + pub fn new(msg: S) -> Self { + Self { + message: msg.to_string() + } + } +} + +impl Display for AppError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.message.fmt(f) + } +} + +impl Error for AppError {} + impl From for AppError { - fn from(e: Error) -> Self { - Self::Msg(e.to_string()) + fn from(e: std::io::Error) -> Self { + Self::new(e) } } impl From for AppError { fn from(e: toml::de::Error) -> Self { - Self::Msg(format!("Failed to deserialize toml: {:?}", e)) + Self::new(format!("Failed to deserialize toml: {:?}", e)) } } impl From for AppError { fn from(e: toml::ser::Error) -> Self { - Self::Msg(format!("Failed to serialize to toml: {:?}", e)) + Self::new(format!("Failed to serialize to toml: {:?}", e)) + } +} + +impl From for AppError { + fn from(e: rmp_ipc::error::Error) -> Self { + Self::new(format!("Daemon Error: {:?}", e)) } } diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index 380f721..b596766 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -3,7 +3,7 @@ windows_subsystem = "windows" )] -use crate::commands::repo::{get_repositories, add_repository}; +use crate::commands::repo::{get_repositories, add_repository, select_repository}; use crate::context::Context; use crate::settings::load_settings; @@ -18,7 +18,7 @@ fn main() { tauri::Builder::default() .manage(context) - .invoke_handler(tauri::generate_handler![get_repositories, add_repository]) + .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src-tauri/src/settings.rs b/mediarepo-ui/src-tauri/src/settings.rs index 267b028..85eb7d4 100644 --- a/mediarepo-ui/src-tauri/src/settings.rs +++ b/mediarepo-ui/src-tauri/src/settings.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use serde::{Serialize, Deserialize}; use crate::commands::repo::Repository; use crate::error::AppResult; @@ -9,7 +10,7 @@ static SETTINGS_FILE: &str = "settings.toml"; #[derive(Default, Serialize, Deserialize)] pub struct Settings { - pub repositories: Vec, + pub repositories: HashMap, } fn get_settings_path() -> PathBuf { diff --git a/mediarepo-ui/src/app/app.component-theme.scss b/mediarepo-ui/src/app/app.component-theme.scss index a3bdeac..49b102e 100644 --- a/mediarepo-ui/src/app/app.component-theme.scss +++ b/mediarepo-ui/src/app/app.component-theme.scss @@ -12,7 +12,8 @@ } .warn { - color: mat.get-color-from-palette($warn-palette); + background-color: mat.get-color-from-palette($warn-palette); + color: white } } diff --git a/mediarepo-ui/src/app/app.component.ts b/mediarepo-ui/src/app/app.component.ts index 299a652..4f53920 100644 --- a/mediarepo-ui/src/app/app.component.ts +++ b/mediarepo-ui/src/app/app.component.ts @@ -1,34 +1,42 @@ -import { Component } from '@angular/core'; +import {Component, OnInit} from '@angular/core'; import {Router} from "@angular/router"; import {RepositoryService} from "./services/repository/repository.service"; import {DataloaderService} from "./services/dataloader/dataloader.service"; import {MatSnackBar} from "@angular/material/snack-bar"; +import {ErrorBrokerService} from "./services/error-broker/error-broker.service"; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) -export class AppComponent { +export class AppComponent implements OnInit{ title = 'mediarepo-ui'; constructor( private router: Router, private snackBar: MatSnackBar, + private errorBroker: ErrorBrokerService, private dataloaderService: DataloaderService, - private repoService: RepositoryService + private repoService: RepositoryService, ) { } async ngOnInit() { - this.dataloaderService.loaderError.subscribe({ - error: (err) => { - this.snackBar.open(err, undefined, {panelClass: "warn"}) - } - }) + this.errorBroker.errorCb = (err: { message: string }) => { + console.error(err); + this.showError(err) + }; await this.dataloaderService.loadData(); if (this.repoService.selectedRepository.getValue() == undefined) { await this.router.navigate(["repositories"]) } } + + private showError(err: { message: string }) { + this.snackBar.open(err.message, undefined, { + panelClass: "warn", + duration: 2000, + }); + } } diff --git a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts index da5d3ed..2263027 100644 --- a/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts +++ b/mediarepo-ui/src/app/pages/repositories/repo-form/repo-form.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import {FormControl, FormGroup, Validators} from "@angular/forms"; import {RepositoryService} from "../../../services/repository/repository.service"; import {MatSnackBar} from "@angular/material/snack-bar"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; @Component({ selector: 'app-repo-form', @@ -16,7 +17,7 @@ export class RepoFormComponent implements OnInit { }) - constructor(private repoService: RepositoryService, private snackBar: MatSnackBar) { } + constructor(private repoService: RepositoryService, private errorBroker: ErrorBrokerService) { } ngOnInit(): void { } @@ -26,9 +27,7 @@ export class RepoFormComponent implements OnInit { try { await this.repoService.addRepository(name, path); } catch(err) { - this.snackBar.open(err.Msg, undefined, { - panelClass: "warn" - }) + this.errorBroker.showError(err); } } } diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts index e88daad..a98006b 100644 --- a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts @@ -2,6 +2,8 @@ import {Component, Input, OnInit} from '@angular/core'; import {Repository} from "../../../models/Repository"; import {RepositoryService} from "../../../services/repository/repository.service"; import {Router} from "@angular/router"; +import {MatSnackBar} from "@angular/material/snack-bar"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; @Component({ selector: 'app-repository-card', @@ -12,15 +14,19 @@ export class RepositoryCardComponent implements OnInit { @Input() repository?: Repository; - constructor(private repoService: RepositoryService, private router: Router) {} + constructor(private repoService: RepositoryService, private router: Router, private errorBroker: ErrorBrokerService) {} ngOnInit(): void { } async selectRepository() { if (this.repository) { - this.repoService.setRepository(this.repository); - await this.router.navigate([""]); + try { + await this.repoService.setRepository(this.repository); + await this.router.navigate([""]); + } catch(err) { + this.errorBroker.showError(err); + } } } } diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts index 4e0a1b0..a21c7a2 100644 --- a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -1,22 +1,20 @@ import { Injectable } from '@angular/core'; import {RepositoryService} from "../repository/repository.service"; import {BehaviorSubject} from "rxjs"; +import {ErrorBrokerService} from "../error-broker/error-broker.service"; @Injectable({ providedIn: 'root' }) export class DataloaderService { - loaderError = new BehaviorSubject(undefined); - - constructor(private repositoryService: RepositoryService) { } + constructor(private erroBroker: ErrorBrokerService, private repositoryService: RepositoryService) { } public async loadData() { try { await this.repositoryService.loadRepositories(); } catch (err) { - this.loaderError.error(err); - console.error(err); + this.erroBroker.showError(err); } } } diff --git a/mediarepo-ui/src/app/services/error-broker/error-broker.service.spec.ts b/mediarepo-ui/src/app/services/error-broker/error-broker.service.spec.ts new file mode 100644 index 0000000..7c0368a --- /dev/null +++ b/mediarepo-ui/src/app/services/error-broker/error-broker.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ErrorBrokerService } from './error-broker.service'; + +describe('ErrorBrokerService', () => { + let service: ErrorBrokerService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ErrorBrokerService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts b/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts new file mode 100644 index 0000000..a9e6a00 --- /dev/null +++ b/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import {BehaviorSubject} from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class ErrorBrokerService { + + errorCb: Function | undefined; + + constructor() { } + + showError(error: {message: String}) { + if (this.errorCb) { + if (!error.message) { + this.errorCb({message: error}); + } else { + this.errorCb({...error}); + } + } + } +} diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts index 0fdf364..e556455 100644 --- a/mediarepo-ui/src/app/services/repository/repository.service.ts +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -17,7 +17,8 @@ export class RepositoryService { this.repositories.next(repos); } - public setRepository(repo: Repository) { + public async setRepository(repo: Repository) { + await invoke("select_repository", {name: repo.name}); this.selectedRepository.next(repo); } From 5e4d6e098f32560fa51092e4900edbea968657dd Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 10 Oct 2021 14:39:40 +0200 Subject: [PATCH 004/183] Improve connection handling Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 788 +++++++++++++++++++- mediarepo-ui/src-tauri/Cargo.toml | 9 +- mediarepo-ui/src-tauri/src/commands/mod.rs | 16 + mediarepo-ui/src-tauri/src/commands/repo.rs | 27 +- mediarepo-ui/src-tauri/src/context.rs | 4 +- mediarepo-ui/src-tauri/src/error.rs | 12 + mediarepo-ui/src-tauri/src/ipc/files.rs | 1 + mediarepo-ui/src-tauri/src/ipc/mod.rs | 45 ++ mediarepo-ui/src-tauri/src/main.rs | 6 +- mediarepo-ui/src/app/models/Info.ts | 0 10 files changed, 876 insertions(+), 32 deletions(-) create mode 100644 mediarepo-ui/src-tauri/src/ipc/files.rs create mode 100644 mediarepo-ui/src-tauri/src/ipc/mod.rs create mode 100644 mediarepo-ui/src/app/models/Info.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index eb49e57..51955d4 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -14,6 +14,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" +[[package]] +name = "ahash" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +dependencies = [ + "getrandom 0.2.3", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.18" @@ -43,6 +54,7 @@ name = "app" version = "0.1.0" dependencies = [ "directories", + "mediarepo", "rmp-ipc", "serde", "serde_json", @@ -51,6 +63,7 @@ dependencies = [ "thiserror", "tokio", "toml", + "typemap_rev", ] [[package]] @@ -90,6 +103,38 @@ dependencies = [ "winapi", ] +[[package]] +name = "async-stream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atk" version = "0.14.0" @@ -114,6 +159,15 @@ dependencies = [ "system-deps 3.2.0", ] +[[package]] +name = "atoi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +dependencies = [ + "num-traits", +] + [[package]] name = "attohttpc" version = "0.17.0" @@ -132,12 +186,42 @@ dependencies = [ "wildmatch", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "bae" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107f431ee3d8a8e45e6dd117adab769556ef463959e77bf6a4888d5fd500cf" +dependencies = [ + "heck", + "proc-macro-error 0.4.12", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "base-x" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" + [[package]] name = "base64" version = "0.13.0" @@ -170,6 +254,17 @@ dependencies = [ "constant_time_eq", ] +[[package]] +name = "blake2s_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "constant_time_eq", +] + [[package]] name = "blake3" version = "1.0.0" @@ -191,6 +286,22 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + [[package]] name = "bstr" version = "0.2.17" @@ -324,6 +435,7 @@ dependencies = [ "libc", "num-integer", "num-traits", + "serde", "time", "winapi", ] @@ -499,6 +611,30 @@ dependencies = [ "objc", ] +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" version = "1.2.1" @@ -542,6 +678,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -614,6 +760,32 @@ dependencies = [ "syn", ] +[[package]] +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn", +] + [[package]] name = "deflate" version = "0.7.20" @@ -725,6 +897,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "dtoa" version = "0.4.8" @@ -773,6 +951,19 @@ dependencies = [ "syn", ] +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "fastrand" version = "1.5.0" @@ -899,6 +1090,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.17" @@ -977,9 +1179,9 @@ dependencies = [ [[package]] name = "gdk" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a453eae5ec10345b3a96ca1b547328bfc94edd40aa95b08f14bb4c35863db140" +checksum = "b9d749dcfc00d8de0d7c3a289e04a04293eb5ba3d8a4e64d64911d481fa9933b" dependencies = [ "bitflags", "cairo-rs", @@ -1075,14 +1277,14 @@ checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] name = "gio" -version = "0.14.6" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a29d8062af72045518271a2cd98b4e1617ce43f5b4223ad0fb9a0eff8f718c" +checksum = "711c3632b3ebd095578a9c091418d10fed492da9443f58ebc8f45efbeb215cb0" dependencies = [ "bitflags", "futures-channel", @@ -1123,9 +1325,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.14.5" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a930b7208e6e0ab839eea5f65ac2b82109f729621430d47fe905e2e09d33f4" +checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4" dependencies = [ "bitflags", "futures-channel", @@ -1149,7 +1351,7 @@ dependencies = [ "anyhow", "heck", "proc-macro-crate 1.1.0", - "proc-macro-error", + "proc-macro-error 1.0.4", "proc-macro2", "quote", "syn", @@ -1212,9 +1414,9 @@ dependencies = [ [[package]] name = "gtk" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6603bb79ded6ac6f3bac203794383afa8b1d6a8656d34a93a88f0b22826cd46c" +checksum = "2eb51122dd3317e9327ec1e4faa151d1fa0d95664cd8fb8dcfacf4d4d29ac70c" dependencies = [ "atk", "bitflags", @@ -1260,12 +1462,30 @@ dependencies = [ "anyhow", "heck", "proc-macro-crate 1.1.0", - "proc-macro-error", + "proc-macro-error 1.0.4", "proc-macro2", "quote", "syn", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown", +] + [[package]] name = "heck" version = "0.3.3" @@ -1284,6 +1504,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "html5ever" version = "0.25.1" @@ -1315,6 +1541,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "ico" version = "0.1.0" @@ -1360,6 +1592,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "infer" version = "0.4.0" @@ -1445,6 +1687,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + [[package]] name = "kuchiki" version = "0.8.1" @@ -1469,6 +1717,17 @@ version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" +[[package]] +name = "libsqlite3-sys" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "lock_api" version = "0.4.5" @@ -1558,6 +1817,74 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "mediarepo" +version = "0.1.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +dependencies = [ + "env_logger", + "log", + "mediarepo-core", + "mediarepo-socket", + "tokio", +] + +[[package]] +name = "mediarepo-core" +version = "0.1.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +dependencies = [ + "base64", + "multibase", + "multihash", + "rmp-ipc", + "sea-orm", + "serde", + "sqlx", + "thiserror", + "tokio", + "toml", + "typemap_rev", +] + +[[package]] +name = "mediarepo-database" +version = "0.1.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +dependencies = [ + "chrono", + "mediarepo-core", + "sea-orm", + "sqlx", +] + +[[package]] +name = "mediarepo-model" +version = "0.1.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +dependencies = [ + "chrono", + "mediarepo-core", + "mediarepo-database", + "sea-orm", + "serde", + "tokio", + "typemap_rev", +] + +[[package]] +name = "mediarepo-socket" +version = "0.1.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +dependencies = [ + "chrono", + "mediarepo-core", + "mediarepo-model", + "rmp-ipc", + "serde", + "tokio", +] + [[package]] name = "memchr" version = "2.4.1" @@ -1573,6 +1900,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677" + [[package]] name = "minisign-verify" version = "0.1.8" @@ -1620,6 +1953,48 @@ dependencies = [ "winapi", ] +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e540106213dc639fe2b632a7d9e3525169ef081378a7c2da4457b84fec44c0" +dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", + "digest", + "generic-array", + "multihash-derive", + "sha2", + "sha3", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro-error 1.0.4", + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "native-tls" version = "0.2.8" @@ -1719,6 +2094,17 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" +dependencies = [ + "memchr", + "minimal-lexical", + "version_check", +] + [[package]] name = "notify-rust" version = "4.5.4" @@ -1742,6 +2128,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -1839,6 +2236,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "open" version = "2.0.1" @@ -1905,9 +2308,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.14.3" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc88307d9797976ea62722ff2ec5de3fae279c6e20100ed3f49ca1a4bf3f96" +checksum = "546fd59801e5ca735af82839007edd226fe7d3bb06433ec48072be4439c28581" dependencies = [ "bitflags", "glib", @@ -2164,16 +2567,42 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-error" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" +dependencies = [ + "proc-macro-error-attr 0.4.12", + "proc-macro2", + "quote", + "syn", + "version_check", +] + [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ - "proc-macro-error-attr", + "proc-macro-error-attr 1.0.4", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" +dependencies = [ "proc-macro2", "quote", "syn", + "syn-mid", "version_check", ] @@ -2449,9 +2878,9 @@ dependencies = [ [[package]] name = "rmp-ipc" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af495ca346adde10163eb920b52b5a3992fb209b31df58ece4ed0f855661978c" +checksum = "d2ada2c7329ea55e1e80f2a1ae9ddb123f93ae4b349d493273138118feadfecb" dependencies = [ "lazy_static", "log", @@ -2485,6 +2914,17 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rust_decimal" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f1028de22e436bb35fce070310ee57d57b5e59ae77b4e3f24ce4773312b813" +dependencies = [ + "arrayvec 0.5.2", + "num-traits", + "serde", +] + [[package]] name = "rustc_version" version = "0.3.3" @@ -2537,6 +2977,88 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sea-orm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c5c7f0848ed7ddb2b3956abc84d5167dd33bb34c43e3b69172f565ca657a11" +dependencies = [ + "async-stream", + "async-trait", + "chrono", + "futures", + "futures-util", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-strum", + "serde", + "serde_json", + "sqlx", + "uuid", +] + +[[package]] +name = "sea-orm-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9466819cb0878e7fb6f6a1d7e46471a93b7121fef39db82f5799127884e39534" +dependencies = [ + "bae", + "convert_case", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sea-query" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1db6d690760e4f48663f0ecd9d91b03c1e6a5b17991d1c53043c5f07ba7db29" +dependencies = [ + "chrono", + "rust_decimal", + "sea-query-derive", + "serde_json", + "uuid", +] + +[[package]] +name = "sea-query-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", + "thiserror", +] + +[[package]] +name = "sea-strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c77c6c6c8b3950fccb65edd5d04985b5377f4c8f669cb9a215553f0369ec001" +dependencies = [ + "sea-strum_macros", +] + +[[package]] +name = "sea-strum_macros" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c247af6c2c4ffd372fe97e9afa579b4438e4c306c9aa3f11cbf72f1e845180" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "security-framework" version = "2.4.2" @@ -2630,6 +3152,7 @@ version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ + "indexmap", "itoa", "ryu", "serde", @@ -2668,6 +3191,31 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer", + "digest", + "keccak", + "opaque-debug", +] + [[package]] name = "sharded-slab" version = "0.1.3" @@ -2730,6 +3278,107 @@ dependencies = [ "system-deps 1.3.2", ] +[[package]] +name = "sqlformat" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +dependencies = [ + "itertools", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7911b0031a0247af40095838002999c7a52fba29d9739e93326e71a5a1bc9d43" +dependencies = [ + "sqlx-core", + "sqlx-macros", +] + +[[package]] +name = "sqlx-core" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec89bfaca8f7737439bad16d52b07f1ccd0730520d3bf6ae9d069fe4b641fb1" +dependencies = [ + "ahash", + "atoi", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-channel", + "crossbeam-queue", + "crossbeam-utils", + "either", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-util", + "hashlink", + "hex", + "indexmap", + "itoa", + "libc", + "libsqlite3-sys", + "log", + "memchr", + "num-bigint", + "once_cell", + "parking_lot", + "percent-encoding", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "sqlx-rt", + "stringprep", + "thiserror", + "tokio-stream", + "url", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-macros" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584866c833511b1a152e87a7ee20dee2739746f60c858b3c5209150bc4b466f5" +dependencies = [ + "dotenv", + "either", + "heck", + "once_cell", + "proc-macro2", + "quote", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-rt", + "syn", + "url", +] + +[[package]] +name = "sqlx-rt" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1bd069de53442e7a320f525a6d4deb8bb0621ac7a55f7eccbc2b58b57f43d0" +dependencies = [ + "native-tls", + "once_cell", + "tokio", + "tokio-native-tls", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2776,6 +3425,16 @@ dependencies = [ "quote", ] +[[package]] +name = "stringprep" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "strsim" version = "0.9.3" @@ -2832,6 +3491,29 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn-mid" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "system-deps" version = "1.3.2" @@ -3087,6 +3769,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + [[package]] name = "thin-slice" version = "0.1.1" @@ -3124,11 +3815,12 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -3160,9 +3852,42 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", + "tokio-macros", "winapi", ] +[[package]] +name = "tokio-macros" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.8" @@ -3292,6 +4017,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unsigned-varint" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f8d425fafb8cd76bc3f22aace4af471d3156301d7508f2107e98fbeae10bc7f" + [[package]] name = "url" version = "2.2.2" @@ -3318,6 +4055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ "getrandom 0.2.3", + "serde", ] [[package]] @@ -3375,9 +4113,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" @@ -3533,6 +4271,16 @@ dependencies = [ "cc", ] +[[package]] +name = "whoami" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483a59fee1a93fec90eb08bc2eb4315ef10f4ebc478b3a5fadc969819cb66117" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + [[package]] name = "widestring" version = "0.4.3" diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 9749899..96eab19 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -18,15 +18,22 @@ tauri-build = { version = "1.0.0-beta.4" } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.0.0-beta.8", features = ["api-all"] } -rmp-ipc = "0.4.0" +rmp-ipc = "0.4.3" thiserror = "1.0.30" directories = "4.0.1" toml = "0.5.8" +typemap_rev = "0.1.5" [dependencies.tokio] version = "1.12.0" features = ["fs", "io-std", "io-util"] +[dependencies.mediarepo] +git = "https://github.com/Trivernis/mediarepo-daemon" +rev = "edc5877582cde744fe23c22f31075da792821e77" +features = ["library"] +default-features=false + [features] default = [ "custom-protocol" ] custom-protocol = [ "tauri/custom-protocol" ] diff --git a/mediarepo-ui/src-tauri/src/commands/mod.rs b/mediarepo-ui/src-tauri/src/commands/mod.rs index c426b23..59563d4 100644 --- a/mediarepo-ui/src-tauri/src/commands/mod.rs +++ b/mediarepo-ui/src-tauri/src/commands/mod.rs @@ -1 +1,17 @@ +use crate::context::Context; +use crate::error::AppResult; + pub mod repo; + +#[tauri::command] +pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { + let ipc = context.ipc.read().await; + if let Some(ipc) = &*ipc { + ipc.emitter.emit("info", ()).await?; + println!("Emitted info event."); + } else { + println!("No IPC Context"); + } + + Ok(()) +} diff --git a/mediarepo-ui/src-tauri/src/commands/repo.rs b/mediarepo-ui/src-tauri/src/commands/repo.rs index a76c39b..a0bf1fc 100644 --- a/mediarepo-ui/src-tauri/src/commands/repo.rs +++ b/mediarepo-ui/src-tauri/src/commands/repo.rs @@ -6,6 +6,9 @@ use crate::error::{AppError, AppResult}; use tokio::fs; use crate::settings::save_settings; use rmp_ipc::context::Context as IPCContext; +use tauri::Window; +use crate::ipc::build_ipc_context; +use std::mem; static REPO_CONFIG_FILE: &str = "repo.toml"; @@ -30,6 +33,12 @@ pub async fn get_repositories(context: tauri::State<'_, Context>) -> AppResult) -> AppResult> { + let repo = context.active_repository.read().await; + Ok(repo.clone()) +} + #[tauri::command] pub async fn add_repository(name: String, path: String, context: tauri::State<'_, Context>) -> AppResult> { let repo_path = path.clone(); @@ -54,12 +63,18 @@ pub async fn add_repository(name: String, path: String, context: tauri::State<'_ } #[tauri::command] -pub async fn select_repository(name: String, context: tauri::State<'_, Context>) -> AppResult<()> { +pub async fn select_repository(window: Window, name: String, context: tauri::State<'_, Context>) -> AppResult<()> { let settings = context.settings.read().await; let repo = settings.repositories.get(&name).ok_or(AppError::new(format!("Repository '{}' not found", name)))?; - let ipc = connect(&repo.address).await?; + let ipc = connect(window, &repo.address).await?; let mut ipc_ctx = context.ipc.write().await; - *ipc_ctx = Some(ipc); + let old_ipc = mem::replace(&mut *ipc_ctx, Some(ipc)); + + if let Some(old_ctx) = old_ipc { + old_ctx.stop().await?; + } + let mut active_repo = context.active_repository.write().await; + *active_repo = Some(repo.clone()); Ok(()) } @@ -72,8 +87,6 @@ async fn read_repo_config(path: PathBuf) -> AppResult { } /// Connects to the IPC Server -async fn connect(address: &str) -> AppResult { - let ctx = IPCBuilder::new().address(address).build_client().await?; - - Ok(ctx) +async fn connect(window: Window, address: &str) -> AppResult { + build_ipc_context(window, address).await } diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs index 701dad4..0753627 100644 --- a/mediarepo-ui/src-tauri/src/context.rs +++ b/mediarepo-ui/src-tauri/src/context.rs @@ -6,7 +6,7 @@ use crate::settings::Settings; #[derive(Clone)] pub struct Context { - pub active_repository: Option, + pub active_repository: Arc>>, pub ipc: Arc>>, pub settings: Arc> } @@ -15,7 +15,7 @@ impl Context { pub fn new(settings: Settings) -> Self { Self { ipc: Arc::new(RwLock::new(None)), - active_repository: None, + active_repository: Arc::new(RwLock::new(None)), settings: Arc::new(RwLock::new(settings)) } } diff --git a/mediarepo-ui/src-tauri/src/error.rs b/mediarepo-ui/src-tauri/src/error.rs index ef7eab1..cf00f76 100644 --- a/mediarepo-ui/src-tauri/src/error.rs +++ b/mediarepo-ui/src-tauri/src/error.rs @@ -48,3 +48,15 @@ impl From for AppError { Self::new(format!("Daemon Error: {:?}", e)) } } + +impl From for AppError { + fn from(e: tauri::Error) -> Self { + Self::new(format!("Tauri error: {:?}", e)) + } +} + +impl From for rmp_ipc::error::Error { + fn from(e: AppError) -> Self { + rmp_ipc::error::Error::Message(e.message) + } +} diff --git a/mediarepo-ui/src-tauri/src/ipc/files.rs b/mediarepo-ui/src-tauri/src/ipc/files.rs new file mode 100644 index 0000000..48afb4b --- /dev/null +++ b/mediarepo-ui/src-tauri/src/ipc/files.rs @@ -0,0 +1 @@ +use mediarepo::requests::AddFileRequest; diff --git a/mediarepo-ui/src-tauri/src/ipc/mod.rs b/mediarepo-ui/src-tauri/src/ipc/mod.rs new file mode 100644 index 0000000..2affd4e --- /dev/null +++ b/mediarepo-ui/src-tauri/src/ipc/mod.rs @@ -0,0 +1,45 @@ +mod files; + +use mediarepo::responses::InfoResponse; +use rmp_ipc::context::{Context as IPCContext, Context}; +use rmp_ipc::{Event, IPCBuilder}; +use rmp_ipc::error::Result; +use rmp_ipc::error_event::{ERROR_EVENT_NAME, ErrorEventData}; +use tauri::Window; +use typemap_rev::TypeMapKey; +use crate::error::AppResult; + +pub struct WindowKey; + +impl TypeMapKey for WindowKey { + type Value = Window; +} + +pub async fn build_ipc_context(window: Window, address: &str) -> AppResult { + let ctx = IPCBuilder::new() + .address(address) + .insert::(window) + .on(ERROR_EVENT_NAME, |c, e|Box::pin(handle_error(c, e))) + .on("info", |c, e| Box::pin(handle_info(c, e))) + .build_client().await?; + + Ok(ctx) +} + +async fn handle_error(ctx: &Context, event: Event) -> Result<()> { + let error_data = event.data::()?; + let data = ctx.data.read().await; + let window = data.get::().unwrap(); + window.emit("error", error_data).expect("Failed to emit error event"); + + Ok(()) +} + +async fn handle_info(ctx: &Context, event: Event) -> Result<()> { + let info_data = event.data::()?; + let data = ctx.data.read().await; + let window = data.get::().unwrap(); + window.emit("info", info_data).expect("Failed to emit info event"); + + Ok(()) +} diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index b596766..03cb7b9 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -3,7 +3,8 @@ windows_subsystem = "windows" )] -use crate::commands::repo::{get_repositories, add_repository, select_repository}; +use crate::commands::repo::{get_repositories, add_repository, select_repository, get_active_repository}; +use crate::commands::emit_info; use crate::context::Context; use crate::settings::load_settings; @@ -11,6 +12,7 @@ mod commands; pub mod context; pub mod error; mod settings; +mod ipc; fn main() { let settings = load_settings().expect("Failed to load settings"); @@ -18,7 +20,7 @@ fn main() { tauri::Builder::default() .manage(context) - .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository]) + .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src/app/models/Info.ts b/mediarepo-ui/src/app/models/Info.ts new file mode 100644 index 0000000..e69de29 From 2940f8089a2ac01e8d16afe5a0500d464eac98a0 Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 11 Oct 2021 21:54:38 +0200 Subject: [PATCH 005/183] Add somehow working file content retrieval Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 77 ++++++++----------- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src-tauri/src/commands/files.rs | 29 +++++++ mediarepo-ui/src-tauri/src/commands/mod.rs | 1 + mediarepo-ui/src-tauri/src/commands/repo.rs | 1 - mediarepo-ui/src-tauri/src/main.rs | 3 +- mediarepo-ui/src/app/app.component.ts | 13 +++- mediarepo-ui/src/app/app.module.ts | 38 +++++---- .../file-grid-entry.component.html | 7 ++ .../file-grid-entry.component.scss | 15 ++++ .../file-grid-entry.component.spec.ts | 25 ++++++ .../file-grid-entry.component.ts | 28 +++++++ .../file-grid/file-grid.component.html | 5 ++ .../file-grid/file-grid.component.scss | 4 + .../file-grid/file-grid.component.spec.ts | 25 ++++++ .../file-grid/file-grid.component.ts | 20 +++++ mediarepo-ui/src/app/models/File.ts | 12 +++ mediarepo-ui/src/app/models/Info.ts | 4 + .../src/app/pages/home/home.component.html | 15 +++- .../src/app/pages/home/home.component.sass | 0 .../src/app/pages/home/home.component.scss | 23 ++++++ .../src/app/pages/home/home.component.ts | 8 +- .../error-broker/error-broker.service.ts | 29 ++++++- .../app/services/file/file.service.spec.ts | 16 ++++ .../src/app/services/file/file.service.ts | 39 ++++++++++ .../services/repository/repository.service.ts | 18 ++++- 26 files changed, 382 insertions(+), 75 deletions(-) create mode 100644 mediarepo-ui/src-tauri/src/commands/files.rs create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid.component.html create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid.component.scss create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid.component.ts create mode 100644 mediarepo-ui/src/app/models/File.ts delete mode 100644 mediarepo-ui/src/app/pages/home/home.component.sass create mode 100644 mediarepo-ui/src/app/pages/home/home.component.scss create mode 100644 mediarepo-ui/src/app/services/file/file.service.spec.ts create mode 100644 mediarepo-ui/src/app/services/file/file.service.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 51955d4..c7c82f9 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -186,17 +186,6 @@ dependencies = [ "wildmatch", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.0.1" @@ -951,19 +940,6 @@ dependencies = [ "syn", ] -[[package]] -name = "env_logger" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "fastrand" version = "1.5.0" @@ -1541,12 +1517,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "ico" version = "0.1.0" @@ -1820,9 +1790,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" dependencies = [ - "env_logger", "log", "mediarepo-core", "mediarepo-socket", @@ -1832,7 +1801,7 @@ dependencies = [ [[package]] name = "mediarepo-core" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" dependencies = [ "base64", "multibase", @@ -1850,7 +1819,7 @@ dependencies = [ [[package]] name = "mediarepo-database" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" dependencies = [ "chrono", "mediarepo-core", @@ -1861,11 +1830,13 @@ dependencies = [ [[package]] name = "mediarepo-model" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" dependencies = [ "chrono", "mediarepo-core", "mediarepo-database", + "mime", + "mime_guess", "sea-orm", "serde", "tokio", @@ -1875,7 +1846,7 @@ dependencies = [ [[package]] name = "mediarepo-socket" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=edc5877582cde744fe23c22f31075da792821e77#edc5877582cde744fe23c22f31075da792821e77" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" dependencies = [ "chrono", "mediarepo-core", @@ -1900,6 +1871,22 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.1.4" @@ -3769,15 +3756,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -3990,6 +3968,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.7" diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 96eab19..52dd369 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["fs", "io-std", "io-util"] [dependencies.mediarepo] git = "https://github.com/Trivernis/mediarepo-daemon" -rev = "edc5877582cde744fe23c22f31075da792821e77" +rev = "a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" features = ["library"] default-features=false diff --git a/mediarepo-ui/src-tauri/src/commands/files.rs b/mediarepo-ui/src-tauri/src/commands/files.rs new file mode 100644 index 0000000..4d18c7e --- /dev/null +++ b/mediarepo-ui/src-tauri/src/commands/files.rs @@ -0,0 +1,29 @@ +use mediarepo::requests::ReadFileRequest; +use mediarepo::responses::FileResponse; +use crate::context::Context; +use crate::error::{AppError, AppResult}; + +#[tauri::command] +pub async fn get_all_files(context: tauri::State<'_, Context>) -> AppResult> { + let ipc = context.ipc.read().await; + if let Some(ipc) = &*ipc { + let response = ipc.emitter.emit_to("files", "all_files", ()).await?.await_reply(&ipc).await?; + + Ok(response.data::>()?) + } else { + Err(AppError::new("No ipc connection.")) + } +} + +#[tauri::command] +pub async fn read_file_by_hash(hash: String, context: tauri::State<'_, Context>) -> AppResult> { + let ipc = context.ipc.read().await; + if let Some(ipc) = &*ipc { + let response = ipc.emitter.emit_to("files", "read_file", ReadFileRequest::Hash(hash)).await?.await_reply(&ipc).await?; + + Ok(response.data::>()?) + } else { + Err(AppError::new("No ipc connection.")) + } + +} diff --git a/mediarepo-ui/src-tauri/src/commands/mod.rs b/mediarepo-ui/src-tauri/src/commands/mod.rs index 59563d4..deb16ad 100644 --- a/mediarepo-ui/src-tauri/src/commands/mod.rs +++ b/mediarepo-ui/src-tauri/src/commands/mod.rs @@ -2,6 +2,7 @@ use crate::context::Context; use crate::error::AppResult; pub mod repo; +pub mod files; #[tauri::command] pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { diff --git a/mediarepo-ui/src-tauri/src/commands/repo.rs b/mediarepo-ui/src-tauri/src/commands/repo.rs index a0bf1fc..2f17a9a 100644 --- a/mediarepo-ui/src-tauri/src/commands/repo.rs +++ b/mediarepo-ui/src-tauri/src/commands/repo.rs @@ -1,5 +1,4 @@ use std::path::PathBuf; -use rmp_ipc::IPCBuilder; use serde::{Serialize, Deserialize}; use crate::context::Context; use crate::error::{AppError, AppResult}; diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index 03cb7b9..cee7606 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -4,6 +4,7 @@ )] use crate::commands::repo::{get_repositories, add_repository, select_repository, get_active_repository}; +use crate::commands::files::{get_all_files, read_file_by_hash}; use crate::commands::emit_info; use crate::context::Context; use crate::settings::load_settings; @@ -20,7 +21,7 @@ fn main() { tauri::Builder::default() .manage(context) - .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info]) + .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info, get_all_files, read_file_by_hash]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src/app/app.component.ts b/mediarepo-ui/src/app/app.component.ts index 4f53920..8955f9d 100644 --- a/mediarepo-ui/src/app/app.component.ts +++ b/mediarepo-ui/src/app/app.component.ts @@ -23,10 +23,8 @@ export class AppComponent implements OnInit{ } async ngOnInit() { - this.errorBroker.errorCb = (err: { message: string }) => { - console.error(err); - this.showError(err) - }; + this.errorBroker.errorCb = (err: { message: string }) => this.showError(err); + this.errorBroker.infoCb = (info: string) => this.showInfo(info); await this.dataloaderService.loadData(); if (this.repoService.selectedRepository.getValue() == undefined) { await this.router.navigate(["repositories"]) @@ -39,4 +37,11 @@ export class AppComponent implements OnInit{ duration: 2000, }); } + + private showInfo(info: string) { + this.snackBar.open(info, undefined, { + panelClass: "primary", + duration: 2000, + }); + } } diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 6fd6c2e..8b1854d 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -11,11 +11,15 @@ import {MatCardModule} from "@angular/material/card"; import {MatListModule} from "@angular/material/list"; import {MatButtonModule} from "@angular/material/button"; import {MatToolbarModule} from "@angular/material/toolbar"; -import {MatSnackBar, MatSnackBarModule} from "@angular/material/snack-bar"; +import {MatSnackBarModule} from "@angular/material/snack-bar"; import {MatFormFieldModule} from "@angular/material/form-field"; import {MatInputModule} from "@angular/material/input"; import {ReactiveFormsModule} from "@angular/forms"; import { RepoFormComponent } from './pages/repositories/repo-form/repo-form.component'; +import { FileGridComponent } from './components/file-grid/file-grid.component'; +import {MatSidenavModule} from "@angular/material/sidenav"; +import {MatGridListModule} from "@angular/material/grid-list"; +import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/file-grid-entry.component'; @NgModule({ declarations: [ @@ -23,21 +27,25 @@ import { RepoFormComponent } from './pages/repositories/repo-form/repo-form.comp RepositoriesComponent, HomeComponent, RepositoryCardComponent, - RepoFormComponent + RepoFormComponent, + FileGridComponent, + FileGridEntryComponent, + ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html new file mode 100644 index 0000000..2a71805 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -0,0 +1,7 @@ + + {{file?.name}} + + image + + {{file?.mime_type}}, {{file?.hash}} + diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss new file mode 100644 index 0000000..f506f56 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss @@ -0,0 +1,15 @@ +mat-card, mat-card-content { + height: 100%; + width: 100%; +} + +mat-card-content { + justify-content: center; + text-align: center; +} + +.entry-image { + max-width: 100%; + max-height: 100%; + margin: auto; +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.spec.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.spec.ts new file mode 100644 index 0000000..101b903 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileGridEntryComponent } from './file-grid-entry.component'; + +describe('FileGridEntryComponent', () => { + let component: FileGridEntryComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileGridEntryComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileGridEntryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts new file mode 100644 index 0000000..8aca3b5 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -0,0 +1,28 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {File} from "../../../models/File"; +import {FileService} from "../../../services/file/file.service"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; + +@Component({ + selector: 'app-file-grid-entry', + templateUrl: './file-grid-entry.component.html', + styleUrls: ['./file-grid-entry.component.scss'] +}) +export class FileGridEntryComponent implements OnInit { + + @Input() file: File | undefined; + contentUrl: string | undefined; + constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } + + async ngOnInit(): Promise { + if (this.file) { + console.log(this.file); + try { + this.contentUrl = await this.fileService.readFile(this.file.hash, this.file.mime_type ?? "image/png"); + } catch (err) { + this.errorBroker.showError(err); + } + } + } + +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html new file mode 100644 index 0000000..b86611e --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss new file mode 100644 index 0000000..10b4de1 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss @@ -0,0 +1,4 @@ +app-file-grid-entry { + height: 100%; + width: 100% +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.spec.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.spec.ts new file mode 100644 index 0000000..64af125 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileGridComponent } from './file-grid.component'; + +describe('FileGridComponent', () => { + let component: FileGridComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileGridComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts new file mode 100644 index 0000000..2ec7c09 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import {File} from "../../models/File"; +import {FileService} from "../../services/file/file.service"; + +@Component({ + selector: 'app-file-grid', + templateUrl: './file-grid.component.html', + styleUrls: ['./file-grid.component.scss'] +}) +export class FileGridComponent implements OnInit { + + files: File[] = []; + + constructor(private fileService: FileService) { } + + ngOnInit(): void { + this.fileService.displayedFiles.subscribe((files) => this.files = files); + } + +} diff --git a/mediarepo-ui/src/app/models/File.ts b/mediarepo-ui/src/app/models/File.ts new file mode 100644 index 0000000..4470966 --- /dev/null +++ b/mediarepo-ui/src/app/models/File.ts @@ -0,0 +1,12 @@ +export class File { + constructor( + public name: string | undefined, + public comment: string | undefined, + public hash: string, + public file_type: number, + public mime_type: string | undefined, + public creation_time: Date, + public change_time: Date, + public import_time: Date, + ) {} +} diff --git a/mediarepo-ui/src/app/models/Info.ts b/mediarepo-ui/src/app/models/Info.ts index e69de29..82dc61d 100644 --- a/mediarepo-ui/src/app/models/Info.ts +++ b/mediarepo-ui/src/app/models/Info.ts @@ -0,0 +1,4 @@ +export type Info = { + name: string; + version: string; +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index 5f2c53f..8a787ae 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -1 +1,14 @@ -

home works!

+
+ +

Files

+
+ + +

Drawer

+
+ + + +
+ +
diff --git a/mediarepo-ui/src/app/pages/home/home.component.sass b/mediarepo-ui/src/app/pages/home/home.component.sass deleted file mode 100644 index e69de29..0000000 diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss new file mode 100644 index 0000000..919cc8b --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -0,0 +1,23 @@ +#content { + height: 100vh; + width: 100vw; + position: absolute; + left: 0; + top: 0; + margin: 0; + overflow: hidden +} + +mat-drawer { + height: 100%; +} + +mat-drawer-content { + overflow-x: hidden; + overflow-y: auto; + height: 100%; +} + +mat-drawer-container { + height: 100%; +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index eccb3e6..a28cc3c 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -1,15 +1,17 @@ import { Component, OnInit } from '@angular/core'; +import {FileService} from "../../services/file/file.service"; @Component({ selector: 'app-home', templateUrl: './home.component.html', - styleUrls: ['./home.component.sass'] + styleUrls: ['./home.component.scss'] }) export class HomeComponent implements OnInit { - constructor() { } + constructor(private fileService: FileService) { } - ngOnInit(): void { + async ngOnInit() { + await this.fileService.getFiles(); } } diff --git a/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts b/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts index a9e6a00..860e14e 100644 --- a/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts +++ b/mediarepo-ui/src/app/services/error-broker/error-broker.service.ts @@ -1,5 +1,6 @@ -import { Injectable } from '@angular/core'; +import {Injectable, OnInit} from '@angular/core'; import {BehaviorSubject} from "rxjs"; +import {listen} from "@tauri-apps/api/event"; @Injectable({ providedIn: 'root' @@ -7,10 +8,32 @@ import {BehaviorSubject} from "rxjs"; export class ErrorBrokerService { errorCb: Function | undefined; + infoCb: Function | undefined; - constructor() { } + constructor() { + this.registerListener(); + } + + async registerListener() { + const _unlisten = await listen("error", event => { + const payload: any = event.payload; + if (payload.message) { + this.showError(payload) + } else { + this.showError(payload.toString()) + } + }) + } + + showInfo(info: string) { + console.log(info); + if (this.infoCb) { + this.infoCb(info); + } + } - showError(error: {message: String}) { + showError(error: {message: string}) { + console.error(error); if (this.errorCb) { if (!error.message) { this.errorCb({message: error}); diff --git a/mediarepo-ui/src/app/services/file/file.service.spec.ts b/mediarepo-ui/src/app/services/file/file.service.spec.ts new file mode 100644 index 0000000..35474aa --- /dev/null +++ b/mediarepo-ui/src/app/services/file/file.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FileService } from './file.service'; + +describe('FileService', () => { + let service: FileService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FileService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts new file mode 100644 index 0000000..8e1035c --- /dev/null +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -0,0 +1,39 @@ +import {Inject, Injectable} from '@angular/core'; +import {BehaviorSubject} from "rxjs"; +import {File} from "../../models/File"; +import {invoke} from "@tauri-apps/api/tauri"; +import {DOCUMENT} from "@angular/common"; + +@Injectable({ + providedIn: 'root' +}) +export class FileService { + + displayedFiles = new BehaviorSubject([]); + + constructor(@Inject(DOCUMENT) private document: Document) { + + } + + public async getFiles() { + let all_files = await invoke("get_all_files"); + this.displayedFiles.next(all_files.slice(0, 50)); + } + + public async readFile(hash: string, mime_type: string): Promise { + const data = await invoke("read_file_by_hash", {hash}); + const blob = new Blob([new Uint8Array(data)], {type: mime_type}); + return new Promise((res, rej) => { + const reader = new FileReader(); + reader.onload = (e) => { + const url = e.target?.result + if (url === null) { + res(undefined); + } else { + res(url as string) + } + }; + reader.readAsDataURL(blob); + }) + } +} diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts index e556455..e1b998c 100644 --- a/mediarepo-ui/src/app/services/repository/repository.service.ts +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -2,6 +2,9 @@ import { Injectable } from '@angular/core'; import {Repository} from "../../models/Repository"; import {BehaviorSubject, Observable} from "rxjs"; import {invoke} from "@tauri-apps/api/tauri"; +import {listen} from "@tauri-apps/api/event"; +import {Info} from "../../models/Info"; +import {ErrorBrokerService} from "../error-broker/error-broker.service"; @Injectable({ providedIn: 'root' @@ -10,15 +13,28 @@ export class RepositoryService { repositories = new BehaviorSubject([]); public selectedRepository = new BehaviorSubject(undefined); - constructor() {} + constructor(private errorBroker: ErrorBrokerService) { + this.registerListener() + } + + async registerListener() { + await listen("info", (event: { payload: Info }) => { + const message = `Connected to ${event.payload.name}, Version: ${event.payload.version}`; + this.errorBroker.showInfo(message); + }); + } public async loadRepositories() { + let active_repo = await invoke("get_active_repository"); + this.selectedRepository.next(active_repo); + let repos = await invoke("get_repositories"); this.repositories.next(repos); } public async setRepository(repo: Repository) { await invoke("select_repository", {name: repo.name}); + await invoke("emit_info"); this.selectedRepository.next(repo); } From cdc0c5505392abbd6462edcf8701594a16730275 Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 11 Oct 2021 23:25:54 +0200 Subject: [PATCH 006/183] Add image loading bars Signed-off-by: trivernis --- mediarepo-ui/src/app/app.module.ts | 32 ++++++++++--------- .../file-grid-entry.component.html | 8 +++-- .../file-grid-entry.component.scss | 9 ++++-- .../file-grid-entry.component.ts | 3 +- .../file-grid/file-grid.component.html | 2 +- .../src/app/pages/home/home.component.scss | 4 +++ .../src/app/services/file/file.service.ts | 24 +++++--------- 7 files changed, 43 insertions(+), 39 deletions(-) diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 8b1854d..c5a766f 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -20,6 +20,7 @@ import { FileGridComponent } from './components/file-grid/file-grid.component'; import {MatSidenavModule} from "@angular/material/sidenav"; import {MatGridListModule} from "@angular/material/grid-list"; import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/file-grid-entry.component'; +import {MatProgressBarModule} from "@angular/material/progress-bar"; @NgModule({ declarations: [ @@ -31,21 +32,22 @@ import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/f FileGridComponent, FileGridEntryComponent, ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatSidenavModule, - MatGridListModule, - ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, + MatProgressBarModule, + ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html index 2a71805..92071f6 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -1,7 +1,9 @@ {{file?.name}} - - image + + File Image - {{file?.mime_type}}, {{file?.hash}} + + + diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss index f506f56..b5137b5 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss @@ -1,9 +1,12 @@ -mat-card, mat-card-content { - height: 100%; - width: 100%; +mat-card { + height: calc(100% - 32px); + width: calc(100% - 32px); + padding: 16px; } mat-card-content { + height: 100%; + width: 100%; justify-content: center; text-align: center; } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 8aca3b5..01d2a13 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -2,6 +2,7 @@ import {Component, Input, OnInit} from '@angular/core'; import {File} from "../../../models/File"; import {FileService} from "../../../services/file/file.service"; import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; +import {SafeResourceUrl} from "@angular/platform-browser"; @Component({ selector: 'app-file-grid-entry', @@ -11,7 +12,7 @@ import {ErrorBrokerService} from "../../../services/error-broker/error-broker.se export class FileGridEntryComponent implements OnInit { @Input() file: File | undefined; - contentUrl: string | undefined; + contentUrl: SafeResourceUrl | undefined; constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } async ngOnInit(): Promise { diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index b86611e..dc94919 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -1,4 +1,4 @@ - + diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index 919cc8b..9477b83 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -21,3 +21,7 @@ mat-drawer-content { mat-drawer-container { height: 100%; } + +app-file-grid { + padding: 1em; +} diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 8e1035c..1400beb 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -1,8 +1,9 @@ -import {Inject, Injectable} from '@angular/core'; +import {Inject, Injectable, Sanitizer} from '@angular/core'; import {BehaviorSubject} from "rxjs"; import {File} from "../../models/File"; import {invoke} from "@tauri-apps/api/tauri"; import {DOCUMENT} from "@angular/common"; +import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; @Injectable({ providedIn: 'root' @@ -11,29 +12,20 @@ export class FileService { displayedFiles = new BehaviorSubject([]); - constructor(@Inject(DOCUMENT) private document: Document) { + constructor(@Inject(DomSanitizer) private sanitizer: DomSanitizer) { } public async getFiles() { let all_files = await invoke("get_all_files"); - this.displayedFiles.next(all_files.slice(0, 50)); + this.displayedFiles.next(all_files.slice(70, 100)); } - public async readFile(hash: string, mime_type: string): Promise { + public async readFile(hash: string, mime_type: string): Promise { const data = await invoke("read_file_by_hash", {hash}); const blob = new Blob([new Uint8Array(data)], {type: mime_type}); - return new Promise((res, rej) => { - const reader = new FileReader(); - reader.onload = (e) => { - const url = e.target?.result - if (url === null) { - res(undefined); - } else { - res(url as string) - } - }; - reader.readAsDataURL(blob); - }) + + const url = URL?.createObjectURL(blob); + return this.sanitizer.bypassSecurityTrustResourceUrl(url); } } From f3446c86964ef082aea2490956d9d6223a6be153 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 16 Oct 2021 15:05:51 +0200 Subject: [PATCH 007/183] Add thumbnails and improve performance Signed-off-by: trivernis --- mediarepo-ui/package.json | 4 +- mediarepo-ui/src-tauri/Cargo.lock | 118 ++++++++++++++++-- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src-tauri/src/commands/files.rs | 28 ++++- mediarepo-ui/src-tauri/src/ipc/files.rs | 1 - mediarepo-ui/src-tauri/src/main.rs | 4 +- mediarepo-ui/src/app/app.module.ts | 4 + .../file-grid-entry.component.html | 4 +- .../file-grid-entry.component.scss | 2 +- .../file-grid-entry.component.ts | 34 +++-- .../file-grid/file-grid.component.html | 12 +- .../file-grid/file-grid.component.scss | 11 +- .../file-grid/file-grid.component.ts | 13 +- mediarepo-ui/src/app/models/Thumbnail.ts | 6 + .../src/app/pages/home/home.component.html | 2 +- .../src/app/pages/home/home.component.scss | 3 +- .../src/app/pages/home/home.component.ts | 15 +++ .../src/app/services/file/file.service.ts | 15 ++- mediarepo-ui/yarn.lock | 14 ++- 19 files changed, 243 insertions(+), 49 deletions(-) create mode 100644 mediarepo-ui/src/app/models/Thumbnail.ts diff --git a/mediarepo-ui/package.json b/mediarepo-ui/package.json index db1d209..66073b1 100644 --- a/mediarepo-ui/package.json +++ b/mediarepo-ui/package.json @@ -23,6 +23,8 @@ "@angular/platform-browser-dynamic": "~12.2.0", "@angular/router": "~12.2.0", "@tauri-apps/api": "^1.0.0-beta.8", + "primeicons": "^4.1.0", + "primeng": "^12.2.1", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" @@ -50,4 +52,4 @@ "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.3.5" } -} \ No newline at end of file +} diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index c7c82f9..5dfc3a1 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -55,7 +55,7 @@ version = "0.1.0" dependencies = [ "directories", "mediarepo", - "rmp-ipc", + "rmp-ipc 0.4.3", "serde", "serde_json", "tauri", @@ -306,6 +306,12 @@ version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +[[package]] +name = "bytemuck" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" + [[package]] name = "byteorder" version = "1.4.3" @@ -460,6 +466,12 @@ dependencies = [ "objc", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "com" version = "0.2.0" @@ -1256,6 +1268,16 @@ dependencies = [ "wasi 0.10.0+wasi-snapshot-preview1", ] +[[package]] +name = "gif" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gio" version = "0.14.8" @@ -1562,6 +1584,25 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "gif", + "jpeg-decoder", + "num-iter", + "num-rational", + "num-traits", + "png 0.16.8", + "scoped_threadpool", + "tiff", +] + [[package]] name = "indexmap" version = "1.7.0" @@ -1648,6 +1689,15 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" +dependencies = [ + "rayon", +] + [[package]] name = "js-sys" version = "0.3.55" @@ -1790,7 +1840,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" dependencies = [ "log", "mediarepo-core", @@ -1801,12 +1851,14 @@ dependencies = [ [[package]] name = "mediarepo-core" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" dependencies = [ "base64", + "futures", + "image", "multibase", "multihash", - "rmp-ipc", + "rmp-ipc 0.6.0", "sea-orm", "serde", "sqlx", @@ -1818,8 +1870,8 @@ dependencies = [ [[package]] name = "mediarepo-database" -version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +version = "0.2.0" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" dependencies = [ "chrono", "mediarepo-core", @@ -1830,7 +1882,7 @@ dependencies = [ [[package]] name = "mediarepo-model" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" dependencies = [ "chrono", "mediarepo-core", @@ -1846,12 +1898,11 @@ dependencies = [ [[package]] name = "mediarepo-socket" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=a928f5e42eb7a8ce524d3722a4f5ae05889e52ba#a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" dependencies = [ "chrono", "mediarepo-core", "mediarepo-model", - "rmp-ipc", "serde", "tokio", ] @@ -2147,6 +2198,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -2878,6 +2940,21 @@ dependencies = [ "typemap_rev", ] +[[package]] +name = "rmp-ipc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd5082cefa9a4407327087d75dfadb5bf2d6f07168d0b609a2509f54fa3b243" +dependencies = [ + "lazy_static", + "log", + "rmp-serde", + "serde", + "thiserror", + "tokio", + "typemap_rev", +] + [[package]] name = "rmp-serde" version = "0.15.5" @@ -2958,6 +3035,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + [[package]] name = "scopeguard" version = "1.1.0" @@ -3791,6 +3874,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" +dependencies = [ + "jpeg-decoder", + "miniz_oxide 0.4.4", + "weezl", +] + [[package]] name = "time" version = "0.1.44" @@ -4249,6 +4343,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "weezl" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" + [[package]] name = "wepoll-ffi" version = "0.1.2" diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 52dd369..077db0e 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["fs", "io-std", "io-util"] [dependencies.mediarepo] git = "https://github.com/Trivernis/mediarepo-daemon" -rev = "a928f5e42eb7a8ce524d3722a4f5ae05889e52ba" +rev = "57308089d58706ee1438f6b55d53691e9e08ce6b" features = ["library"] default-features=false diff --git a/mediarepo-ui/src-tauri/src/commands/files.rs b/mediarepo-ui/src-tauri/src/commands/files.rs index 4d18c7e..682b0ad 100644 --- a/mediarepo-ui/src-tauri/src/commands/files.rs +++ b/mediarepo-ui/src-tauri/src/commands/files.rs @@ -1,5 +1,6 @@ -use mediarepo::requests::ReadFileRequest; -use mediarepo::responses::FileResponse; +use mediarepo::requests::{GetFileThumbnailsRequest, ReadFileRequest}; +use mediarepo::responses::{FileResponse, ThumbnailResponse}; + use crate::context::Context; use crate::error::{AppError, AppResult}; @@ -25,5 +26,28 @@ pub async fn read_file_by_hash(hash: String, context: tauri::State<'_, Context>) } else { Err(AppError::new("No ipc connection.")) } +} + +#[tauri::command] +pub async fn get_thumbnails(hash: String, context: tauri::State<'_, Context>) -> AppResult> { + let ipc = context.ipc.read().await; + if let Some(ipc) = &*ipc { + let response = ipc.emitter.emit_to("files", "get_thumbnails", GetFileThumbnailsRequest::Hash(hash)).await?.await_reply(&ipc).await?; + Ok(response.data::>()?) + } else { + Err(AppError::new("No ipc connection.")) + } +} + +#[tauri::command] +pub async fn read_thumbnail(hash: String, context: tauri::State<'_, Context>) -> AppResult> { + let ipc = context.ipc.read().await; + if let Some(ipc) = &*ipc { + let response = ipc.emitter.emit_to("files", "read_thumbnail", hash).await?.await_reply(&ipc).await?; + + Ok(response.data::>()?) + } else { + Err(AppError::new("No ipc connection.")) + } } diff --git a/mediarepo-ui/src-tauri/src/ipc/files.rs b/mediarepo-ui/src-tauri/src/ipc/files.rs index 48afb4b..e69de29 100644 --- a/mediarepo-ui/src-tauri/src/ipc/files.rs +++ b/mediarepo-ui/src-tauri/src/ipc/files.rs @@ -1 +0,0 @@ -use mediarepo::requests::AddFileRequest; diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index cee7606..bd94925 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -4,7 +4,7 @@ )] use crate::commands::repo::{get_repositories, add_repository, select_repository, get_active_repository}; -use crate::commands::files::{get_all_files, read_file_by_hash}; +use crate::commands::files::*; use crate::commands::emit_info; use crate::context::Context; use crate::settings::load_settings; @@ -21,7 +21,7 @@ fn main() { tauri::Builder::default() .manage(context) - .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info, get_all_files, read_file_by_hash]) + .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info, get_all_files, read_file_by_hash, get_thumbnails, read_thumbnail]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index c5a766f..72dc4f3 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -21,6 +21,8 @@ import {MatSidenavModule} from "@angular/material/sidenav"; import {MatGridListModule} from "@angular/material/grid-list"; import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/file-grid-entry.component'; import {MatProgressBarModule} from "@angular/material/progress-bar"; +import {MatPaginatorModule} from "@angular/material/paginator"; +import {ScrollingModule} from "@angular/cdk/scrolling"; @NgModule({ declarations: [ @@ -47,6 +49,8 @@ import {MatProgressBarModule} from "@angular/material/progress-bar"; MatSidenavModule, MatGridListModule, MatProgressBarModule, + MatPaginatorModule, + ScrollingModule, ], providers: [], bootstrap: [AppComponent] diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html index 92071f6..0f9e73a 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -1,7 +1,7 @@ - + {{file?.name}} - File Image + File Image diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss index b5137b5..4af898b 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss @@ -1,7 +1,6 @@ mat-card { height: calc(100% - 32px); width: calc(100% - 32px); - padding: 16px; } mat-card-content { @@ -14,5 +13,6 @@ mat-card-content { .entry-image { max-width: 100%; max-height: 100%; + height: auto; margin: auto; } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 01d2a13..33efb6e 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -1,8 +1,16 @@ -import {Component, Input, OnInit} from '@angular/core'; +import { + AfterContentChecked, + Component, + Input, + OnInit, + ViewChild, + ElementRef, AfterViewInit +} from '@angular/core'; import {File} from "../../../models/File"; import {FileService} from "../../../services/file/file.service"; import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; import {SafeResourceUrl} from "@angular/platform-browser"; +import {MatCard} from "@angular/material/card"; @Component({ selector: 'app-file-grid-entry', @@ -11,19 +19,23 @@ import {SafeResourceUrl} from "@angular/platform-browser"; }) export class FileGridEntryComponent implements OnInit { - @Input() file: File | undefined; + @ViewChild("card") card!: ElementRef; + @Input() file!: File; + contentUrl: SafeResourceUrl | undefined; constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } - async ngOnInit(): Promise { - if (this.file) { - console.log(this.file); - try { - this.contentUrl = await this.fileService.readFile(this.file.hash, this.file.mime_type ?? "image/png"); - } catch (err) { - this.errorBroker.showError(err); - } - } + async ngOnInit() { + await this.loadImage(); } + async loadImage() { + try { + const thumbnails = await this.fileService.getThumbnails(this.file.hash); + let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); + this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); + } catch (err) { + this.errorBroker.showError(err); + } + } } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index dc94919..5bca9ec 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -1,5 +1,7 @@ - - - - - + +
+
+ +
+
+
diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss index 10b4de1..dc20e1c 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.scss @@ -1,4 +1,13 @@ app-file-grid-entry { + height: 250px; + width: 100%; + padding: 5px; +} + +.file-scroll { height: 100%; - width: 100% +} + +.file-row { + display: flex; } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index 2ec7c09..c6a47aa 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, Input, OnInit} from '@angular/core'; import {File} from "../../models/File"; import {FileService} from "../../services/file/file.service"; @@ -7,14 +7,9 @@ import {FileService} from "../../services/file/file.service"; templateUrl: './file-grid.component.html', styleUrls: ['./file-grid.component.scss'] }) -export class FileGridComponent implements OnInit { +export class FileGridComponent { - files: File[] = []; - - constructor(private fileService: FileService) { } - - ngOnInit(): void { - this.fileService.displayedFiles.subscribe((files) => this.files = files); - } + @Input() fileRows: File[][] = []; + constructor() { } } diff --git a/mediarepo-ui/src/app/models/Thumbnail.ts b/mediarepo-ui/src/app/models/Thumbnail.ts new file mode 100644 index 0000000..8acbb90 --- /dev/null +++ b/mediarepo-ui/src/app/models/Thumbnail.ts @@ -0,0 +1,6 @@ +export type Thumbnail = { + hash: string, + height: number, + width: number, + mime: string | undefined +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index 8a787ae..f3df0d8 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -7,7 +7,7 @@

Drawer

- + diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index 9477b83..c6d00f6 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -10,6 +10,7 @@ mat-drawer { height: 100%; + width: 25%; } mat-drawer-content { @@ -23,5 +24,5 @@ mat-drawer-container { } app-file-grid { - padding: 1em; + padding: 0; } diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index a28cc3c..d7d030a 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -1,5 +1,7 @@ import { Component, OnInit } from '@angular/core'; import {FileService} from "../../services/file/file.service"; +import {File} from "../../models/File"; +import {PageEvent} from "@angular/material/paginator"; @Component({ selector: 'app-home', @@ -8,10 +10,23 @@ import {FileService} from "../../services/file/file.service"; }) export class HomeComponent implements OnInit { + fileRows: File[][] = []; + page: number = 0; + pageSize: number = 25; + constructor(private fileService: FileService) { } async ngOnInit() { + this.fileService.displayedFiles.subscribe((files) => this.setFileRows(files)); await this.fileService.getFiles(); } + setFileRows(files: File[]) { + this.fileRows = []; + const filesPerRow = 6; + for (let i = 0; i < (Math.ceil(files.length /filesPerRow )); i++) { + this.fileRows.push(files.slice(i * filesPerRow, Math.min(files.length, (i + 1) * filesPerRow))) + } + console.log(this.fileRows); + } } diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 1400beb..3bb2e64 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -4,6 +4,7 @@ import {File} from "../../models/File"; import {invoke} from "@tauri-apps/api/tauri"; import {DOCUMENT} from "@angular/common"; import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; +import {Thumbnail} from "../../models/Thumbnail"; @Injectable({ providedIn: 'root' @@ -18,7 +19,7 @@ export class FileService { public async getFiles() { let all_files = await invoke("get_all_files"); - this.displayedFiles.next(all_files.slice(70, 100)); + this.displayedFiles.next(all_files); } public async readFile(hash: string, mime_type: string): Promise { @@ -28,4 +29,16 @@ export class FileService { const url = URL?.createObjectURL(blob); return this.sanitizer.bypassSecurityTrustResourceUrl(url); } + + public async readThumbnail(thumbnail: Thumbnail): Promise { + let data = await invoke("read_thumbnail", {hash: thumbnail.hash}); + const blob = new Blob([new Uint8Array(data)], {type: thumbnail.mime}); + + const url = URL?.createObjectURL(blob); + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } + + public async getThumbnails(hash: string): Promise { + return await invoke("get_thumbnails", {hash}); + } } diff --git a/mediarepo-ui/yarn.lock b/mediarepo-ui/yarn.lock index 9e06e4f..468774b 100644 --- a/mediarepo-ui/yarn.lock +++ b/mediarepo-ui/yarn.lock @@ -8272,6 +8272,18 @@ pretty-bytes@^5.3.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +primeicons@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/primeicons/-/primeicons-4.1.0.tgz#19eaef8ef5594b0006358ae64e738d03e167c9bb" + integrity sha512-uEv2pSPk1zQCfaB2VgnUfnUxxlGryYi+5rbdxmZBBt5v9S/pscIQYS5YDLxsQZ7D9jn5c76+Tx5wX/2J1nK6sA== + +primeng@^12.2.1: + version "12.2.1" + resolved "https://registry.yarnpkg.com/primeng/-/primeng-12.2.1.tgz#a01f6207b6e65dc22dbafc7ffa97ae6d0a43cf86" + integrity sha512-2Nr/ASCq7SsLutFm/mBjudqCr31pO596qDs8zA6VcNMw0FmXjM85YqeHWB8hc4hlDzky4BHAuIKphvT4ykA+xw== + dependencies: + tslib "^2.1.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9938,7 +9950,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.2.0, tslib@^2.3.0: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== From 1b1451d910f766ff87f6cb43cb4cbc79ee1e3b0c Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 16 Oct 2021 17:07:30 +0200 Subject: [PATCH 008/183] Add lightboxes and fix memory leak problems Signed-off-by: trivernis --- mediarepo-ui/angular.json | 1 + mediarepo-ui/package.json | 2 ++ mediarepo-ui/src/app/app.module.ts | 2 ++ .../file-grid-entry.component.html | 2 +- .../file-grid-entry.component.ts | 24 +++++++++++++--- .../file-grid/file-grid.component.html | 3 +- .../file-grid/file-grid.component.ts | 4 ++- .../src/app/pages/home/home.component.html | 2 +- .../src/app/pages/home/home.component.ts | 28 ++++++++++++++++++- .../repository-card.component.ts | 1 - .../src/app/services/file/file.service.ts | 12 ++++---- mediarepo-ui/yarn.lock | 25 +++++++++++++++++ 12 files changed, 91 insertions(+), 15 deletions(-) diff --git a/mediarepo-ui/angular.json b/mediarepo-ui/angular.json index 7f49e8e..05c406c 100644 --- a/mediarepo-ui/angular.json +++ b/mediarepo-ui/angular.json @@ -35,6 +35,7 @@ "src/assets" ], "styles": [ + "./node_modules/ngx-lightbox/lightbox.css", "src/styles.scss" ], "scripts": [] diff --git a/mediarepo-ui/package.json b/mediarepo-ui/package.json index 66073b1..0b68184 100644 --- a/mediarepo-ui/package.json +++ b/mediarepo-ui/package.json @@ -23,6 +23,7 @@ "@angular/platform-browser-dynamic": "~12.2.0", "@angular/router": "~12.2.0", "@tauri-apps/api": "^1.0.0-beta.8", + "ngx-lightbox": "^2.5.1", "primeicons": "^4.1.0", "primeng": "^12.2.1", "rxjs": "~6.6.0", @@ -39,6 +40,7 @@ "@angular/cli": "~12.2.9", "@angular/compiler-cli": "~12.2.0", "@tauri-apps/cli": "^1.0.0-beta.10", + "@types/file-saver": "^2.0.3", "@types/jasmine": "~3.8.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "4.28.2", diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 72dc4f3..eb488da 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -23,6 +23,7 @@ import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/f import {MatProgressBarModule} from "@angular/material/progress-bar"; import {MatPaginatorModule} from "@angular/material/paginator"; import {ScrollingModule} from "@angular/cdk/scrolling"; +import {LightboxModule} from "ngx-lightbox"; @NgModule({ declarations: [ @@ -51,6 +52,7 @@ import {ScrollingModule} from "@angular/cdk/scrolling"; MatProgressBarModule, MatPaginatorModule, ScrollingModule, + LightboxModule ], providers: [], bootstrap: [AppComponent] diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html index 0f9e73a..6a9f2d3 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -1,4 +1,4 @@ - + {{file?.name}} File Image diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 33efb6e..6cec473 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -1,26 +1,29 @@ import { - AfterContentChecked, Component, Input, OnInit, ViewChild, - ElementRef, AfterViewInit + ElementRef, Output, EventEmitter, OnDestroy } from '@angular/core'; import {File} from "../../../models/File"; import {FileService} from "../../../services/file/file.service"; import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; import {SafeResourceUrl} from "@angular/platform-browser"; import {MatCard} from "@angular/material/card"; +import {Thumbnail} from "../../../models/Thumbnail"; @Component({ selector: 'app-file-grid-entry', templateUrl: './file-grid-entry.component.html', styleUrls: ['./file-grid-entry.component.scss'] }) -export class FileGridEntryComponent implements OnInit { +export class FileGridEntryComponent implements OnInit, OnDestroy { @ViewChild("card") card!: ElementRef; @Input() file!: File; + @Output() clickEvent = new EventEmitter(); + @Output() dblClickEvent = new EventEmitter(); + selectedThumbnail: Thumbnail | undefined; contentUrl: SafeResourceUrl | undefined; constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } @@ -29,11 +32,24 @@ export class FileGridEntryComponent implements OnInit { await this.loadImage(); } + public ngOnDestroy(): void { + if (this.contentUrl) { + const url = this.contentUrl; + this.contentUrl = undefined; + URL?.revokeObjectURL(url as string); + } + } + async loadImage() { try { const thumbnails = await this.fileService.getThumbnails(this.file.hash); let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); - this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); + this.selectedThumbnail = thumbnail; + if (!thumbnail) { + console.log("Thumbnail is empty?!", thumbnails); + } else { + this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); + } } catch (err) { this.errorBroker.showError(err); } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index 5bca9ec..f1d4237 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -1,7 +1,8 @@
- +
diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index c6a47aa..d113a1e 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, OnInit} from '@angular/core'; +import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {File} from "../../models/File"; import {FileService} from "../../services/file/file.service"; @@ -10,6 +10,8 @@ import {FileService} from "../../services/file/file.service"; export class FileGridComponent { @Input() fileRows: File[][] = []; + @Output() fileDblClickEvent = new EventEmitter(); + @Output() fileClickEvent = new EventEmitter(); constructor() { } } diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index f3df0d8..d1cd08a 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -7,7 +7,7 @@

Drawer

- + diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index d7d030a..5a0783e 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -2,6 +2,8 @@ import { Component, OnInit } from '@angular/core'; import {FileService} from "../../services/file/file.service"; import {File} from "../../models/File"; import {PageEvent} from "@angular/material/paginator"; +import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; +import {SafeResourceUrl} from "@angular/platform-browser"; @Component({ selector: 'app-home', @@ -14,7 +16,7 @@ export class HomeComponent implements OnInit { page: number = 0; pageSize: number = 25; - constructor(private fileService: FileService) { } + constructor(private fileService: FileService, private lightbox: Lightbox, private lightboxEvent: LightboxEvent) { } async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.setFileRows(files)); @@ -29,4 +31,28 @@ export class HomeComponent implements OnInit { } console.log(this.fileRows); } + + async openFile(file: File) { + let url = await this.fileService.readFile(file.hash, file.mime_type ?? "image/png"); + + let albums = [ + { + src: url as string, + caption: file.name ?? file.comment, + thumb: url as string, + } + ]; + this.lightbox.open(albums, 0, { + disableScrolling: true, + showImageNumberLabel: false, + showDownloadButton: true, + centerVertically: true, + }); + const lighboxSubscription = this.lightboxEvent.lightboxEvent$.subscribe((event: any) => { + if (event?.id == LIGHTBOX_EVENT.CLOSE) { + lighboxSubscription.unsubscribe(); + URL?.revokeObjectURL(url as string); + } + }) + } } diff --git a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts index a98006b..e491129 100644 --- a/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts +++ b/mediarepo-ui/src/app/pages/repositories/repository-card/repository-card.component.ts @@ -2,7 +2,6 @@ import {Component, Input, OnInit} from '@angular/core'; import {Repository} from "../../../models/Repository"; import {RepositoryService} from "../../../services/repository/repository.service"; import {Router} from "@angular/router"; -import {MatSnackBar} from "@angular/material/snack-bar"; import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; @Component({ diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 3bb2e64..4c85cbf 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -2,7 +2,6 @@ import {Inject, Injectable, Sanitizer} from '@angular/core'; import {BehaviorSubject} from "rxjs"; import {File} from "../../models/File"; import {invoke} from "@tauri-apps/api/tauri"; -import {DOCUMENT} from "@angular/common"; import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; import {Thumbnail} from "../../models/Thumbnail"; @@ -26,19 +25,22 @@ export class FileService { const data = await invoke("read_file_by_hash", {hash}); const blob = new Blob([new Uint8Array(data)], {type: mime_type}); - const url = URL?.createObjectURL(blob); - return this.sanitizer.bypassSecurityTrustResourceUrl(url); + return this.createSafeObjectUrl(blob); } public async readThumbnail(thumbnail: Thumbnail): Promise { let data = await invoke("read_thumbnail", {hash: thumbnail.hash}); const blob = new Blob([new Uint8Array(data)], {type: thumbnail.mime}); - const url = URL?.createObjectURL(blob); - return this.sanitizer.bypassSecurityTrustResourceUrl(url); + return this.createSafeObjectUrl(blob); } public async getThumbnails(hash: string): Promise { return await invoke("get_thumbnails", {hash}); } + + createSafeObjectUrl(blob: Blob): SafeResourceUrl { + const url = URL?.createObjectURL(blob); + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } } diff --git a/mediarepo-ui/yarn.lock b/mediarepo-ui/yarn.lock index 468774b..1621deb 100644 --- a/mediarepo-ui/yarn.lock +++ b/mediarepo-ui/yarn.lock @@ -1572,6 +1572,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== +"@types/file-saver@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.3.tgz#b734c4f5a04d20615eaed3dc106e2ab321082009" + integrity sha512-MBIou8pd/41jkff7s97B47bc9+p0BszqqDJsO51yDm49uUxeKzrfuNl5fSLC6BpLEWKA8zlwyqALVmXrFwoBHQ== + "@types/glob@^7.1.1": version "7.1.4" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" @@ -4469,6 +4474,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + file-type@5.2.0, file-type@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" @@ -6882,6 +6892,21 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +ngx-filesaver@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/ngx-filesaver/-/ngx-filesaver-8.1.0.tgz#f82a567f70c4ee81fc67b25bf594f3959c371b19" + integrity sha512-xAwThsB/ap9qs7BRgW+mJPWBK60uaqkfPnw3vzbykTdfIvGf62U/6osDCq4TCPl/POWLFui6b3Bu+gfDMqoZhw== + dependencies: + tslib "^1.9.0" + +ngx-lightbox@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ngx-lightbox/-/ngx-lightbox-2.5.1.tgz#1d16b7445296b541c428c71c71b9f763ddc1cef8" + integrity sha512-/EOKxiT8s8pS7CIwAJDrUWt4DsNGdj7fj5ygzZZ4Jdl0iKcfwhGtnpGfrmGZlCeoFDYg5+u1PalFbvYJs0naSQ== + dependencies: + file-saver "^2.0.5" + ngx-filesaver "8.1.0" + nice-napi@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" From 851983c164cce4f1155916005f96a5ceeed7dc99 Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 18 Oct 2021 21:11:09 +0200 Subject: [PATCH 009/183] Fix layout and add selection logic Signed-off-by: trivernis --- mediarepo-ui/src-tauri/tauri.conf.json | 6 +- .../file-grid-entry.component-theme.scss | 27 +++++++ .../file-grid-entry.component.html | 2 +- .../file-grid-entry.component.scss | 2 + .../file-grid-entry.component.ts | 7 +- .../file-grid/file-grid.component.html | 2 +- .../file-grid/file-grid.component.ts | 74 ++++++++++++++++++- .../src/app/pages/home/home.component.scss | 2 +- .../src/app/pages/home/home.component.ts | 35 ++++++--- mediarepo-ui/src/styles.scss | 3 +- 10 files changed, 138 insertions(+), 22 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss diff --git a/mediarepo-ui/src-tauri/tauri.conf.json b/mediarepo-ui/src-tauri/tauri.conf.json index 57a804c..fed9168 100644 --- a/mediarepo-ui/src-tauri/tauri.conf.json +++ b/mediarepo-ui/src-tauri/tauri.conf.json @@ -54,8 +54,8 @@ "windows": [ { "title": "Mediarepo", - "width": 800, - "height": 600, + "width": 1920, + "height": 1080, "resizable": true, "fullscreen": false } @@ -64,4 +64,4 @@ "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" } } -} \ No newline at end of file +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss new file mode 100644 index 0000000..e673d08 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss @@ -0,0 +1,27 @@ +@use 'sass:map'; +@use '~@angular/material' as mat; + +@mixin color($theme) { + $color-config: mat.get-color-config($theme); + $primary-palette: map.get($color-config, 'primary'); + $warn-palette: map.get($color-config, 'warn'); + + mat-card.selected { + background-color: mat.get-color-from-palette($primary-palette); + } +} + +@mixin typography($theme) { +} + +@mixin theme($theme) { + $color-config: mat.get-color-config($theme); + @if $color-config != null { + @include color($theme); + } + + $typography-config: mat.get-typography-config($theme); + @if $typography-config != null { + @include typography($theme); + } +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html index 6a9f2d3..ed5d444 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -1,4 +1,4 @@ - + {{file?.name}} File Image diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss index 4af898b..636b936 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.scss @@ -1,6 +1,8 @@ mat-card { height: calc(100% - 32px); width: calc(100% - 32px); + user-select: none; + cursor: pointer; } mat-card-content { diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 6cec473..1369762 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -20,9 +20,10 @@ import {Thumbnail} from "../../../models/Thumbnail"; export class FileGridEntryComponent implements OnInit, OnDestroy { @ViewChild("card") card!: ElementRef; - @Input() file!: File; - @Output() clickEvent = new EventEmitter(); - @Output() dblClickEvent = new EventEmitter(); + @Input() public file!: File; + @Output() clickEvent = new EventEmitter(); + @Output() dblClickEvent = new EventEmitter(); + public selected: boolean = false; selectedThumbnail: Thumbnail | undefined; contentUrl: SafeResourceUrl | undefined; diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index f1d4237..039bb9e 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -1,7 +1,7 @@
-
diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index d113a1e..b51dff3 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -1,6 +1,14 @@ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; +import { + Component, + EventEmitter, + HostListener, + Input, + OnInit, + Output, QueryList, ViewChildren +} from '@angular/core'; import {File} from "../../models/File"; import {FileService} from "../../services/file/file.service"; +import {FileGridEntryComponent} from "./file-grid-entry/file-grid-entry.component"; @Component({ selector: 'app-file-grid', @@ -11,7 +19,69 @@ export class FileGridComponent { @Input() fileRows: File[][] = []; @Output() fileDblClickEvent = new EventEmitter(); - @Output() fileClickEvent = new EventEmitter(); + @Output() filesSelectEvent = new EventEmitter(); + + @ViewChildren(FileGridEntryComponent) childQuery!: QueryList; + + selectedEntries: FileGridEntryComponent[] = []; + + private shiftClicked = false; + private ctrlClicked = false; constructor() { } + + /** + * File selector logic + * @param {FileGridEntryComponent} entry + */ + setSelectedFile(entry: FileGridEntryComponent) { + if (!(this.shiftClicked || this.ctrlClicked) && this.selectedEntries.length > 0) { + this.selectedEntries.forEach(entry => entry.selected = false); + this.selectedEntries = []; + } + // shift selector (forwards and backwards) + if (this.shiftClicked && this.selectedEntries.length > 0) { + const lastEntry = this.selectedEntries[this.selectedEntries.length - 1]; + let found = false; + + // TODO: change to use wrapped entry files instead because of reused components + for (const child of this.childQuery) { + + if (found) { + child.selected = true; + this.selectedEntries.push(child); + if (child === entry || child == lastEntry) { + break; + } + } else if (child === lastEntry || child === entry) { + found = true; + if (child === entry) { + child.selected = true; + this.selectedEntries.push(child); + } + } + + } + } else { + entry.selected = true; + this.selectedEntries.push(entry); + } + this.filesSelectEvent.emit(this.selectedEntries.map(entry => entry.file)); + } + + @HostListener("window:keydown", ["$event"]) + private handleKeydownEvent(event: KeyboardEvent) { + switch (event.key) { + case "Shift": this.shiftClicked = true; break; + case "Control": this.ctrlClicked = true; break; + } + } + + @HostListener("window:keyup", ["$event"]) + private handleKeyupEvent(event: KeyboardEvent) { + switch (event.key) { + case "Shift": this.shiftClicked = false; break; + case "Control": this.ctrlClicked = false; break; + } + } } diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index c6d00f6..d11bdf8 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -20,7 +20,7 @@ mat-drawer-content { } mat-drawer-container { - height: 100%; + height: calc(100% - 64px); } app-file-grid { diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 5a0783e..9ffc107 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -4,6 +4,7 @@ import {File} from "../../models/File"; import {PageEvent} from "@angular/material/paginator"; import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; import {SafeResourceUrl} from "@angular/platform-browser"; +import {ErrorBrokerService} from "../../services/error-broker/error-broker.service"; @Component({ selector: 'app-home', @@ -13,10 +14,9 @@ import {SafeResourceUrl} from "@angular/platform-browser"; export class HomeComponent implements OnInit { fileRows: File[][] = []; - page: number = 0; - pageSize: number = 25; + private openingLightbox = false; - constructor(private fileService: FileService, private lightbox: Lightbox, private lightboxEvent: LightboxEvent) { } + constructor(private errorBroker: ErrorBrokerService, private fileService: FileService, private lightbox: Lightbox, private lightboxEvent: LightboxEvent) { } async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.setFileRows(files)); @@ -33,7 +33,21 @@ export class HomeComponent implements OnInit { } async openFile(file: File) { - let url = await this.fileService.readFile(file.hash, file.mime_type ?? "image/png"); + if (this.openingLightbox) { + return; + } + this.openingLightbox = true; + try { + await this.openLightbox(file); + } catch(err) { + this.errorBroker.showError(err); + } + this.openingLightbox = false; + } + + private async openLightbox(file: File): Promise { + let url = await this.fileService.readFile(file.hash, + file.mime_type ?? "image/png"); let albums = [ { @@ -48,11 +62,12 @@ export class HomeComponent implements OnInit { showDownloadButton: true, centerVertically: true, }); - const lighboxSubscription = this.lightboxEvent.lightboxEvent$.subscribe((event: any) => { - if (event?.id == LIGHTBOX_EVENT.CLOSE) { - lighboxSubscription.unsubscribe(); - URL?.revokeObjectURL(url as string); - } - }) + const lighboxSubscription = this.lightboxEvent.lightboxEvent$.subscribe( + (event: any) => { + if (event?.id == LIGHTBOX_EVENT.CLOSE) { + lighboxSubscription.unsubscribe(); + URL?.revokeObjectURL(url as string); + } + }) } } diff --git a/mediarepo-ui/src/styles.scss b/mediarepo-ui/src/styles.scss index ca508d2..7d686ba 100644 --- a/mediarepo-ui/src/styles.scss +++ b/mediarepo-ui/src/styles.scss @@ -1,6 +1,7 @@ @use 'sass:map'; @use "~@angular/material" as mat; @use 'src/app/app.component-theme' as app; +@use 'src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme' as file-grid-entry; @include mat.core(); $theme: mat.define-dark-theme(( @@ -17,4 +18,4 @@ $theme: mat.define-dark-theme(( @include mat.all-component-themes($theme); @include app.theme($theme); - +@include file-grid-entry.theme($theme); From e0a42b1b0f6083074948987b881e8bed71387aa7 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 19 Oct 2021 19:48:44 +0200 Subject: [PATCH 010/183] Fix file grid multiselection Signed-off-by: trivernis --- .../file-grid/file-grid-entry/GridEntry.ts | 6 ++ .../file-grid-entry.component-theme.scss | 2 +- .../file-grid-entry.component.html | 4 +- .../file-grid-entry.component.ts | 7 +- .../file-grid/file-grid.component.html | 6 +- .../file-grid/file-grid.component.ts | 86 ++++++++++++------- .../src/app/pages/home/home.component.html | 2 +- .../src/app/pages/home/home.component.ts | 13 +-- 8 files changed, 72 insertions(+), 54 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-grid/file-grid-entry/GridEntry.ts diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/GridEntry.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/GridEntry.ts new file mode 100644 index 0000000..4fadec9 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/GridEntry.ts @@ -0,0 +1,6 @@ +import {File} from "../../../models/File"; + +export type GridEntry = { + file: File, + selected: boolean, +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss index e673d08..23a0b11 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme.scss @@ -7,7 +7,7 @@ $warn-palette: map.get($color-config, 'warn'); mat-card.selected { - background-color: mat.get-color-from-palette($primary-palette); + background-color: mat.get-color-from-palette($primary-palette, 'darker'); } } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html index ed5d444..8aec515 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.html @@ -1,5 +1,5 @@ - - {{file?.name}} + + {{gridEntry.file?.name}} File Image diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 1369762..638e0b8 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -11,6 +11,7 @@ import {ErrorBrokerService} from "../../../services/error-broker/error-broker.se import {SafeResourceUrl} from "@angular/platform-browser"; import {MatCard} from "@angular/material/card"; import {Thumbnail} from "../../../models/Thumbnail"; +import {GridEntry} from "./GridEntry"; @Component({ selector: 'app-file-grid-entry', @@ -20,10 +21,9 @@ import {Thumbnail} from "../../../models/Thumbnail"; export class FileGridEntryComponent implements OnInit, OnDestroy { @ViewChild("card") card!: ElementRef; - @Input() public file!: File; + @Input() public gridEntry!: GridEntry; @Output() clickEvent = new EventEmitter(); @Output() dblClickEvent = new EventEmitter(); - public selected: boolean = false; selectedThumbnail: Thumbnail | undefined; contentUrl: SafeResourceUrl | undefined; @@ -43,9 +43,10 @@ export class FileGridEntryComponent implements OnInit, OnDestroy { async loadImage() { try { - const thumbnails = await this.fileService.getThumbnails(this.file.hash); + const thumbnails = await this.fileService.getThumbnails(this.gridEntry.file.hash); let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); this.selectedThumbnail = thumbnail; + if (!thumbnail) { console.log("Thumbnail is empty?!", thumbnails); } else { diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html index 039bb9e..0f6d782 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.html +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.html @@ -1,8 +1,8 @@ -
+
- +
diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index b51dff3..b4782ef 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -2,71 +2,91 @@ import { Component, EventEmitter, HostListener, - Input, + Input, OnChanges, OnInit, - Output, QueryList, ViewChildren + Output, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; import {File} from "../../models/File"; import {FileService} from "../../services/file/file.service"; import {FileGridEntryComponent} from "./file-grid-entry/file-grid-entry.component"; +import {GridEntry} from "./file-grid-entry/GridEntry"; @Component({ selector: 'app-file-grid', templateUrl: './file-grid.component.html', styleUrls: ['./file-grid.component.scss'] }) -export class FileGridComponent { +export class FileGridComponent implements OnChanges { - @Input() fileRows: File[][] = []; + @Input() files: File[] = []; + @Input() columns: number = 6; @Output() fileDblClickEvent = new EventEmitter(); @Output() filesSelectEvent = new EventEmitter(); - @ViewChildren(FileGridEntryComponent) childQuery!: QueryList; - - selectedEntries: FileGridEntryComponent[] = []; + selectedEntries: GridEntry[] = []; private shiftClicked = false; private ctrlClicked = false; + private gridEntries: GridEntry[] = [] + partitionedGridEntries: GridEntry[][] = []; + + constructor() { + } + + ngOnChanges(changes: SimpleChanges): void { + this.gridEntries = this.files.map(file => {return {file, selected: false}}); + this.setPartitionedGridEntries(); + } - constructor() { } + private setPartitionedGridEntries() { + this.partitionedGridEntries = []; + + for (let i = 0; i < (Math.ceil(this.gridEntries.length / this.columns)); i++) { + this.partitionedGridEntries.push(this.gridEntries.slice(i * this.columns, Math.min(this.gridEntries.length, (i + 1) * this.columns))) + } + } /** * File selector logic - * @param {FileGridEntryComponent} entry + * @param {FileGridEntryComponent} clickedEntry */ - setSelectedFile(entry: FileGridEntryComponent) { + setSelectedFile(clickedEntry: GridEntry) { if (!(this.shiftClicked || this.ctrlClicked) && this.selectedEntries.length > 0) { - this.selectedEntries.forEach(entry => entry.selected = false); + this.selectedEntries.forEach(entry => {if (entry !== clickedEntry) entry.selected = false}); this.selectedEntries = []; } - // shift selector (forwards and backwards) if (this.shiftClicked && this.selectedEntries.length > 0) { - const lastEntry = this.selectedEntries[this.selectedEntries.length - 1]; - let found = false; + this.handleShiftSelect(clickedEntry); + } else { + clickedEntry.selected = !clickedEntry.selected; + this.selectedEntries.push(clickedEntry); + } + this.filesSelectEvent.emit(this.selectedEntries.map(entry => entry.file)); + } - // TODO: change to use wrapped entry files instead because of reused components - for (const child of this.childQuery) { + private handleShiftSelect(clickedEntry: GridEntry): void { + const lastEntry = this.selectedEntries[this.selectedEntries.length - 1]; + let found = false; + if (clickedEntry == lastEntry) { + return; + } - if (found) { - child.selected = true; - this.selectedEntries.push(child); - if (child === entry || child == lastEntry) { - break; - } - } else if (child === lastEntry || child === entry) { - found = true; - if (child === entry) { - child.selected = true; - this.selectedEntries.push(child); - } + for (const gridEntry of this.gridEntries) { + if (found) { + gridEntry.selected = true; + this.selectedEntries.push(gridEntry); + if (gridEntry === clickedEntry || gridEntry == lastEntry) { + return; + } + } else if (gridEntry === lastEntry || gridEntry === clickedEntry) { + found = true; + if (gridEntry === clickedEntry) { + gridEntry.selected = true; + this.selectedEntries.push(gridEntry); } - } - } else { - entry.selected = true; - this.selectedEntries.push(entry); + } - this.filesSelectEvent.emit(this.selectedEntries.map(entry => entry.file)); } @HostListener("window:keydown", ["$event"]) diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index d1cd08a..d770c78 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -7,7 +7,7 @@

Drawer

- + diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 9ffc107..95f057a 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -13,25 +13,16 @@ import {ErrorBrokerService} from "../../services/error-broker/error-broker.servi }) export class HomeComponent implements OnInit { - fileRows: File[][] = []; + files: File[] = []; private openingLightbox = false; constructor(private errorBroker: ErrorBrokerService, private fileService: FileService, private lightbox: Lightbox, private lightboxEvent: LightboxEvent) { } async ngOnInit() { - this.fileService.displayedFiles.subscribe((files) => this.setFileRows(files)); + this.fileService.displayedFiles.subscribe((files) => this.files = files); await this.fileService.getFiles(); } - setFileRows(files: File[]) { - this.fileRows = []; - const filesPerRow = 6; - for (let i = 0; i < (Math.ceil(files.length /filesPerRow )); i++) { - this.fileRows.push(files.slice(i * filesPerRow, Math.min(files.length, (i + 1) * filesPerRow))) - } - console.log(this.fileRows); - } - async openFile(file: File) { if (this.openingLightbox) { return; From aeac1e2e364ebc047f1c13b13b327e90aa5dd3d7 Mon Sep 17 00:00:00 2001 From: trivernis Date: Fri, 22 Oct 2021 22:36:03 +0200 Subject: [PATCH 011/183] Add tag display and file search Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 33 ++----- mediarepo-ui/src-tauri/Cargo.toml | 4 +- mediarepo-ui/src-tauri/src/commands/files.rs | 91 +++++++++++++------ mediarepo-ui/src-tauri/src/commands/mod.rs | 12 ++- mediarepo-ui/src-tauri/src/commands/repo.rs | 33 +++++-- mediarepo-ui/src-tauri/src/commands/tags.rs | 21 +++++ mediarepo-ui/src-tauri/src/context.rs | 10 +- mediarepo-ui/src-tauri/src/ipc/mod.rs | 26 ++++-- mediarepo-ui/src-tauri/src/main.rs | 23 ++++- mediarepo-ui/src/app/app.module.ts | 42 +++++---- .../file-grid/file-grid.component.ts | 14 ++- mediarepo-ui/src/app/models/Tag.ts | 5 + .../src/app/pages/home/home.component.html | 25 ++++- .../src/app/pages/home/home.component.scss | 4 + .../src/app/pages/home/home.component.ts | 47 +++++++++- .../src/app/services/file/file.service.ts | 5 + .../src/app/services/tag/tag.service.spec.ts | 16 ++++ .../src/app/services/tag/tag.service.ts | 15 +++ 18 files changed, 317 insertions(+), 109 deletions(-) create mode 100644 mediarepo-ui/src-tauri/src/commands/tags.rs create mode 100644 mediarepo-ui/src/app/models/Tag.ts create mode 100644 mediarepo-ui/src/app/services/tag/tag.service.spec.ts create mode 100644 mediarepo-ui/src/app/services/tag/tag.service.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 5dfc3a1..700e015 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -55,7 +55,7 @@ version = "0.1.0" dependencies = [ "directories", "mediarepo", - "rmp-ipc 0.4.3", + "rmp-ipc", "serde", "serde_json", "tauri", @@ -1840,7 +1840,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" dependencies = [ "log", "mediarepo-core", @@ -1851,14 +1851,14 @@ dependencies = [ [[package]] name = "mediarepo-core" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" dependencies = [ "base64", "futures", "image", "multibase", "multihash", - "rmp-ipc 0.6.0", + "rmp-ipc", "sea-orm", "serde", "sqlx", @@ -1871,7 +1871,7 @@ dependencies = [ [[package]] name = "mediarepo-database" version = "0.2.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" dependencies = [ "chrono", "mediarepo-core", @@ -1882,7 +1882,7 @@ dependencies = [ [[package]] name = "mediarepo-model" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" dependencies = [ "chrono", "mediarepo-core", @@ -1898,7 +1898,7 @@ dependencies = [ [[package]] name = "mediarepo-socket" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=57308089d58706ee1438f6b55d53691e9e08ce6b#57308089d58706ee1438f6b55d53691e9e08ce6b" +source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" dependencies = [ "chrono", "mediarepo-core", @@ -2927,24 +2927,9 @@ dependencies = [ [[package]] name = "rmp-ipc" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ada2c7329ea55e1e80f2a1ae9ddb123f93ae4b349d493273138118feadfecb" -dependencies = [ - "lazy_static", - "log", - "rmp-serde", - "serde", - "thiserror", - "tokio", - "typemap_rev", -] - -[[package]] -name = "rmp-ipc" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd5082cefa9a4407327087d75dfadb5bf2d6f07168d0b609a2509f54fa3b243" +checksum = "17765aa8bd4d19dd81c53c0707192115f36ec200aea9f4557526932ac1f418e0" dependencies = [ "lazy_static", "log", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 077db0e..b3c07c8 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -18,7 +18,7 @@ tauri-build = { version = "1.0.0-beta.4" } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.0.0-beta.8", features = ["api-all"] } -rmp-ipc = "0.4.3" +rmp-ipc = "0.7.0" thiserror = "1.0.30" directories = "4.0.1" toml = "0.5.8" @@ -30,7 +30,7 @@ features = ["fs", "io-std", "io-util"] [dependencies.mediarepo] git = "https://github.com/Trivernis/mediarepo-daemon" -rev = "57308089d58706ee1438f6b55d53691e9e08ce6b" +rev = "ce93a5793348a05052b324562730d97f5c6e2128" features = ["library"] default-features=false diff --git a/mediarepo-ui/src-tauri/src/commands/files.rs b/mediarepo-ui/src-tauri/src/commands/files.rs index 682b0ad..8d908bd 100644 --- a/mediarepo-ui/src-tauri/src/commands/files.rs +++ b/mediarepo-ui/src-tauri/src/commands/files.rs @@ -1,4 +1,5 @@ -use mediarepo::requests::{GetFileThumbnailsRequest, ReadFileRequest}; +use crate::commands::get_ipc; +use mediarepo::requests::{FindFilesByTagsRequest, GetFileThumbnailsRequest, ReadFileRequest}; use mediarepo::responses::{FileResponse, ThumbnailResponse}; use crate::context::Context; @@ -6,47 +7,83 @@ use crate::error::{AppError, AppResult}; #[tauri::command] pub async fn get_all_files(context: tauri::State<'_, Context>) -> AppResult> { - let ipc = context.ipc.read().await; - if let Some(ipc) = &*ipc { - let response = ipc.emitter.emit_to("files", "all_files", ()).await?.await_reply(&ipc).await?; + let ipc = get_ipc(context).await?; + let response = ipc + .emitter + .emit_to("files", "all_files", ()) + .await? + .await_reply(&ipc) + .await?; - Ok(response.data::>()?) - } else { - Err(AppError::new("No ipc connection.")) - } + Ok(response.data::>()?) } #[tauri::command] -pub async fn read_file_by_hash(hash: String, context: tauri::State<'_, Context>) -> AppResult> { - let ipc = context.ipc.read().await; - if let Some(ipc) = &*ipc { - let response = ipc.emitter.emit_to("files", "read_file", ReadFileRequest::Hash(hash)).await?.await_reply(&ipc).await?; +pub async fn find_files( + tags: Vec, + context: tauri::State<'_, Context>, +) -> AppResult> { + let ipc = get_ipc(context).await?; + let response = ipc + .emitter + .emit_to("files", "find_files", FindFilesByTagsRequest { tags }) + .await? + .await_reply(&ipc) + .await?; + Ok(response.data::>()?) +} - Ok(response.data::>()?) - } else { - Err(AppError::new("No ipc connection.")) - } +#[tauri::command] +pub async fn read_file_by_hash( + hash: String, + context: tauri::State<'_, Context>, +) -> AppResult> { + let ipc = get_ipc(context).await?; + let response = ipc + .emitter + .emit_to("files", "read_file", ReadFileRequest::Hash(hash)) + .await? + .await_reply(&ipc) + .await?; + + Ok(response.data_raw().to_vec()) } #[tauri::command] -pub async fn get_thumbnails(hash: String, context: tauri::State<'_, Context>) -> AppResult> { - let ipc = context.ipc.read().await; - if let Some(ipc) = &*ipc { - let response = ipc.emitter.emit_to("files", "get_thumbnails", GetFileThumbnailsRequest::Hash(hash)).await?.await_reply(&ipc).await?; +pub async fn get_thumbnails( + hash: String, + context: tauri::State<'_, Context>, +) -> AppResult> { + let ipc = get_ipc(context).await?; + let response = ipc + .emitter + .emit_to( + "files", + "get_thumbnails", + GetFileThumbnailsRequest::Hash(hash), + ) + .await? + .await_reply(&ipc) + .await?; - Ok(response.data::>()?) - } else { - Err(AppError::new("No ipc connection.")) - } + Ok(response.data::>()?) } #[tauri::command] -pub async fn read_thumbnail(hash: String, context: tauri::State<'_, Context>) -> AppResult> { +pub async fn read_thumbnail( + hash: String, + context: tauri::State<'_, Context>, +) -> AppResult> { let ipc = context.ipc.read().await; if let Some(ipc) = &*ipc { - let response = ipc.emitter.emit_to("files", "read_thumbnail", hash).await?.await_reply(&ipc).await?; + let response = ipc + .emitter + .emit_to("files", "read_thumbnail", hash) + .await? + .await_reply(&ipc) + .await?; - Ok(response.data::>()?) + Ok(response.data_raw().to_vec()) } else { Err(AppError::new("No ipc connection.")) } diff --git a/mediarepo-ui/src-tauri/src/commands/mod.rs b/mediarepo-ui/src-tauri/src/commands/mod.rs index deb16ad..594b24c 100644 --- a/mediarepo-ui/src-tauri/src/commands/mod.rs +++ b/mediarepo-ui/src-tauri/src/commands/mod.rs @@ -1,8 +1,11 @@ +use rmp_ipc::ipc::context::Context as IPCContext; + use crate::context::Context; -use crate::error::AppResult; +use crate::error::{AppError, AppResult}; -pub mod repo; pub mod files; +pub mod repo; +pub mod tags; #[tauri::command] pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { @@ -16,3 +19,8 @@ pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { Ok(()) } + +pub async fn get_ipc(context: tauri::State<'_, Context>) -> AppResult { + let ipc = context.ipc.read().await; + (ipc.clone()).ok_or(AppError::new("No ipc connection.")) +} diff --git a/mediarepo-ui/src-tauri/src/commands/repo.rs b/mediarepo-ui/src-tauri/src/commands/repo.rs index 2f17a9a..37ac99f 100644 --- a/mediarepo-ui/src-tauri/src/commands/repo.rs +++ b/mediarepo-ui/src-tauri/src/commands/repo.rs @@ -1,13 +1,13 @@ -use std::path::PathBuf; -use serde::{Serialize, Deserialize}; use crate::context::Context; use crate::error::{AppError, AppResult}; -use tokio::fs; -use crate::settings::save_settings; -use rmp_ipc::context::Context as IPCContext; -use tauri::Window; use crate::ipc::build_ipc_context; +use crate::settings::save_settings; +use rmp_ipc::ipc::context::Context as IPCContext; +use serde::{Deserialize, Serialize}; use std::mem; +use std::path::PathBuf; +use tauri::Window; +use tokio::fs; static REPO_CONFIG_FILE: &str = "repo.toml"; @@ -33,13 +33,19 @@ pub async fn get_repositories(context: tauri::State<'_, Context>) -> AppResult) -> AppResult> { +pub async fn get_active_repository( + context: tauri::State<'_, Context>, +) -> AppResult> { let repo = context.active_repository.read().await; Ok(repo.clone()) } #[tauri::command] -pub async fn add_repository(name: String, path: String, context: tauri::State<'_, Context>) -> AppResult> { +pub async fn add_repository( + name: String, + path: String, + context: tauri::State<'_, Context>, +) -> AppResult> { let repo_path = path.clone(); let path = PathBuf::from(path); let RepoConfig { listen_address, .. } = read_repo_config(path.join(REPO_CONFIG_FILE)).await?; @@ -62,9 +68,16 @@ pub async fn add_repository(name: String, path: String, context: tauri::State<'_ } #[tauri::command] -pub async fn select_repository(window: Window, name: String, context: tauri::State<'_, Context>) -> AppResult<()> { +pub async fn select_repository( + window: Window, + name: String, + context: tauri::State<'_, Context>, +) -> AppResult<()> { let settings = context.settings.read().await; - let repo = settings.repositories.get(&name).ok_or(AppError::new(format!("Repository '{}' not found", name)))?; + let repo = settings + .repositories + .get(&name) + .ok_or(AppError::new(format!("Repository '{}' not found", name)))?; let ipc = connect(window, &repo.address).await?; let mut ipc_ctx = context.ipc.write().await; let old_ipc = mem::replace(&mut *ipc_ctx, Some(ipc)); diff --git a/mediarepo-ui/src-tauri/src/commands/tags.rs b/mediarepo-ui/src-tauri/src/commands/tags.rs new file mode 100644 index 0000000..1770e30 --- /dev/null +++ b/mediarepo-ui/src-tauri/src/commands/tags.rs @@ -0,0 +1,21 @@ +use crate::commands::get_ipc; +use crate::context::Context; +use crate::error::AppResult; +use mediarepo::requests::FileIdentifier; +use mediarepo::responses::TagResponse; + +#[tauri::command] +pub async fn get_tags_for_file( + hash: String, + context: tauri::State<'_, Context>, +) -> AppResult> { + let ipc = get_ipc(context).await?; + let response = ipc + .emitter + .emit_to("tags", "tags_for_file", FileIdentifier::Hash(hash)) + .await? + .await_reply(&ipc) + .await?; + + Ok(response.data::>()?) +} diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs index 0753627..8e04277 100644 --- a/mediarepo-ui/src-tauri/src/context.rs +++ b/mediarepo-ui/src-tauri/src/context.rs @@ -1,14 +1,14 @@ -use std::sync::Arc; -use tokio::sync::RwLock; -use rmp_ipc::context::Context as IPCContext; use crate::commands::repo::Repository; use crate::settings::Settings; +use rmp_ipc::ipc::context::Context as IPCContext; +use std::sync::Arc; +use tokio::sync::RwLock; #[derive(Clone)] pub struct Context { pub active_repository: Arc>>, pub ipc: Arc>>, - pub settings: Arc> + pub settings: Arc>, } impl Context { @@ -16,7 +16,7 @@ impl Context { Self { ipc: Arc::new(RwLock::new(None)), active_repository: Arc::new(RwLock::new(None)), - settings: Arc::new(RwLock::new(settings)) + settings: Arc::new(RwLock::new(settings)), } } } diff --git a/mediarepo-ui/src-tauri/src/ipc/mod.rs b/mediarepo-ui/src-tauri/src/ipc/mod.rs index 2affd4e..0ab5b7c 100644 --- a/mediarepo-ui/src-tauri/src/ipc/mod.rs +++ b/mediarepo-ui/src-tauri/src/ipc/mod.rs @@ -1,13 +1,14 @@ mod files; +use crate::error::AppResult; use mediarepo::responses::InfoResponse; -use rmp_ipc::context::{Context as IPCContext, Context}; -use rmp_ipc::{Event, IPCBuilder}; use rmp_ipc::error::Result; -use rmp_ipc::error_event::{ERROR_EVENT_NAME, ErrorEventData}; +use rmp_ipc::error_event::{ErrorEventData, ERROR_EVENT_NAME}; +use rmp_ipc::event::Event; +use rmp_ipc::ipc::context::Context as IPCContext; +use rmp_ipc::IPCBuilder; use tauri::Window; use typemap_rev::TypeMapKey; -use crate::error::AppResult; pub struct WindowKey; @@ -19,27 +20,32 @@ pub async fn build_ipc_context(window: Window, address: &str) -> AppResult(window) - .on(ERROR_EVENT_NAME, |c, e|Box::pin(handle_error(c, e))) + .on(ERROR_EVENT_NAME, |c, e| Box::pin(handle_error(c, e))) .on("info", |c, e| Box::pin(handle_info(c, e))) - .build_client().await?; + .build_client() + .await?; Ok(ctx) } -async fn handle_error(ctx: &Context, event: Event) -> Result<()> { +async fn handle_error(ctx: &IPCContext, event: Event) -> Result<()> { let error_data = event.data::()?; let data = ctx.data.read().await; let window = data.get::().unwrap(); - window.emit("error", error_data).expect("Failed to emit error event"); + window + .emit("error", error_data) + .expect("Failed to emit error event"); Ok(()) } -async fn handle_info(ctx: &Context, event: Event) -> Result<()> { +async fn handle_info(ctx: &IPCContext, event: Event) -> Result<()> { let info_data = event.data::()?; let data = ctx.data.read().await; let window = data.get::().unwrap(); - window.emit("info", info_data).expect("Failed to emit info event"); + window + .emit("info", info_data) + .expect("Failed to emit info event"); Ok(()) } diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index bd94925..189a6de 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -3,17 +3,20 @@ windows_subsystem = "windows" )] -use crate::commands::repo::{get_repositories, add_repository, select_repository, get_active_repository}; -use crate::commands::files::*; use crate::commands::emit_info; +use crate::commands::files::*; +use crate::commands::repo::{ + add_repository, get_active_repository, get_repositories, select_repository, +}; +use crate::commands::tags::*; use crate::context::Context; use crate::settings::load_settings; mod commands; pub mod context; pub mod error; -mod settings; mod ipc; +mod settings; fn main() { let settings = load_settings().expect("Failed to load settings"); @@ -21,7 +24,19 @@ fn main() { tauri::Builder::default() .manage(context) - .invoke_handler(tauri::generate_handler![get_repositories, add_repository, select_repository, get_active_repository, emit_info, get_all_files, read_file_by_hash, get_thumbnails, read_thumbnail]) + .invoke_handler(tauri::generate_handler![ + get_repositories, + add_repository, + select_repository, + get_active_repository, + emit_info, + get_all_files, + read_file_by_hash, + get_thumbnails, + read_thumbnail, + get_tags_for_file, + find_files, + ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index eb488da..3045b44 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -24,6 +24,8 @@ import {MatProgressBarModule} from "@angular/material/progress-bar"; import {MatPaginatorModule} from "@angular/material/paginator"; import {ScrollingModule} from "@angular/cdk/scrolling"; import {LightboxModule} from "ngx-lightbox"; +import {MatChipsModule} from "@angular/material/chips"; +import {MatIconModule} from "@angular/material/icon"; @NgModule({ declarations: [ @@ -35,25 +37,27 @@ import {LightboxModule} from "ngx-lightbox"; FileGridComponent, FileGridEntryComponent, ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatSidenavModule, - MatGridListModule, - MatProgressBarModule, - MatPaginatorModule, - ScrollingModule, - LightboxModule - ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, + MatProgressBarModule, + MatPaginatorModule, + ScrollingModule, + LightboxModule, + MatChipsModule, + MatIconModule + ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index b4782ef..7c5c3b3 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -21,7 +21,8 @@ export class FileGridComponent implements OnChanges { @Input() files: File[] = []; @Input() columns: number = 6; @Output() fileDblClickEvent = new EventEmitter(); - @Output() filesSelectEvent = new EventEmitter(); + @Output() fileMultiselectEvent = new EventEmitter(); + @Output() fileSelectEvent = new EventEmitter(); selectedEntries: GridEntry[] = []; @@ -51,6 +52,8 @@ export class FileGridComponent implements OnChanges { * @param {FileGridEntryComponent} clickedEntry */ setSelectedFile(clickedEntry: GridEntry) { + const previousSelectionSize = this.selectedEntries.length; + if (!(this.shiftClicked || this.ctrlClicked) && this.selectedEntries.length > 0) { this.selectedEntries.forEach(entry => {if (entry !== clickedEntry) entry.selected = false}); this.selectedEntries = []; @@ -61,7 +64,13 @@ export class FileGridComponent implements OnChanges { clickedEntry.selected = !clickedEntry.selected; this.selectedEntries.push(clickedEntry); } - this.filesSelectEvent.emit(this.selectedEntries.map(entry => entry.file)); + if (this.selectedEntries.length == 1) { + this.fileSelectEvent.emit(this.selectedEntries.map(entry => entry.file)[0]); + } else if (this.selectedEntries.length == 0 && previousSelectionSize == 1){ + this.fileSelectEvent.emit(undefined); + } else { + this.fileMultiselectEvent.emit(this.selectedEntries.map(entry => entry.file)); + } } private handleShiftSelect(clickedEntry: GridEntry): void { @@ -85,7 +94,6 @@ export class FileGridComponent implements OnChanges { this.selectedEntries.push(gridEntry); } } - } } diff --git a/mediarepo-ui/src/app/models/Tag.ts b/mediarepo-ui/src/app/models/Tag.ts new file mode 100644 index 0000000..a5eb657 --- /dev/null +++ b/mediarepo-ui/src/app/models/Tag.ts @@ -0,0 +1,5 @@ +export type Tag = { + id: number, + name: string, + namespace: string | undefined, +}; diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index d770c78..a93026b 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -4,10 +4,31 @@ -

Drawer

+ + + + {{tag}} + + + + + + +

Tags

+ + {{tag.namespace ? tag.namespace + ':' + tag.name : tag.name}} +
- +
diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index d11bdf8..8cd91d2 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -8,6 +8,10 @@ overflow: hidden } +#tag-search { + width: 100%; +} + mat-drawer { height: 100%; width: 25%; diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 95f057a..a8c22e3 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -5,6 +5,10 @@ import {PageEvent} from "@angular/material/paginator"; import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; import {SafeResourceUrl} from "@angular/platform-browser"; import {ErrorBrokerService} from "../../services/error-broker/error-broker.service"; +import {TagService} from "../../services/tag/tag.service"; +import {Tag} from "../../models/Tag"; +import {MatChipInputEvent} from "@angular/material/chips"; +import {COMMA, ENTER} from "@angular/cdk/keycodes"; @Component({ selector: 'app-home', @@ -14,15 +18,56 @@ import {ErrorBrokerService} from "../../services/error-broker/error-broker.servi export class HomeComponent implements OnInit { files: File[] = []; + tags: Tag[] = []; + searchTags: string[] = []; private openingLightbox = false; + searchInputSeparators = [ENTER, COMMA]; - constructor(private errorBroker: ErrorBrokerService, private fileService: FileService, private lightbox: Lightbox, private lightboxEvent: LightboxEvent) { } + constructor( + private errorBroker: ErrorBrokerService, + private fileService: FileService, + private tagService: TagService, + private lightbox: Lightbox, + private lightboxEvent: LightboxEvent) { } async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.files = files); await this.fileService.getFiles(); } + async onFileSelect(file: File | undefined) { + if (file) { + await this.showFileDetails(file); + } else { + this.clearFileDetails(); + } + } + + clearFileDetails() { + this.tags = []; + } + + async showFileDetails(file: File) { + this.tags = await this.tagService.getTagsForFile(file.hash); + } + + async removeSearchTag(tag: string) { + const index = this.searchTags.indexOf(tag); + if (index >= 0) { + this.searchTags.splice(index, 1); + } + await this.fileService.findFiles(this.searchTags); + } + + async addSearchTag(event: MatChipInputEvent) { + const tag = event.value.trim(); + if (tag.length > 0) { + this.searchTags.push(tag); + event.chipInput?.clear(); + await this.fileService.findFiles(this.searchTags); + } + } + async openFile(file: File) { if (this.openingLightbox) { return; diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 4c85cbf..b01cb3b 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -21,6 +21,11 @@ export class FileService { this.displayedFiles.next(all_files); } + public async findFiles(tags: string[]) { + let files = await invoke("find_files", {tags}); + this.displayedFiles.next(files); + } + public async readFile(hash: string, mime_type: string): Promise { const data = await invoke("read_file_by_hash", {hash}); const blob = new Blob([new Uint8Array(data)], {type: mime_type}); diff --git a/mediarepo-ui/src/app/services/tag/tag.service.spec.ts b/mediarepo-ui/src/app/services/tag/tag.service.spec.ts new file mode 100644 index 0000000..f091e93 --- /dev/null +++ b/mediarepo-ui/src/app/services/tag/tag.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { TagService } from './tag.service'; + +describe('TagService', () => { + let service: TagService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(TagService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/services/tag/tag.service.ts b/mediarepo-ui/src/app/services/tag/tag.service.ts new file mode 100644 index 0000000..0e7f8f8 --- /dev/null +++ b/mediarepo-ui/src/app/services/tag/tag.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import {invoke} from "@tauri-apps/api/tauri"; +import {Tag} from "../../models/Tag"; + +@Injectable({ + providedIn: 'root' +}) +export class TagService { + + constructor() { } + + public async getTagsForFile(hash: string): Promise { + return await invoke("get_tags_for_file", {hash}); + } +} From 2f4d7ff73dfb4e97f1c30c7e6353684bb78d721f Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 23 Oct 2021 21:16:42 +0200 Subject: [PATCH 012/183] Add README Signed-off-by: trivernis --- mediarepo-ui/README.md | 41 ++++++++--------- mediarepo-ui/src-tauri/src/commands/files.rs | 46 ++++++++++--------- mediarepo-ui/src-tauri/src/commands/mod.rs | 19 +++++++- mediarepo-ui/src-tauri/src/commands/tags.rs | 2 +- mediarepo-ui/src-tauri/src/context.rs | 9 ++++ mediarepo-ui/src-tauri/src/main.rs | 21 +++++++++ .../src/app/services/file/file.service.ts | 14 ++---- 7 files changed, 97 insertions(+), 55 deletions(-) diff --git a/mediarepo-ui/README.md b/mediarepo-ui/README.md index c04b2ee..b66efa2 100644 --- a/mediarepo-ui/README.md +++ b/mediarepo-ui/README.md @@ -1,27 +1,26 @@ -# MediarepoUi +

+mediarepo-ui +

+

This repository is a work in progress

-This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.9. +- - - -## Development server +This repository contains a frontend client to connect to the [mediarepo-daemon](https://github.com/Trivernis/mediarepo-daemon). +It is written in tauri (yay). -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. +## Usage -## Code scaffolding +Refer to [the tauri documentation](https://tauri.studio/en/docs/getting-started) for information about setting up your environment to build this project. +With the `cargo-tauri` tooling installed you can run +``` +cargo tauri dev +``` +to start the application in development mode or +``` +cargo tauri build +``` +to bundle the application. -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. +## License -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. +GPL-3 diff --git a/mediarepo-ui/src-tauri/src/commands/files.rs b/mediarepo-ui/src-tauri/src/commands/files.rs index 8d908bd..877ff10 100644 --- a/mediarepo-ui/src-tauri/src/commands/files.rs +++ b/mediarepo-ui/src-tauri/src/commands/files.rs @@ -1,13 +1,13 @@ -use crate::commands::get_ipc; +use crate::commands::{add_once_buffer, get_ipc}; use mediarepo::requests::{FindFilesByTagsRequest, GetFileThumbnailsRequest, ReadFileRequest}; use mediarepo::responses::{FileResponse, ThumbnailResponse}; use crate::context::Context; -use crate::error::{AppError, AppResult}; +use crate::error::AppResult; #[tauri::command] pub async fn get_all_files(context: tauri::State<'_, Context>) -> AppResult> { - let ipc = get_ipc(context).await?; + let ipc = get_ipc(&context).await?; let response = ipc .emitter .emit_to("files", "all_files", ()) @@ -23,7 +23,7 @@ pub async fn find_files( tags: Vec, context: tauri::State<'_, Context>, ) -> AppResult> { - let ipc = get_ipc(context).await?; + let ipc = get_ipc(&context).await?; let response = ipc .emitter .emit_to("files", "find_files", FindFilesByTagsRequest { tags }) @@ -36,17 +36,20 @@ pub async fn find_files( #[tauri::command] pub async fn read_file_by_hash( hash: String, + mime: String, context: tauri::State<'_, Context>, -) -> AppResult> { - let ipc = get_ipc(context).await?; +) -> AppResult { + let ipc = get_ipc(&context).await?; let response = ipc .emitter - .emit_to("files", "read_file", ReadFileRequest::Hash(hash)) + .emit_to("files", "read_file", ReadFileRequest::Hash(hash.clone())) .await? .await_reply(&ipc) .await?; + let raw_data = response.data_raw().to_vec(); + let uri = add_once_buffer(&context, hash, mime, raw_data); - Ok(response.data_raw().to_vec()) + Ok(uri) } #[tauri::command] @@ -54,7 +57,7 @@ pub async fn get_thumbnails( hash: String, context: tauri::State<'_, Context>, ) -> AppResult> { - let ipc = get_ipc(context).await?; + let ipc = get_ipc(&context).await?; let response = ipc .emitter .emit_to( @@ -72,19 +75,18 @@ pub async fn get_thumbnails( #[tauri::command] pub async fn read_thumbnail( hash: String, + mime: String, context: tauri::State<'_, Context>, -) -> AppResult> { - let ipc = context.ipc.read().await; - if let Some(ipc) = &*ipc { - let response = ipc - .emitter - .emit_to("files", "read_thumbnail", hash) - .await? - .await_reply(&ipc) - .await?; +) -> AppResult { + let ipc = get_ipc(&context).await?; + let response = ipc + .emitter + .emit_to("files", "read_thumbnail", hash.clone()) + .await? + .await_reply(&ipc) + .await?; + let raw_data = response.data_raw().to_vec(); + let uri = add_once_buffer(&context, hash, mime, raw_data); - Ok(response.data_raw().to_vec()) - } else { - Err(AppError::new("No ipc connection.")) - } + Ok(uri) } diff --git a/mediarepo-ui/src-tauri/src/commands/mod.rs b/mediarepo-ui/src-tauri/src/commands/mod.rs index 594b24c..91aa347 100644 --- a/mediarepo-ui/src-tauri/src/commands/mod.rs +++ b/mediarepo-ui/src-tauri/src/commands/mod.rs @@ -1,6 +1,6 @@ use rmp_ipc::ipc::context::Context as IPCContext; -use crate::context::Context; +use crate::context::{Context, OnceBuffer}; use crate::error::{AppError, AppResult}; pub mod files; @@ -20,7 +20,22 @@ pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { Ok(()) } -pub async fn get_ipc(context: tauri::State<'_, Context>) -> AppResult { +pub async fn get_ipc(context: &tauri::State<'_, Context>) -> AppResult { let ipc = context.ipc.read().await; (ipc.clone()).ok_or(AppError::new("No ipc connection.")) } + +/// Adds a once-buffer to the buffer store +pub fn add_once_buffer( + context: &tauri::State<'_, Context>, + key: String, + mime: String, + buf: Vec, +) -> String { + let uri = format!("once://{}", key); + let once_buffer = OnceBuffer { mime, buf }; + let mut once_buffers = context.once_buffers.lock().unwrap(); + once_buffers.insert(key, once_buffer); + + uri +} diff --git a/mediarepo-ui/src-tauri/src/commands/tags.rs b/mediarepo-ui/src-tauri/src/commands/tags.rs index 1770e30..8d696ba 100644 --- a/mediarepo-ui/src-tauri/src/commands/tags.rs +++ b/mediarepo-ui/src-tauri/src/commands/tags.rs @@ -9,7 +9,7 @@ pub async fn get_tags_for_file( hash: String, context: tauri::State<'_, Context>, ) -> AppResult> { - let ipc = get_ipc(context).await?; + let ipc = get_ipc(&context).await?; let response = ipc .emitter .emit_to("tags", "tags_for_file", FileIdentifier::Hash(hash)) diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs index 8e04277..34ef383 100644 --- a/mediarepo-ui/src-tauri/src/context.rs +++ b/mediarepo-ui/src-tauri/src/context.rs @@ -1,14 +1,22 @@ use crate::commands::repo::Repository; use crate::settings::Settings; use rmp_ipc::ipc::context::Context as IPCContext; +use std::collections::HashMap; use std::sync::Arc; +use std::sync::Mutex as StdMutex; use tokio::sync::RwLock; +pub struct OnceBuffer { + pub mime: String, + pub buf: Vec, +} + #[derive(Clone)] pub struct Context { pub active_repository: Arc>>, pub ipc: Arc>>, pub settings: Arc>, + pub once_buffers: Arc>>, } impl Context { @@ -17,6 +25,7 @@ impl Context { ipc: Arc::new(RwLock::new(None)), active_repository: Arc::new(RwLock::new(None)), settings: Arc::new(RwLock::new(settings)), + once_buffers: Arc::new(StdMutex::new(HashMap::new())), } } } diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index 189a6de..9ec99f2 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -11,6 +11,8 @@ use crate::commands::repo::{ use crate::commands::tags::*; use crate::context::Context; use crate::settings::load_settings; +use tauri::http::ResponseBuilder; +use tauri::Manager; mod commands; pub mod context; @@ -24,6 +26,25 @@ fn main() { tauri::Builder::default() .manage(context) + .register_uri_scheme_protocol("once", |app, request| { + let context = app.state::(); + let resource_key = request.uri().trim_start_matches("once://"); + let buffer = { + let mut buffers = context.once_buffers.lock().unwrap(); + buffers.remove(resource_key) + }; + if let Some(buffer) = buffer { + ResponseBuilder::new() + .mimetype(&buffer.mime) + .status(200) + .body(buffer.buf) + } else { + ResponseBuilder::new() + .mimetype("text/plain") + .status(404) + .body("Resource not found".as_bytes().to_vec()) + } + }) .invoke_handler(tauri::generate_handler![ get_repositories, add_repository, diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index b01cb3b..dd4d4a7 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -26,18 +26,14 @@ export class FileService { this.displayedFiles.next(files); } - public async readFile(hash: string, mime_type: string): Promise { - const data = await invoke("read_file_by_hash", {hash}); - const blob = new Blob([new Uint8Array(data)], {type: mime_type}); - - return this.createSafeObjectUrl(blob); + public async readFile(hash: string, mime: string): Promise { + const once_uri = await invoke("read_file_by_hash", {hash, mime}); + return this.sanitizer.bypassSecurityTrustResourceUrl(once_uri); } public async readThumbnail(thumbnail: Thumbnail): Promise { - let data = await invoke("read_thumbnail", {hash: thumbnail.hash}); - const blob = new Blob([new Uint8Array(data)], {type: thumbnail.mime}); - - return this.createSafeObjectUrl(blob); + let once_uri = await invoke("read_thumbnail", {hash: thumbnail.hash, mime: thumbnail.mime}); + return this.sanitizer.bypassSecurityTrustResourceUrl(once_uri); } public async getThumbnails(hash: string): Promise { From 0ef9f041da290113da2d4ad3ebcf7063382f539c Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Sat, 23 Oct 2021 19:17:56 +0000 Subject: [PATCH 013/183] [ImgBot] Optimize images *Total -- 59.47kb -> 30.18kb (49.25%) /src-tauri/icons/icon.png -- 13.85kb -> 6.10kb (55.95%) /src-tauri/icons/Square310x310Logo.png -- 8.39kb -> 3.81kb (54.55%) /src-tauri/icons/Square284x284Logo.png -- 7.56kb -> 3.44kb (54.48%) /src-tauri/icons/128x128@2x.png -- 6.85kb -> 3.17kb (53.76%) /src-tauri/icons/Square142x142Logo.png -- 3.77kb -> 1.94kb (48.63%) /src-tauri/icons/Square150x150Logo.png -- 3.87kb -> 2.00kb (48.39%) /src-tauri/icons/128x128.png -- 3.43kb -> 1.84kb (46.3%) /src-tauri/icons/Square107x107Logo.png -- 2.80kb -> 1.57kb (43.97%) /src-tauri/icons/Square89x89Logo.png -- 2.41kb -> 1.41kb (41.69%) /src-tauri/icons/Square71x71Logo.png -- 1.96kb -> 1.23kb (37.54%) /src-tauri/icons/StoreLogo.png -- 1.49kb -> 1.06kb (28.69%) /src-tauri/icons/Square44x44Logo.png -- 1.27kb -> 0.98kb (22.71%) /src-tauri/icons/32x32.png -- 0.95kb -> 0.84kb (11.19%) /src-tauri/icons/Square30x30Logo.png -- 0.88kb -> 0.80kb (9.08%) Signed-off-by: ImgBotApp --- mediarepo-ui/src-tauri/icons/128x128.png | Bin 3512 -> 1886 bytes mediarepo-ui/src-tauri/icons/128x128@2x.png | Bin 7012 -> 3242 bytes mediarepo-ui/src-tauri/icons/32x32.png | Bin 974 -> 865 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 2863 -> 1604 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 3858 -> 1982 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 3966 -> 2047 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 7737 -> 3522 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 903 -> 821 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 8591 -> 3905 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 1299 -> 1004 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 2011 -> 1256 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 2468 -> 1439 bytes mediarepo-ui/src-tauri/icons/StoreLogo.png | Bin 1523 -> 1086 bytes mediarepo-ui/src-tauri/icons/icon.png | Bin 14183 -> 6248 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mediarepo-ui/src-tauri/icons/128x128.png b/mediarepo-ui/src-tauri/icons/128x128.png index 6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b..c51b45a95a099991af3bd2980448d8c0124b3a75 100644 GIT binary patch literal 1886 zcmZ`(do+~m8vh0}?lp4DWt*v)aog;^K@q!*Ta4=v#^vNXM%b8aqS7%+eF*7H7>-~0PL&wAf?t+#;W>#nY% zuL1yoI?=;50E+ajr6dn|$#m&D6cpl}e4GHFnW-v`hC?+v)+4|N08Sf2ygUHd*y1k& zKn4f^OHlw|e;ojHX*VDH{|IfYle`1npeW;jTh;~2x~*j0_-(V=D*uf`Iey#z3xSxO z;C~EKL1ZqZ-3GV#Aetva3j}C^2+Nzm@+WY8LMV}SSz&pT*gh!1LmmQg+!0fr2-`b> z-O5F{zDZ2qBsv>~2K_+4 zNLm$%#^$0HcR{^jF<$Pj0qRkfB~YPE^9cPJ08}-%77Vy?b2kJkrW1YK6z5cQH8pI% znhc_$2VEh$It6A4KZGV_3hj{BVx3Qom!yAiK05gF-H2KH-6At(T+KfYgqIyKcqfxp zl-XE3zz&Q)6H5$5%)Z442Gz!T7XVk$G9^v_{Zd<9`P#tF@f`oVqbI#08p|1`J6cAD zPWDVS%!&=J8nlOGAB^d=NDvTZ`9I>0zm@C^w(BdB4dp-R8mUZO_p4u+{zmONU$%7q zOVJ_)qqn zm-_oJXiVoziR6XcTZ08&x0HukpY(rxp?J@`X$2Tauz92t5KKAu{F&?nW>e3`#xaQU z9QYmgTO>J6XYp~<=fryDlamKZjqAm|0ZC*@hxu8hLmX{V#u@&x!qBnt+$fK-FN)7f zy*8yLWqW@W)8P27B)yHUq4P*1O%8_1&5xof42P)YoC@FMyw2G5O2NY{y71xQ2iZzzskfY&t!;sZ zl~3K*3(!MmjVeY-L6lhq>KmdUHV zR8K+PV}9u;#McgSqEd6Nf3$6e&kObIE$tT>8WxNWcSDmEGewzxV_~ubBP=XjprO#L zCL#V-VvjV>k8vNO+`jkwNRJwtn`1g0bROT2GH)jzSGv&YdarDso3jJG5_U9B*P*RM z)%R*La0zy?Pz|}TV9MV&tTuEE;e^~VY(MIYrP2?_(7l4oS5NhK2~N03;2H#eF8TQ7 zC2B{V`0j;n%iMwaNP|6QUQc_B_JtYBZ4!Tg6@b?A)N#Zth>VClsR?-I>MB*zYyi!AGtvOCM7kK1LSO!AD9u zGvzv@U(U9~DnFcWBe+jD=f9Ef#K5y-*Xfuvhk@%ib>LatizzwbrbU(k`16x^tT?BR*MnlpGa&Btgji;G^$H@VI)*HZ52eNGV$)kYu??+f2w zox>#QHc50!Tv*o#TtB_CCUo2(mm_}RUI&Qp(_v&Bhc1^1AE|a+m|fTAZ!*zW6L=MtVT) z<5>}BCw1Ugb`>F44z40y`>O1a=_0>Be#spA4{_;kA?cLp^f>$2v^XdLR-hH$5)WEh ySqI_|+T(5Q_uG6Ag7zSYAnexoA3<^|C4qYC{|hp|t7?P<0MX6Y^}ch|xqkwhjCIfe literal 3512 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 diff --git a/mediarepo-ui/src-tauri/icons/128x128@2x.png b/mediarepo-ui/src-tauri/icons/128x128@2x.png index e81becee571e96f76aa5667f9324c05e5e7a4479..f4db795a7acb3338303d36f17a8e3bbbe400dd99 100644 GIT binary patch literal 3242 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 W|346~QCcMq0Q(%>9jfgq$^Qn&!rQ|D literal 7012 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 Sh@|!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10;&6aZh%1o(zuy3g4jTPG zX!!q-5eNYp2MiDhC<0Ul6gg!0{~%nw0f>FbQ2FE?^efKofwn$|r6qoCk{BRyclL^~5cpxbn%H{|_3eoV=}k;kB31JE0GB|(0{3<3%U z4fp3KyuUwx{rUcc{r2?*4)Oi_1LpfX+~1$yP+*|&zCU38e1Z20_s<7RsP`8*Zy%q~ z-@m@#zJkJh`717Uz<^_5O!9Vjark#L<_3_%S>O>_%)r1c48n{Iv*t(u1=&kHeO=j~ za)}EIn*UHgqX5)n`-z|IYb#Y=UcH<3=SI5VR;@j5lX@R4@tm~w{twNQn*|u| zEbuz~^+egkIg{T+wCs{EDUa-bbDOJGn4Ljp{+73VZI#Q{#ym>m@6!`yela2C`W73l z$KjLOc8YG}-5h)9_@qbK41Aee+^f0Fg_5FM$Y^t1 zD~}gnQRBy&jV4pwFKPRlOr6KTqoT=tq4M0`X&m~`Cd4s*$+UIKdZm5R;P;n9d;7w6 zp4>V~grRDoY3s@= zNmMD26Er3@$VFl*_#l2{YNTlIm_lsYUGHXnTT?pt60q^-a zhrKNB`G4BD-`_fgCE)gtf%`bbVrN6P2}D5c4AK*FW*?4e99#2|aQcUW;gmh)@zcsz@MQ)%%p9o>dLaX^_>jm}(*c9Frm&yFj0F(F?>$ zNJ1fr{liPO)7dZ!g=uoxrD?Zd@*GOsx+5Cd+|`7Cn(?R{dc*R zq`K=6cQW!(9fm*|iYi$9J$jgsj9xxvynF1}bnK2MkNbRZGWQR12E-r`0ke=1P7PNc zi+_1l3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI`{$e^Nw1y*VbO8wv z`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M>kD~88ry`eSo`tEB zN4>w7OWZwUzlh{WM1m8R6zepqGcGMaU_871T^(b}4s&3|B4H7X(Tk_EsH#|5fES_! lk=ED6J>lcyGNk|E#b0FFb*9)a8rA>+002ovPDHLkV1h^g!gl}w diff --git a/mediarepo-ui/src-tauri/icons/Square107x107Logo.png b/mediarepo-ui/src-tauri/icons/Square107x107Logo.png index 0ca4f27198838968bd60ed7d371bfa23496b7fe5..27a7d78180617aadd6c02cd5a3f3a40d2c1ed556 100644 GIT binary patch literal 1604 zcmZ`(dpy%?82>rsR!Znd%7#sZ+7^oSk!f?k468s^IA!dC?hkYB3mJ3;?vyRb;6oWDN1h8G9Q1I6D?f_rwofPO71n43nG8i#H z6c<_-WI@7!hO;vFGDh*bl!Xjk39SeL^&gE$WF;~rqY^{}iveZ%Ln%A(EJpbItVJ7e ztV)!(JJvTd7D@sWEs96*NdQ=_uQU~)yka9rY9x93;xuNo4fWUW`n+`r3IM87Pb`KI zJNceY-X}!pa#xq+gizMxqiU-(HB~Va6?js9D|hy5#`T*Q9XwOt!^!F9iU+px6YY;O zwg;53KMJK=tV>5~1%=dOokd=ke;ti;xN|<#)F{xjK@=7zh+4UIS*MP0+Ip;D?dt;D zrJl7xj!if0(4iqVH`Ch!#$?X}NX89Rvsy2lKhR&jSRa5+Nv9Hm8d^BJ3BN~>>*%ir zXNe}IFIe*Pu&Jt0!R0h{^r=*ezi>xQAp{vG7 zm=N;B5ZimsxiJcVFnW`{k=pyEF!#3XwAbZp>y1&ow{g66$m)+JZo{r_%xw#@Q>F|^ zPPN0Av4#VkFXBJ^k!`hXY_KgYyi->@-ttnF*CNrfF|l~WKi6?E3ICwDf7+y~@MSaX zKvB7l?)an_Q;9R0z%wJ=Gz*+-pqvgWo|!xpOnmW@Y@F?S#5-=c&9`gghkHMHM||YF zNI&s4LpW9>dFRda8ac7gX8C-yk;f@y0cPQ0h86Ab@vBO^^(o?m{ z^lSZX6XN1WF8K)zg?~*YPDV&UwS3Enbae1grucpJoXTIM#tMS|C8S?HtMw?Co$1TQU)fd)`EUk@b<0k8R zn$^k=OJzsPRS!7!R!yb60zU!(o`fSN9f?dLIYm=RpaW0{6w(%nutn`8ARV2MyPWLp otPuz&1VY_q+)=LZ#Q9;HTqDl?17=S6MgRZ+ literal 2863 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 literal 3858 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 IUBT)91y2yjVE_OC delta 3959 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 diff --git a/mediarepo-ui/src-tauri/icons/Square284x284Logo.png b/mediarepo-ui/src-tauri/icons/Square284x284Logo.png index c021d2ba76619c08969ab688db3b27f29257aa6f..1ec851d2bd8577126f7a9292064a9f1f3e893036 100644 GIT binary patch literal 3522 zcmZ`*c|4SD7oIWJkzJvN#x`WB8OzI9Ldd>^K`Fb)HVn#66KRweQH`+-*%F1yTO=CW zn8=c4vQ8L6Bujd;&G-10KfXWS=XdUNpX)l;Ip=i)2Q*@{w{|iG1guu%e~p4KKLvPM+9bTcUyeEx|PsFU)Y3^zf`)6!{aAywuuQwGT1Gz^p5%#ydosxV zVPvE|k^v8^MfStboFv~GWoz!PSEF#-hQ6**jB5UD^M zAh{wfY)rZ4p<*IJT7N6_!hxKHg^7_<^!VzPUE}fYWBlNo@cy&x4SX`Ez?PA8cVFej z>(x_J-$LHTVK-PTRr-i?h}G3TUw8ku_*UI+YRt!&j5*hTegrRst$F4}C%dVHJW$4* zNlbRB4yIdWw4LAl6#O74)8e<3yI=L2Z2Yha#=KdtxM^xy5f9B!6-Rkom(dojV>E2QO(y|db9`6s=B=E z3r|eUIeV{n6Rv%au0O)0Y;n_{zW(yzNggwpUww3)Msc`Cp4VQHddI^$y&GbVnhaU} zDnA`wLi#c?6T^|^M@{FP;7rtjOi5~0HMhs2uDltm5EPAx`h5Ps1qav!g`_t^NAHl~WaQX*FP zq9ykRq6@0_l@hyErtls@Z9g(d?WX~vL|P*x2=8F$qn>oS}4S5UJ3qvND3+H+VeoK9hJxAZO^t86o@f-+Bpb=Yil{+T1g%%0sjjZnC>C#0LNPPUk+bD`KY z*wjILJ8g}IJXIz<;#u%8+&4mw4Kt~%ahlffZ)c)-+0w4I*=PVl|tZW}eR09^64 zG^P83zqk1EPM8yiyy5kJg+DKl=1%d0L~-4;4}}{QJAS191o!eic}zbVw;sG)c=Ujy z*M_}HU!#LmaC zZfAKB!b&oW8#fHRXN*LHdr(1K)wPL_g0N*b1e(Q4FqPM&*3#{w6ORt_Ar8KS=t^yu zojY>!lb-HM7bW}u^^>33GHbaPZ$|&FXOG~1tL>1s3pN4V?M+$hV-H-MJFEZrV4M9E{U>)LIZS!5o4B7 zXLXfJC!uV?NaL)36v+_$ru6Ltaj0fyhpTK4k@=kb$N>sD|)dy%1s566k-Q{JVwnfFTGSTadQrABSVlqJ`Sr1FOZl9fgPvhk_p06#)FoV|&qSC|>cKpD!GNNybKu+D z_SA)Bs-PzxLR6W_hgP`?Zho}&LuuVtngVZ>baSs06rBRFKWb(mjS&A)#I6l<0ln1FwmB1aGrPg znN!~&=R>B^is0B2H;M|29L-&REgw-p_c5|6zSZ!859ThlTGgI413}%H16%B+wD~Z ztrNU{ZrQ+{J-Dtk7SyA$Z?JPzW#^lQO1ZuNA6mUDlLY&)I`PxHUgD=8wRi4?y-zgp zWz!n_Jae15Q8Kt9-k!mE-P!+7G&l9(3GiSs_hn*dhQsxjhWypLG~ru)f!>#{6@^4awqXKmo|Y)YjzrIZyn*08{vrUH||9 literal 7737 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 diff --git a/mediarepo-ui/src-tauri/icons/Square30x30Logo.png b/mediarepo-ui/src-tauri/icons/Square30x30Logo.png index 621970023096ed9f494ba18ace15421a45cd65fa..446b0cc1c55ea17d78ba14fa79d85d3fcac628bc 100644 GIT binary patch literal 821 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD6uQRC&U#<|KD$bK!*(f zA2j@b$Ot5I5JnyVvJL(p0+T>lpcGKqAw!kpw-wHx2TG|PzomNO&i?}-22fD>#2w`m zw}43X=q;eE!tv`WCvO84s2sbkavUgi2dGBn#BGh^_mxlFRylb`;rxBo6Ssicfyy+F zUk9>PKqlN#J_$rOfhs{Fr*12szO8ohCeV36k^leyJ7qQt16^-j666=mAmET-u>bvh zg@S^H{rUd&_XF(LI|%eA++V-o{e=1V4dNB*=NG)c->_f7f4#u{^Zg3**Uyg+D9E?> zk3V0&b0^Rk#w2fd7uyTDfssHCXMsm#F#`iP(0p!TMuu5)B!GhKC7!;n>`%GGg$2!j zsGm^)>XGquaSYKozjpG?vO@+uF6xXvw>C*|w3?;rMwe%JZ=d=9|2jJfzA~o#7oJw( z%HCE+1#aDsf;8<|Pm4NFS~g2&vG|?YJ9RE;Pug0w_~I57?maHEb`{T7`79f;>CMtG zr(0Ru_O1w?vOJdIsh>Kdz~t+UZ@yk-6>`4C(eSX>KYuBYL$}Ip2AyoVy^~D}Tu-tz zd@S^r>bv7}t%p(N;O*K>p^_j~>3tPa7h1Nozqr?#{`sg7gFtjq%>iv*MjMZyS6b}B z)^ofrDL2R*oovK#UO&i;QEA_{Cck?z7r#EMWl_j_zFoKW$3r9DpI*Q2{Ep6ym~#4T z%gsC9cW+N$a;AjlEv{Qte`$v1KBXs0 zz|_c~TH+c}l9E`GYL#4+3Zxi}42%qQ4GnaSj6)19tqjerOii>646FDTQ8eV{ ar(~v8;?__uyI?I)1B0ilpUXO@geCxYQ&}ef delta 891 zcmV->1BCpw28Rcb8Gi-<0028MuA%?{010qNS#tmY3ljhU3ljkVnw%H_0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0009VNkl8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2Y-ZkLqG;^wpFzND|KwJ`h%2< z$Ua@~umw5TeVAV{;oE3TNTVF530(S~npq)?kf~Uv7lGdSgg^paYAl+2=c-MRN;3JU z2!fza>Wqz;7{N+&WGlu>S5gKd+_S~&S0d9)mJUEK(}%`Bh(be{6cS6d{+R|FOwr6H zT?bz+QGX{K3Oupi7ZS7D(@3r3IYV`+`eAm#_1q-{8;OSVX4+ETh4gvYUhl{1di z%Ci;6iQ4_?6PFM40ZB(`gV2?=y|nlK@FuKXBb<@-J1j+<2L~J@J;%ylE>Fbig{-Er zo*2@8DrJ4ju40VrOww z9jz>O01&#X?Ds@L)Sb{CkG#Yz4$3o@96)?#cz^xWoA}> RB$xmI002ovPDHLkV1mJ6le7Q; diff --git a/mediarepo-ui/src-tauri/icons/Square310x310Logo.png b/mediarepo-ui/src-tauri/icons/Square310x310Logo.png index f9bc04839491e66c07b16ab03743c0c53b4109cc..f57977b66b87f6b056bac3bedb070c768427e9f2 100644 GIT binary patch literal 3905 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 literal 8591 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 DX#c++ delta 1291 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 a&x+a0$oPLlnt4?nGysZk0I_}}E&neUH<>#C delta 2449 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 Zl9^VCTSK|*g0(;m44$rjF6*2UngCTn;IaS! delta 1516 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 Date: Sat, 23 Oct 2021 21:18:09 +0200 Subject: [PATCH 014/183] Create LICENSE --- mediarepo-ui/LICENSE | 674 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 mediarepo-ui/LICENSE diff --git a/mediarepo-ui/LICENSE b/mediarepo-ui/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/mediarepo-ui/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 16de88cf380ee7583977512e4558eeb730e29143 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 23 Oct 2021 23:07:57 +0200 Subject: [PATCH 015/183] Fix issue with unselecting files Signed-off-by: trivernis --- mediarepo-ui/src/app/app.component-theme.scss | 12 +++++++++++ .../file-grid-entry.component.ts | 20 +++++++++---------- .../file-grid/file-grid.component.ts | 9 ++++++++- .../src/app/pages/home/home.component.html | 18 +++++++++++------ .../src/app/pages/home/home.component.scss | 12 +++++++++++ .../src/app/pages/home/home.component.ts | 6 ++++++ 6 files changed, 60 insertions(+), 17 deletions(-) diff --git a/mediarepo-ui/src/app/app.component-theme.scss b/mediarepo-ui/src/app/app.component-theme.scss index 49b102e..3085e01 100644 --- a/mediarepo-ui/src/app/app.component-theme.scss +++ b/mediarepo-ui/src/app/app.component-theme.scss @@ -10,6 +10,18 @@ background-color: darken(mat.get-color-from-palette($primary-palette, 'darker'), 35); color: white } + ::ng-deep ::-webkit-scrollbar { + width: 10px; + } + + ::ng-deep ::-webkit-scrollbar-thumb { + background: mat.get-color-from-palette($primary-palette, 'darker'); + border-radius: 1px; + } + + ::ng-deep ::-webkit-scrollbar-thumb:hover { + background: mat.get-color-from-palette($primary-palette); + } .warn { background-color: mat.get-color-from-palette($warn-palette); diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 638e0b8..0dc7d5b 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -27,6 +27,7 @@ export class FileGridEntryComponent implements OnInit, OnDestroy { selectedThumbnail: Thumbnail | undefined; contentUrl: SafeResourceUrl | undefined; + constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } async ngOnInit() { @@ -37,21 +38,20 @@ export class FileGridEntryComponent implements OnInit, OnDestroy { if (this.contentUrl) { const url = this.contentUrl; this.contentUrl = undefined; - URL?.revokeObjectURL(url as string); } } async loadImage() { try { - const thumbnails = await this.fileService.getThumbnails(this.gridEntry.file.hash); - let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); - this.selectedThumbnail = thumbnail; - - if (!thumbnail) { - console.log("Thumbnail is empty?!", thumbnails); - } else { - this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); - } + const thumbnails = await this.fileService.getThumbnails(this.gridEntry.file.hash); + let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); + this.selectedThumbnail = thumbnail; + + if (!thumbnail) { + console.log("Thumbnail is empty?!", thumbnails); + } else { + this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); + } } catch (err) { this.errorBroker.showError(err); } diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts index 7c5c3b3..742014e 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid.component.ts @@ -62,7 +62,14 @@ export class FileGridComponent implements OnChanges { this.handleShiftSelect(clickedEntry); } else { clickedEntry.selected = !clickedEntry.selected; - this.selectedEntries.push(clickedEntry); + if (!clickedEntry.selected) { + const index = this.selectedEntries.indexOf(clickedEntry); + if (index > -1) { + this.selectedEntries.splice(index, 1); + } + } else { + this.selectedEntries.push(clickedEntry); + } } if (this.selectedEntries.length == 1) { this.fileSelectEvent.emit(this.selectedEntries.map(entry => entry.file)[0]); diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index a93026b..b338537 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -4,6 +4,7 @@ +

@@ -20,15 +21,20 @@ (matChipInputTokenEnd)="addSearchTag($event)"/> -

Tags

- - {{tag.namespace ? tag.namespace + ':' + tag.name : tag.name}} - +
+

Selection Tags

+ + {{tag.namespace ? tag.namespace + ':' + tag.name : tag.name}} + +
+
+ (fileSelectEvent)="onFileSelect($event)" + (fileMultiselectEvent)="onFileMultiSelect($event)" + > diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index 8cd91d2..6bcacf4 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -12,9 +12,21 @@ width: 100%; } +#file-tag-list { + height: calc(100% - 8em); + overflow: auto; +} + +.drawer-sidebar-inner { + height: 100%; + width: 100%; + display: block; +} + mat-drawer { height: 100%; width: 25%; + overflow: hidden; } mat-drawer-content { diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index a8c22e3..3f047ae 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -35,6 +35,12 @@ export class HomeComponent implements OnInit { await this.fileService.getFiles(); } + async onFileMultiSelect(files: File[]) { + if (files.length === 0) { + this.clearFileDetails(); + } + } + async onFileSelect(file: File | undefined) { if (file) { await this.showFileDetails(file); From a50bb88ba878ae6622b2ecf34a6f395f5851fd32 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 23 Oct 2021 23:45:41 +0200 Subject: [PATCH 016/183] Add feature to add tags from the tag list to the search expression Signed-off-by: trivernis --- mediarepo-ui/src/app/models/Tag.ts | 14 ++++++++++---- .../src/app/pages/home/home.component.html | 4 ++-- mediarepo-ui/src/app/pages/home/home.component.ts | 10 ++++++++++ mediarepo-ui/src/app/services/tag/tag.service.ts | 3 ++- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/mediarepo-ui/src/app/models/Tag.ts b/mediarepo-ui/src/app/models/Tag.ts index a5eb657..fac2eb1 100644 --- a/mediarepo-ui/src/app/models/Tag.ts +++ b/mediarepo-ui/src/app/models/Tag.ts @@ -1,5 +1,11 @@ -export type Tag = { - id: number, - name: string, - namespace: string | undefined, +export class Tag { + constructor( + public id: number, + public name: string, + public namespace: string | undefined + ) {} + + public getNormalizedOutput(): string { + return this.namespace ? this.namespace + ':' + this.name : this.name + } }; diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index b338537..e9ad88f 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -23,9 +23,9 @@

Selection Tags

- + {{tag.namespace ? tag.namespace + ':' + tag.name : tag.name}} + *ngFor="let tag of tags" [value]="tag.getNormalizedOutput()">{{tag.getNormalizedOutput()}}
diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 3f047ae..3a594c4 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -9,6 +9,7 @@ import {TagService} from "../../services/tag/tag.service"; import {Tag} from "../../models/Tag"; import {MatChipInputEvent} from "@angular/material/chips"; import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {MatSelectionListChange} from "@angular/material/list"; @Component({ selector: 'app-home', @@ -65,6 +66,15 @@ export class HomeComponent implements OnInit { await this.fileService.findFiles(this.searchTags); } + async addSearchTagFromList(event: MatSelectionListChange) { + if (event.options.length > 0) { + const tag = event.options[0].value; + this.searchTags.push(tag); + await this.fileService.findFiles(this.searchTags); + } + event.source.deselectAll(); + } + async addSearchTag(event: MatChipInputEvent) { const tag = event.value.trim(); if (tag.length > 0) { diff --git a/mediarepo-ui/src/app/services/tag/tag.service.ts b/mediarepo-ui/src/app/services/tag/tag.service.ts index 0e7f8f8..85f9046 100644 --- a/mediarepo-ui/src/app/services/tag/tag.service.ts +++ b/mediarepo-ui/src/app/services/tag/tag.service.ts @@ -10,6 +10,7 @@ export class TagService { constructor() { } public async getTagsForFile(hash: string): Promise { - return await invoke("get_tags_for_file", {hash}); + const tags = await invoke("get_tags_for_file", {hash}); + return tags.map(t => new Tag(t.id, t.name, t.namespace)); } } From 8fbc4436e346970697704f5fbff3ed47239673ba Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 24 Oct 2021 00:23:47 +0200 Subject: [PATCH 017/183] Fix content security policy for custom pseudo protocol 'once:' Signed-off-by: trivernis --- mediarepo-ui/angular.json | 8 ++++---- mediarepo-ui/src-tauri/tauri.conf.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mediarepo-ui/angular.json b/mediarepo-ui/angular.json index 05c406c..9aad8ca 100644 --- a/mediarepo-ui/angular.json +++ b/mediarepo-ui/angular.json @@ -45,13 +45,13 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "1mb", + "maximumError": "10mb" }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "6kb", + "maximumError": "100kb" } ], "fileReplacements": [ diff --git a/mediarepo-ui/src-tauri/tauri.conf.json b/mediarepo-ui/src-tauri/tauri.conf.json index fed9168..e129684 100644 --- a/mediarepo-ui/src-tauri/tauri.conf.json +++ b/mediarepo-ui/src-tauri/tauri.conf.json @@ -61,7 +61,7 @@ } ], "security": { - "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self' once:" } } } From c19423a271b2d1590e9cc1c94265197ccd07277f Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 24 Oct 2021 13:39:17 +0200 Subject: [PATCH 018/183] Move commands to api crate Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 860 +----------------- mediarepo-ui/src-tauri/Cargo.toml | 21 +- mediarepo-ui/src-tauri/src/commands/files.rs | 92 -- mediarepo-ui/src-tauri/src/commands/mod.rs | 41 - mediarepo-ui/src-tauri/src/commands/repo.rs | 104 --- mediarepo-ui/src-tauri/src/commands/tags.rs | 21 - mediarepo-ui/src-tauri/src/context.rs | 31 - mediarepo-ui/src-tauri/src/error.rs | 62 -- mediarepo-ui/src-tauri/src/ipc/files.rs | 0 mediarepo-ui/src-tauri/src/ipc/mod.rs | 51 -- mediarepo-ui/src-tauri/src/main.rs | 62 +- mediarepo-ui/src-tauri/src/settings.rs | 48 - mediarepo-ui/src/app/models/Thumbnail.ts | 2 +- .../src/app/pages/home/home.component.ts | 3 +- .../src/app/services/file/file.service.ts | 17 +- .../services/repository/repository.service.ts | 9 +- .../src/app/services/tag/tag.service.ts | 2 +- 17 files changed, 81 insertions(+), 1345 deletions(-) delete mode 100644 mediarepo-ui/src-tauri/src/commands/files.rs delete mode 100644 mediarepo-ui/src-tauri/src/commands/mod.rs delete mode 100644 mediarepo-ui/src-tauri/src/commands/repo.rs delete mode 100644 mediarepo-ui/src-tauri/src/commands/tags.rs delete mode 100644 mediarepo-ui/src-tauri/src/context.rs delete mode 100644 mediarepo-ui/src-tauri/src/error.rs delete mode 100644 mediarepo-ui/src-tauri/src/ipc/files.rs delete mode 100644 mediarepo-ui/src-tauri/src/ipc/mod.rs delete mode 100644 mediarepo-ui/src-tauri/src/settings.rs diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 700e015..6097b35 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -14,17 +14,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" -[[package]] -name = "ahash" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" -dependencies = [ - "getrandom 0.2.3", - "once_cell", - "version_check", -] - [[package]] name = "aho-corasick" version = "0.7.18" @@ -53,16 +42,13 @@ checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" name = "app" version = "0.1.0" dependencies = [ - "directories", - "mediarepo", - "rmp-ipc", + "mediarepo-api", "serde", "serde_json", "tauri", "tauri-build", "thiserror", - "tokio", - "toml", + "tracing-subscriber 0.3.0", "typemap_rev", ] @@ -103,27 +89,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "async-stream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "async-trait" version = "0.1.51" @@ -159,15 +124,6 @@ dependencies = [ "system-deps 3.2.0", ] -[[package]] -name = "atoi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" -dependencies = [ - "num-traits", -] - [[package]] name = "attohttpc" version = "0.17.0" @@ -192,25 +148,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "bae" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107f431ee3d8a8e45e6dd117adab769556ef463959e77bf6a4888d5fd500cf" -dependencies = [ - "heck", - "proc-macro-error 0.4.12", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - [[package]] name = "base64" version = "0.13.0" @@ -243,17 +180,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "blake2s_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - [[package]] name = "blake3" version = "1.0.0" @@ -275,22 +201,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "bstr" version = "0.2.17" @@ -306,12 +216,6 @@ version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" -[[package]] -name = "bytemuck" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" - [[package]] name = "byteorder" version = "1.4.3" @@ -466,12 +370,6 @@ dependencies = [ "objc", ] -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "com" version = "0.2.0" @@ -612,30 +510,6 @@ dependencies = [ "objc", ] -[[package]] -name = "cpufeatures" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" - [[package]] name = "crc32fast" version = "1.2.1" @@ -679,16 +553,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -761,32 +625,6 @@ dependencies = [ "syn", ] -[[package]] -name = "data-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" - -[[package]] -name = "data-encoding-macro" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" -dependencies = [ - "data-encoding", - "syn", -] - [[package]] name = "deflate" version = "0.7.20" @@ -898,12 +736,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dtoa" version = "0.4.8" @@ -1078,17 +910,6 @@ dependencies = [ "futures-util", ] -[[package]] -name = "futures-intrusive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - [[package]] name = "futures-io" version = "0.3.17" @@ -1268,16 +1089,6 @@ dependencies = [ "wasi 0.10.0+wasi-snapshot-preview1", ] -[[package]] -name = "gif" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gio" version = "0.14.8" @@ -1349,7 +1160,7 @@ dependencies = [ "anyhow", "heck", "proc-macro-crate 1.1.0", - "proc-macro-error 1.0.4", + "proc-macro-error", "proc-macro2", "quote", "syn", @@ -1460,30 +1271,12 @@ dependencies = [ "anyhow", "heck", "proc-macro-crate 1.1.0", - "proc-macro-error 1.0.4", + "proc-macro-error", "proc-macro2", "quote", "syn", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashlink" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" -dependencies = [ - "hashbrown", -] - [[package]] name = "heck" version = "0.3.3" @@ -1502,12 +1295,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "html5ever" version = "0.25.1" @@ -1584,35 +1371,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "image" -version = "0.23.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "gif", - "jpeg-decoder", - "num-iter", - "num-rational", - "num-traits", - "png 0.16.8", - "scoped_threadpool", - "tiff", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", -] - [[package]] name = "infer" version = "0.4.0" @@ -1689,15 +1447,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" -dependencies = [ - "rayon", -] - [[package]] name = "js-sys" version = "0.3.55" @@ -1707,12 +1456,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - [[package]] name = "kuchiki" version = "0.8.1" @@ -1737,17 +1480,6 @@ version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" -[[package]] -name = "libsqlite3-sys" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - [[package]] name = "lock_api" version = "0.4.5" @@ -1778,7 +1510,7 @@ dependencies = [ "serde", "serde_json", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.2.25", ] [[package]] @@ -1831,6 +1563,15 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.9" @@ -1838,73 +1579,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] -name = "mediarepo" -version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" -dependencies = [ - "log", - "mediarepo-core", - "mediarepo-socket", - "tokio", -] - -[[package]] -name = "mediarepo-core" +name = "mediarepo-api" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=2b6a968e6d5343326e20c73f4fcbbb88848b0c35#2b6a968e6d5343326e20c73f4fcbbb88848b0c35" dependencies = [ - "base64", - "futures", - "image", - "multibase", - "multihash", + "async-trait", + "chrono", + "directories", + "parking_lot", "rmp-ipc", - "sea-orm", "serde", - "sqlx", + "serde_json", + "tauri", "thiserror", "tokio", "toml", - "typemap_rev", -] - -[[package]] -name = "mediarepo-database" -version = "0.2.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" -dependencies = [ - "chrono", - "mediarepo-core", - "sea-orm", - "sqlx", -] - -[[package]] -name = "mediarepo-model" -version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" -dependencies = [ - "chrono", - "mediarepo-core", - "mediarepo-database", - "mime", - "mime_guess", - "sea-orm", - "serde", - "tokio", - "typemap_rev", -] - -[[package]] -name = "mediarepo-socket" -version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-daemon?rev=ce93a5793348a05052b324562730d97f5c6e2128#ce93a5793348a05052b324562730d97f5c6e2128" -dependencies = [ - "chrono", - "mediarepo-core", - "mediarepo-model", - "serde", - "tokio", + "tracing", ] [[package]] @@ -1922,28 +1612,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677" - [[package]] name = "minisign-verify" version = "0.1.8" @@ -1992,52 +1660,10 @@ dependencies = [ ] [[package]] -name = "multibase" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" -dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.15.0" +name = "native-tls" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e540106213dc639fe2b632a7d9e3525169ef081378a7c2da4457b84fec44c0" -dependencies = [ - "blake2b_simd", - "blake2s_simd", - "blake3", - "digest", - "generic-array", - "multihash-derive", - "sha2", - "sha3", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" -dependencies = [ - "proc-macro-crate 1.1.0", - "proc-macro-error 1.0.4", - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "native-tls" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -2132,17 +1758,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "nom" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" -dependencies = [ - "memchr", - "minimal-lexical", - "version_check", -] - [[package]] name = "notify-rust" version = "4.5.4" @@ -2166,17 +1781,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -2198,17 +1802,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.14" @@ -2285,12 +1878,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "open" version = "2.0.1" @@ -2616,45 +2203,19 @@ dependencies = [ "toml", ] -[[package]] -name = "proc-macro-error" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" -dependencies = [ - "proc-macro-error-attr 0.4.12", - "proc-macro2", - "quote", - "syn", - "version_check", -] - [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ - "proc-macro-error-attr 1.0.4", + "proc-macro-error-attr", "proc-macro2", "quote", "syn", "version_check", ] -[[package]] -name = "proc-macro-error-attr" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "syn-mid", - "version_check", -] - [[package]] name = "proc-macro-error-attr" version = "1.0.4" @@ -2927,16 +2488,16 @@ dependencies = [ [[package]] name = "rmp-ipc" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17765aa8bd4d19dd81c53c0707192115f36ec200aea9f4557526932ac1f418e0" +checksum = "f68b5ec0f51d53896979bb5364c10c6b0edf753b56570f1f2425b24ea6e85955" dependencies = [ "lazy_static", - "log", "rmp-serde", "serde", "thiserror", "tokio", + "tracing", "typemap_rev", ] @@ -2963,17 +2524,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rust_decimal" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f1028de22e436bb35fce070310ee57d57b5e59ae77b4e3f24ce4773312b813" -dependencies = [ - "arrayvec 0.5.2", - "num-traits", - "serde", -] - [[package]] name = "rustc_version" version = "0.3.3" @@ -3020,100 +2570,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sea-orm" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c5c7f0848ed7ddb2b3956abc84d5167dd33bb34c43e3b69172f565ca657a11" -dependencies = [ - "async-stream", - "async-trait", - "chrono", - "futures", - "futures-util", - "rust_decimal", - "sea-orm-macros", - "sea-query", - "sea-strum", - "serde", - "serde_json", - "sqlx", - "uuid", -] - -[[package]] -name = "sea-orm-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9466819cb0878e7fb6f6a1d7e46471a93b7121fef39db82f5799127884e39534" -dependencies = [ - "bae", - "convert_case", - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sea-query" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db6d690760e4f48663f0ecd9d91b03c1e6a5b17991d1c53043c5f07ba7db29" -dependencies = [ - "chrono", - "rust_decimal", - "sea-query-derive", - "serde_json", - "uuid", -] - -[[package]] -name = "sea-query-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", - "thiserror", -] - -[[package]] -name = "sea-strum" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c77c6c6c8b3950fccb65edd5d04985b5377f4c8f669cb9a215553f0369ec001" -dependencies = [ - "sea-strum_macros", -] - -[[package]] -name = "sea-strum_macros" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c247af6c2c4ffd372fe97e9afa579b4438e4c306c9aa3f11cbf72f1e845180" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "security-framework" version = "2.4.2" @@ -3207,7 +2669,6 @@ version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ - "indexmap", "itoa", "ryu", "serde", @@ -3246,31 +2707,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha2" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" -dependencies = [ - "block-buffer", - "cfg-if 1.0.0", - "cpufeatures", - "digest", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", -] - [[package]] name = "sharded-slab" version = "0.1.3" @@ -3333,107 +2769,6 @@ dependencies = [ "system-deps 1.3.2", ] -[[package]] -name = "sqlformat" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7911b0031a0247af40095838002999c7a52fba29d9739e93326e71a5a1bc9d43" -dependencies = [ - "sqlx-core", - "sqlx-macros", -] - -[[package]] -name = "sqlx-core" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec89bfaca8f7737439bad16d52b07f1ccd0730520d3bf6ae9d069fe4b641fb1" -dependencies = [ - "ahash", - "atoi", - "bitflags", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-channel", - "crossbeam-queue", - "crossbeam-utils", - "either", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-util", - "hashlink", - "hex", - "indexmap", - "itoa", - "libc", - "libsqlite3-sys", - "log", - "memchr", - "num-bigint", - "once_cell", - "parking_lot", - "percent-encoding", - "rust_decimal", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "sqlx-rt", - "stringprep", - "thiserror", - "tokio-stream", - "url", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-macros" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584866c833511b1a152e87a7ee20dee2739746f60c858b3c5209150bc4b466f5" -dependencies = [ - "dotenv", - "either", - "heck", - "once_cell", - "proc-macro2", - "quote", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-rt", - "syn", - "url", -] - -[[package]] -name = "sqlx-rt" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1bd069de53442e7a320f525a6d4deb8bb0621ac7a55f7eccbc2b58b57f43d0" -dependencies = [ - "native-tls", - "once_cell", - "tokio", - "tokio-native-tls", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3480,16 +2815,6 @@ dependencies = [ "quote", ] -[[package]] -name = "stringprep" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "strsim" version = "0.9.3" @@ -3546,29 +2871,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "syn-mid" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - [[package]] name = "system-deps" version = "1.3.2" @@ -3859,17 +3161,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tiff" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" -dependencies = [ - "jpeg-decoder", - "miniz_oxide 0.4.4", - "weezl", -] - [[package]] name = "time" version = "0.1.44" @@ -3909,42 +3200,9 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "tokio-macros", "winapi", ] -[[package]] -name = "tokio-macros" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "toml" version = "0.5.8" @@ -4016,7 +3274,7 @@ dependencies = [ "ansi_term", "chrono", "lazy_static", - "matchers", + "matchers 0.0.1", "regex", "serde", "serde_json", @@ -4029,6 +3287,24 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf865b5ddc38e503a29c41c4843e616a73028ae18c637bc3eb2afaef4909c84" +dependencies = [ + "ansi_term", + "lazy_static", + "matchers 0.1.0", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "typemap_rev" version = "0.1.5" @@ -4047,15 +3323,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.7" @@ -4083,18 +3350,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsigned-varint" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f8d425fafb8cd76bc3f22aace4af471d3156301d7508f2107e98fbeae10bc7f" - [[package]] name = "url" version = "2.2.2" @@ -4121,7 +3376,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ "getrandom 0.2.3", - "serde", ] [[package]] @@ -4328,12 +3582,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "weezl" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" - [[package]] name = "wepoll-ffi" version = "0.1.2" @@ -4343,16 +3591,6 @@ dependencies = [ "cc", ] -[[package]] -name = "whoami" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483a59fee1a93fec90eb08bc2eb4315ef10f4ebc478b3a5fadc969819cb66117" -dependencies = [ - "wasm-bindgen", - "web-sys", -] - [[package]] name = "widestring" version = "0.4.3" diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index b3c07c8..30c2c17 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -18,21 +18,20 @@ tauri-build = { version = "1.0.0-beta.4" } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.0.0-beta.8", features = ["api-all"] } -rmp-ipc = "0.7.0" thiserror = "1.0.30" -directories = "4.0.1" -toml = "0.5.8" typemap_rev = "0.1.5" -[dependencies.tokio] -version = "1.12.0" -features = ["fs", "io-std", "io-util"] -[dependencies.mediarepo] -git = "https://github.com/Trivernis/mediarepo-daemon" -rev = "ce93a5793348a05052b324562730d97f5c6e2128" -features = ["library"] -default-features=false + + +[dependencies.tracing-subscriber] +version = "0.3.0" +features = ["env-filter"] + +[dependencies.mediarepo-api] +git = "https://github.com/Trivernis/mediarepo-api.git" +rev = "2b6a968e6d5343326e20c73f4fcbbb88848b0c35" +features = ["tauri-plugin"] [features] default = [ "custom-protocol" ] diff --git a/mediarepo-ui/src-tauri/src/commands/files.rs b/mediarepo-ui/src-tauri/src/commands/files.rs deleted file mode 100644 index 877ff10..0000000 --- a/mediarepo-ui/src-tauri/src/commands/files.rs +++ /dev/null @@ -1,92 +0,0 @@ -use crate::commands::{add_once_buffer, get_ipc}; -use mediarepo::requests::{FindFilesByTagsRequest, GetFileThumbnailsRequest, ReadFileRequest}; -use mediarepo::responses::{FileResponse, ThumbnailResponse}; - -use crate::context::Context; -use crate::error::AppResult; - -#[tauri::command] -pub async fn get_all_files(context: tauri::State<'_, Context>) -> AppResult> { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to("files", "all_files", ()) - .await? - .await_reply(&ipc) - .await?; - - Ok(response.data::>()?) -} - -#[tauri::command] -pub async fn find_files( - tags: Vec, - context: tauri::State<'_, Context>, -) -> AppResult> { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to("files", "find_files", FindFilesByTagsRequest { tags }) - .await? - .await_reply(&ipc) - .await?; - Ok(response.data::>()?) -} - -#[tauri::command] -pub async fn read_file_by_hash( - hash: String, - mime: String, - context: tauri::State<'_, Context>, -) -> AppResult { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to("files", "read_file", ReadFileRequest::Hash(hash.clone())) - .await? - .await_reply(&ipc) - .await?; - let raw_data = response.data_raw().to_vec(); - let uri = add_once_buffer(&context, hash, mime, raw_data); - - Ok(uri) -} - -#[tauri::command] -pub async fn get_thumbnails( - hash: String, - context: tauri::State<'_, Context>, -) -> AppResult> { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to( - "files", - "get_thumbnails", - GetFileThumbnailsRequest::Hash(hash), - ) - .await? - .await_reply(&ipc) - .await?; - - Ok(response.data::>()?) -} - -#[tauri::command] -pub async fn read_thumbnail( - hash: String, - mime: String, - context: tauri::State<'_, Context>, -) -> AppResult { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to("files", "read_thumbnail", hash.clone()) - .await? - .await_reply(&ipc) - .await?; - let raw_data = response.data_raw().to_vec(); - let uri = add_once_buffer(&context, hash, mime, raw_data); - - Ok(uri) -} diff --git a/mediarepo-ui/src-tauri/src/commands/mod.rs b/mediarepo-ui/src-tauri/src/commands/mod.rs deleted file mode 100644 index 91aa347..0000000 --- a/mediarepo-ui/src-tauri/src/commands/mod.rs +++ /dev/null @@ -1,41 +0,0 @@ -use rmp_ipc::ipc::context::Context as IPCContext; - -use crate::context::{Context, OnceBuffer}; -use crate::error::{AppError, AppResult}; - -pub mod files; -pub mod repo; -pub mod tags; - -#[tauri::command] -pub async fn emit_info(context: tauri::State<'_, Context>) -> AppResult<()> { - let ipc = context.ipc.read().await; - if let Some(ipc) = &*ipc { - ipc.emitter.emit("info", ()).await?; - println!("Emitted info event."); - } else { - println!("No IPC Context"); - } - - Ok(()) -} - -pub async fn get_ipc(context: &tauri::State<'_, Context>) -> AppResult { - let ipc = context.ipc.read().await; - (ipc.clone()).ok_or(AppError::new("No ipc connection.")) -} - -/// Adds a once-buffer to the buffer store -pub fn add_once_buffer( - context: &tauri::State<'_, Context>, - key: String, - mime: String, - buf: Vec, -) -> String { - let uri = format!("once://{}", key); - let once_buffer = OnceBuffer { mime, buf }; - let mut once_buffers = context.once_buffers.lock().unwrap(); - once_buffers.insert(key, once_buffer); - - uri -} diff --git a/mediarepo-ui/src-tauri/src/commands/repo.rs b/mediarepo-ui/src-tauri/src/commands/repo.rs deleted file mode 100644 index 37ac99f..0000000 --- a/mediarepo-ui/src-tauri/src/commands/repo.rs +++ /dev/null @@ -1,104 +0,0 @@ -use crate::context::Context; -use crate::error::{AppError, AppResult}; -use crate::ipc::build_ipc_context; -use crate::settings::save_settings; -use rmp_ipc::ipc::context::Context as IPCContext; -use serde::{Deserialize, Serialize}; -use std::mem; -use std::path::PathBuf; -use tauri::Window; -use tokio::fs; - -static REPO_CONFIG_FILE: &str = "repo.toml"; - -#[derive(Serialize, Deserialize, Clone)] -pub struct Repository { - name: String, - path: Option, - address: String, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct RepoConfig { - pub listen_address: String, - pub database_path: String, - pub default_file_store: String, -} - -#[tauri::command] -pub async fn get_repositories(context: tauri::State<'_, Context>) -> AppResult> { - let settings = context.settings.read().await; - - Ok(settings.repositories.values().cloned().collect()) -} - -#[tauri::command] -pub async fn get_active_repository( - context: tauri::State<'_, Context>, -) -> AppResult> { - let repo = context.active_repository.read().await; - Ok(repo.clone()) -} - -#[tauri::command] -pub async fn add_repository( - name: String, - path: String, - context: tauri::State<'_, Context>, -) -> AppResult> { - let repo_path = path.clone(); - let path = PathBuf::from(path); - let RepoConfig { listen_address, .. } = read_repo_config(path.join(REPO_CONFIG_FILE)).await?; - - let repo = Repository { - name, - path: Some(repo_path), - address: listen_address, - }; - - let mut repositories = Vec::new(); - { - let mut settings = context.settings.write().await; - settings.repositories.insert(repo.name.clone(), repo); - save_settings(&settings)?; - repositories.append(&mut settings.repositories.values().cloned().collect()); - } - - Ok(repositories) -} - -#[tauri::command] -pub async fn select_repository( - window: Window, - name: String, - context: tauri::State<'_, Context>, -) -> AppResult<()> { - let settings = context.settings.read().await; - let repo = settings - .repositories - .get(&name) - .ok_or(AppError::new(format!("Repository '{}' not found", name)))?; - let ipc = connect(window, &repo.address).await?; - let mut ipc_ctx = context.ipc.write().await; - let old_ipc = mem::replace(&mut *ipc_ctx, Some(ipc)); - - if let Some(old_ctx) = old_ipc { - old_ctx.stop().await?; - } - let mut active_repo = context.active_repository.write().await; - *active_repo = Some(repo.clone()); - - Ok(()) -} - -async fn read_repo_config(path: PathBuf) -> AppResult { - let toml_str = fs::read_to_string(path).await?; - let config = toml::from_str(&toml_str)?; - - Ok(config) -} - -/// Connects to the IPC Server -async fn connect(window: Window, address: &str) -> AppResult { - build_ipc_context(window, address).await -} diff --git a/mediarepo-ui/src-tauri/src/commands/tags.rs b/mediarepo-ui/src-tauri/src/commands/tags.rs deleted file mode 100644 index 8d696ba..0000000 --- a/mediarepo-ui/src-tauri/src/commands/tags.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::commands::get_ipc; -use crate::context::Context; -use crate::error::AppResult; -use mediarepo::requests::FileIdentifier; -use mediarepo::responses::TagResponse; - -#[tauri::command] -pub async fn get_tags_for_file( - hash: String, - context: tauri::State<'_, Context>, -) -> AppResult> { - let ipc = get_ipc(&context).await?; - let response = ipc - .emitter - .emit_to("tags", "tags_for_file", FileIdentifier::Hash(hash)) - .await? - .await_reply(&ipc) - .await?; - - Ok(response.data::>()?) -} diff --git a/mediarepo-ui/src-tauri/src/context.rs b/mediarepo-ui/src-tauri/src/context.rs deleted file mode 100644 index 34ef383..0000000 --- a/mediarepo-ui/src-tauri/src/context.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::commands::repo::Repository; -use crate::settings::Settings; -use rmp_ipc::ipc::context::Context as IPCContext; -use std::collections::HashMap; -use std::sync::Arc; -use std::sync::Mutex as StdMutex; -use tokio::sync::RwLock; - -pub struct OnceBuffer { - pub mime: String, - pub buf: Vec, -} - -#[derive(Clone)] -pub struct Context { - pub active_repository: Arc>>, - pub ipc: Arc>>, - pub settings: Arc>, - pub once_buffers: Arc>>, -} - -impl Context { - pub fn new(settings: Settings) -> Self { - Self { - ipc: Arc::new(RwLock::new(None)), - active_repository: Arc::new(RwLock::new(None)), - settings: Arc::new(RwLock::new(settings)), - once_buffers: Arc::new(StdMutex::new(HashMap::new())), - } - } -} diff --git a/mediarepo-ui/src-tauri/src/error.rs b/mediarepo-ui/src-tauri/src/error.rs deleted file mode 100644 index cf00f76..0000000 --- a/mediarepo-ui/src-tauri/src/error.rs +++ /dev/null @@ -1,62 +0,0 @@ -use std::error::Error; -use std::fmt::{Display, Formatter}; -use serde::Serialize; - -pub type AppResult = Result; - -#[derive(Debug, Serialize)] -pub struct AppError { - message: String -} - -impl AppError { - pub fn new(msg: S) -> Self { - Self { - message: msg.to_string() - } - } -} - -impl Display for AppError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - self.message.fmt(f) - } -} - -impl Error for AppError {} - -impl From for AppError { - fn from(e: std::io::Error) -> Self { - Self::new(e) - } -} - -impl From for AppError { - fn from(e: toml::de::Error) -> Self { - Self::new(format!("Failed to deserialize toml: {:?}", e)) - } -} - -impl From for AppError { - fn from(e: toml::ser::Error) -> Self { - Self::new(format!("Failed to serialize to toml: {:?}", e)) - } -} - -impl From for AppError { - fn from(e: rmp_ipc::error::Error) -> Self { - Self::new(format!("Daemon Error: {:?}", e)) - } -} - -impl From for AppError { - fn from(e: tauri::Error) -> Self { - Self::new(format!("Tauri error: {:?}", e)) - } -} - -impl From for rmp_ipc::error::Error { - fn from(e: AppError) -> Self { - rmp_ipc::error::Error::Message(e.message) - } -} diff --git a/mediarepo-ui/src-tauri/src/ipc/files.rs b/mediarepo-ui/src-tauri/src/ipc/files.rs deleted file mode 100644 index e69de29..0000000 diff --git a/mediarepo-ui/src-tauri/src/ipc/mod.rs b/mediarepo-ui/src-tauri/src/ipc/mod.rs deleted file mode 100644 index 0ab5b7c..0000000 --- a/mediarepo-ui/src-tauri/src/ipc/mod.rs +++ /dev/null @@ -1,51 +0,0 @@ -mod files; - -use crate::error::AppResult; -use mediarepo::responses::InfoResponse; -use rmp_ipc::error::Result; -use rmp_ipc::error_event::{ErrorEventData, ERROR_EVENT_NAME}; -use rmp_ipc::event::Event; -use rmp_ipc::ipc::context::Context as IPCContext; -use rmp_ipc::IPCBuilder; -use tauri::Window; -use typemap_rev::TypeMapKey; - -pub struct WindowKey; - -impl TypeMapKey for WindowKey { - type Value = Window; -} - -pub async fn build_ipc_context(window: Window, address: &str) -> AppResult { - let ctx = IPCBuilder::new() - .address(address) - .insert::(window) - .on(ERROR_EVENT_NAME, |c, e| Box::pin(handle_error(c, e))) - .on("info", |c, e| Box::pin(handle_info(c, e))) - .build_client() - .await?; - - Ok(ctx) -} - -async fn handle_error(ctx: &IPCContext, event: Event) -> Result<()> { - let error_data = event.data::()?; - let data = ctx.data.read().await; - let window = data.get::().unwrap(); - window - .emit("error", error_data) - .expect("Failed to emit error event"); - - Ok(()) -} - -async fn handle_info(ctx: &IPCContext, event: Event) -> Result<()> { - let info_data = event.data::()?; - let data = ctx.data.read().await; - let window = data.get::().unwrap(); - window - .emit("info", info_data) - .expect("Failed to emit info event"); - - Ok(()) -} diff --git a/mediarepo-ui/src-tauri/src/main.rs b/mediarepo-ui/src-tauri/src/main.rs index 9ec99f2..0502136 100644 --- a/mediarepo-ui/src-tauri/src/main.rs +++ b/mediarepo-ui/src-tauri/src/main.rs @@ -3,61 +3,17 @@ windows_subsystem = "windows" )] -use crate::commands::emit_info; -use crate::commands::files::*; -use crate::commands::repo::{ - add_repository, get_active_repository, get_repositories, select_repository, -}; -use crate::commands::tags::*; -use crate::context::Context; -use crate::settings::load_settings; -use tauri::http::ResponseBuilder; -use tauri::Manager; - -mod commands; -pub mod context; -pub mod error; -mod ipc; -mod settings; +use tracing_subscriber::fmt::format::FmtSpan; +use tracing_subscriber::EnvFilter; fn main() { - let settings = load_settings().expect("Failed to load settings"); - let context = Context::new(settings); - - tauri::Builder::default() - .manage(context) - .register_uri_scheme_protocol("once", |app, request| { - let context = app.state::(); - let resource_key = request.uri().trim_start_matches("once://"); - let buffer = { - let mut buffers = context.once_buffers.lock().unwrap(); - buffers.remove(resource_key) - }; - if let Some(buffer) = buffer { - ResponseBuilder::new() - .mimetype(&buffer.mime) - .status(200) - .body(buffer.buf) - } else { - ResponseBuilder::new() - .mimetype("text/plain") - .status(404) - .body("Resource not found".as_bytes().to_vec()) - } - }) - .invoke_handler(tauri::generate_handler![ - get_repositories, - add_repository, - select_repository, - get_active_repository, - emit_info, - get_all_files, - read_file_by_hash, - get_thumbnails, - read_thumbnail, - get_tags_for_file, - find_files, - ]) + tracing_subscriber::fmt::SubscriberBuilder::default() + .with_env_filter(EnvFilter::from_default_env()) + .with_writer(std::io::stdout) + .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE) + .compact() + .init(); + mediarepo_api::tauri_plugin::register_plugin(tauri::Builder::default()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/mediarepo-ui/src-tauri/src/settings.rs b/mediarepo-ui/src-tauri/src/settings.rs deleted file mode 100644 index 85eb7d4..0000000 --- a/mediarepo-ui/src-tauri/src/settings.rs +++ /dev/null @@ -1,48 +0,0 @@ -use std::collections::HashMap; -use serde::{Serialize, Deserialize}; -use crate::commands::repo::Repository; -use crate::error::AppResult; -use directories::ProjectDirs; -use std::fs; -use std::path::PathBuf; - -static SETTINGS_FILE: &str = "settings.toml"; - -#[derive(Default, Serialize, Deserialize)] -pub struct Settings { - pub repositories: HashMap, -} - -fn get_settings_path() -> PathBuf { - let dirs = ProjectDirs::from("com", "trivernis", "mediarepo").unwrap(); - let config_path = dirs.config_dir().to_path_buf(); - - config_path.join(SETTINGS_FILE) -} - -/// Writes the settings to the file -pub fn save_settings(settings: &Settings) -> AppResult<()> { - let settings_path = get_settings_path(); - let settings_string = toml::to_string(&settings)?; - fs::write(&settings_path, &settings_string.into_bytes())?; - - Ok(()) -} - -/// Loads the settings from the file -pub fn load_settings() -> AppResult { - let dirs = ProjectDirs::from("com", "trivernis", "mediarepo").unwrap(); - let config_path = dirs.config_dir().to_path_buf(); - if !config_path.exists() { - fs::create_dir_all(&config_path)?; - } - let settings_path = config_path.join(SETTINGS_FILE); - if !settings_path.exists() { - let settings = Settings::default(); - save_settings(&settings)?; - } - let config_str = fs::read_to_string(settings_path)?; - let settings = toml::from_str(&config_str)?; - - Ok(settings) -} diff --git a/mediarepo-ui/src/app/models/Thumbnail.ts b/mediarepo-ui/src/app/models/Thumbnail.ts index 8acbb90..18c7006 100644 --- a/mediarepo-ui/src/app/models/Thumbnail.ts +++ b/mediarepo-ui/src/app/models/Thumbnail.ts @@ -2,5 +2,5 @@ export type Thumbnail = { hash: string, height: number, width: number, - mime: string | undefined + mime_type: string | undefined } diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 3a594c4..1b42431 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -98,8 +98,7 @@ export class HomeComponent implements OnInit { } private async openLightbox(file: File): Promise { - let url = await this.fileService.readFile(file.hash, - file.mime_type ?? "image/png"); + let url = await this.fileService.readFile(file); let albums = [ { diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index dd4d4a7..49f9bfd 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -17,31 +17,26 @@ export class FileService { } public async getFiles() { - let all_files = await invoke("get_all_files"); + let all_files = await invoke("plugin:mediarepo|get_all_files"); this.displayedFiles.next(all_files); } public async findFiles(tags: string[]) { - let files = await invoke("find_files", {tags}); + let files = await invoke("plugin:mediarepo|find_files", {tags}); this.displayedFiles.next(files); } - public async readFile(hash: string, mime: string): Promise { - const once_uri = await invoke("read_file_by_hash", {hash, mime}); + public async readFile(file: File): Promise { + const once_uri = await invoke("plugin:mediarepo|read_file_by_hash", {hash: file.hash, mimeType: file.mime_type}); return this.sanitizer.bypassSecurityTrustResourceUrl(once_uri); } public async readThumbnail(thumbnail: Thumbnail): Promise { - let once_uri = await invoke("read_thumbnail", {hash: thumbnail.hash, mime: thumbnail.mime}); + let once_uri = await invoke("plugin:mediarepo|read_thumbnail", {hash: thumbnail.hash, mimeType: thumbnail.mime_type }); return this.sanitizer.bypassSecurityTrustResourceUrl(once_uri); } public async getThumbnails(hash: string): Promise { - return await invoke("get_thumbnails", {hash}); - } - - createSafeObjectUrl(blob: Blob): SafeResourceUrl { - const url = URL?.createObjectURL(blob); - return this.sanitizer.bypassSecurityTrustResourceUrl(url); + return await invoke("plugin:mediarepo|get_file_thumbnails", {hash}); } } diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts index e1b998c..e39f8af 100644 --- a/mediarepo-ui/src/app/services/repository/repository.service.ts +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -25,21 +25,20 @@ export class RepositoryService { } public async loadRepositories() { - let active_repo = await invoke("get_active_repository"); + let active_repo = await invoke("plugin:mediarepo|get_active_repository"); this.selectedRepository.next(active_repo); - let repos = await invoke("get_repositories"); + let repos = await invoke("plugin:mediarepo|get_repositories"); this.repositories.next(repos); } public async setRepository(repo: Repository) { - await invoke("select_repository", {name: repo.name}); - await invoke("emit_info"); + await invoke("plugin:mediarepo|select_repository", {name: repo.name}); this.selectedRepository.next(repo); } public async addRepository(name: string, path: string) { - let repos = await invoke("add_repository", {name, path}); + let repos = await invoke("plugin:mediarepo|add_repository", {name, path}); this.repositories.next(repos); } } diff --git a/mediarepo-ui/src/app/services/tag/tag.service.ts b/mediarepo-ui/src/app/services/tag/tag.service.ts index 85f9046..4cb36e2 100644 --- a/mediarepo-ui/src/app/services/tag/tag.service.ts +++ b/mediarepo-ui/src/app/services/tag/tag.service.ts @@ -10,7 +10,7 @@ export class TagService { constructor() { } public async getTagsForFile(hash: string): Promise { - const tags = await invoke("get_tags_for_file", {hash}); + const tags = await invoke("plugin:mediarepo|get_tags_for_file", {hash}); return tags.map(t => new Tag(t.id, t.name, t.namespace)); } } From e721344d07548a6123429e20d2e2121474f4ab50 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 26 Oct 2021 15:13:10 +0200 Subject: [PATCH 019/183] Move file search to separate component Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 2 +- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src/app/app.module.ts | 46 +++++++------ .../file-search/file-search.component.html | 23 +++++++ .../file-search/file-search.component.scss | 7 ++ .../file-search/file-search.component.spec.ts | 25 +++++++ .../file-search/file-search.component.ts | 66 +++++++++++++++++++ .../src/app/pages/home/home.component.html | 17 +---- .../src/app/pages/home/home.component.scss | 4 -- .../src/app/pages/home/home.component.ts | 42 ++++-------- .../services/dataloader/dataloader.service.ts | 10 ++- .../src/app/services/tag/tag.service.ts | 8 +++ 12 files changed, 180 insertions(+), 72 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-search/file-search.component.html create mode 100644 mediarepo-ui/src/app/components/file-search/file-search.component.scss create mode 100644 mediarepo-ui/src/app/components/file-search/file-search.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-search/file-search.component.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 6097b35..df284a3 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -1581,7 +1581,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=2b6a968e6d5343326e20c73f4fcbbb88848b0c35#2b6a968e6d5343326e20c73f4fcbbb88848b0c35" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=4600810fca96bf6b457adc39667245a46127e5e8#4600810fca96bf6b457adc39667245a46127e5e8" dependencies = [ "async-trait", "chrono", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 30c2c17..cf835ff 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["env-filter"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "2b6a968e6d5343326e20c73f4fcbbb88848b0c35" +rev = "4600810fca96bf6b457adc39667245a46127e5e8" features = ["tauri-plugin"] [features] diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 3045b44..f2189e5 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -26,6 +26,8 @@ import {ScrollingModule} from "@angular/cdk/scrolling"; import {LightboxModule} from "ngx-lightbox"; import {MatChipsModule} from "@angular/material/chips"; import {MatIconModule} from "@angular/material/icon"; +import {MatAutocompleteModule} from "@angular/material/autocomplete"; +import { FileSearchComponent } from './components/file-search/file-search.component'; @NgModule({ declarations: [ @@ -36,28 +38,30 @@ import {MatIconModule} from "@angular/material/icon"; RepoFormComponent, FileGridComponent, FileGridEntryComponent, + FileSearchComponent, ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatSidenavModule, - MatGridListModule, - MatProgressBarModule, - MatPaginatorModule, - ScrollingModule, - LightboxModule, - MatChipsModule, - MatIconModule - ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, + MatProgressBarModule, + MatPaginatorModule, + ScrollingModule, + LightboxModule, + MatChipsModule, + MatIconModule, + MatAutocompleteModule + ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.html b/mediarepo-ui/src/app/components/file-search/file-search.component.html new file mode 100644 index 0000000..a74f731 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.html @@ -0,0 +1,23 @@ + + + + {{tag}} + + + + + + + {{tag}} + + + diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.scss b/mediarepo-ui/src/app/components/file-search/file-search.component.scss new file mode 100644 index 0000000..47109f6 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.scss @@ -0,0 +1,7 @@ +#tag-search { + width: 100%; +} + +.full-width { + width: 100%; +} diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.spec.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.spec.ts new file mode 100644 index 0000000..c2d77de --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileSearchComponent } from './file-search.component'; + +describe('FileSearchComponent', () => { + let component: FileSearchComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileSearchComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts new file mode 100644 index 0000000..7240fcd --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -0,0 +1,66 @@ +import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; +import {TagService} from "../../services/tag/tag.service"; +import {FileService} from "../../services/file/file.service"; +import {FormControl} from "@angular/forms"; +import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {MatChipInputEvent} from "@angular/material/chips"; +import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; +import {map, startWith} from "rxjs/operators"; +import {Observable} from "rxjs"; + +@Component({ + selector: 'app-file-search', + templateUrl: './file-search.component.html', + styleUrls: ['./file-search.component.scss'] +}) +export class FileSearchComponent { + + public searchInputSeparators = [ENTER, COMMA]; + public formControl = new FormControl(); + public searchTags: string[] = []; + public suggestionTags: Observable; + private allTags: string[] = []; + + @ViewChild('tagInput') tagInput!: ElementRef; + + constructor(private tagService: TagService, private fileService: FileService) { + this.tagService.tags.subscribe( + (tag) => this.allTags = tag.map(t => t.getNormalizedOutput())); + + this.suggestionTags = this.formControl.valueChanges.pipe(startWith(null), map( + (tag: string | null) => tag ? this.allTags.filter( + (t: string) => t.includes(tag)).slice(0, 20) : this.allTags.slice(0, 20))); + } + + public async searchForFiles() { + await this.fileService.findFiles(this.searchTags); + } + + public addSearchTag(tag: string) { + this.searchTags.push(tag); + } + + async removeSearchTag(tag: string) { + const index = this.searchTags.indexOf(tag); + if (index >= 0) { + this.searchTags.splice(index, 1); + } + await this.searchForFiles(); + } + + async addSearchTagByChip(event: MatChipInputEvent) { + const tag = event.value.trim(); + if (tag.length > 0 && this.allTags.includes(tag)) { + this.searchTags.push(tag); + event.chipInput?.clear(); + this.formControl.setValue(null); + await this.searchForFiles(); } + } + + async addSearchTagByAutocomplete(event: MatAutocompleteSelectedEvent) { + const tag = event.option.viewValue; + this.searchTags.push(tag); + this.formControl.setValue(null); + this.tagInput.nativeElement.value = ''; + await this.searchForFiles(); } +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index e9ad88f..f01c3a8 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -5,22 +5,7 @@
- - - - {{tag}} - - - - - - +

Selection Tags

diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index 6bcacf4..ff745ae 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -8,10 +8,6 @@ overflow: hidden } -#tag-search { - width: 100%; -} - #file-tag-list { height: calc(100% - 8em); overflow: auto; diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 1b42431..cca01b7 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -1,15 +1,18 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; import {FileService} from "../../services/file/file.service"; import {File} from "../../models/File"; -import {PageEvent} from "@angular/material/paginator"; import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; -import {SafeResourceUrl} from "@angular/platform-browser"; import {ErrorBrokerService} from "../../services/error-broker/error-broker.service"; import {TagService} from "../../services/tag/tag.service"; import {Tag} from "../../models/Tag"; import {MatChipInputEvent} from "@angular/material/chips"; import {COMMA, ENTER} from "@angular/cdk/keycodes"; import {MatSelectionListChange} from "@angular/material/list"; +import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; +import {Observable} from "rxjs"; +import {map, startWith} from "rxjs/operators"; +import {FormControl} from "@angular/forms"; +import {FileSearchComponent} from "../../components/file-search/file-search.component"; @Component({ selector: 'app-home', @@ -18,22 +21,22 @@ import {MatSelectionListChange} from "@angular/material/list"; }) export class HomeComponent implements OnInit { - files: File[] = []; tags: Tag[] = []; - searchTags: string[] = []; + files: File[] = []; private openingLightbox = false; - searchInputSeparators = [ENTER, COMMA]; + + @ViewChild('filesearch') fileSearch!: FileSearchComponent; constructor( private errorBroker: ErrorBrokerService, private fileService: FileService, private tagService: TagService, private lightbox: Lightbox, - private lightboxEvent: LightboxEvent) { } + private lightboxEvent: LightboxEvent) { + } async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.files = files); - await this.fileService.getFiles(); } async onFileMultiSelect(files: File[]) { @@ -58,32 +61,15 @@ export class HomeComponent implements OnInit { this.tags = await this.tagService.getTagsForFile(file.hash); } - async removeSearchTag(tag: string) { - const index = this.searchTags.indexOf(tag); - if (index >= 0) { - this.searchTags.splice(index, 1); - } - await this.fileService.findFiles(this.searchTags); - } - async addSearchTagFromList(event: MatSelectionListChange) { if (event.options.length > 0) { const tag = event.options[0].value; - this.searchTags.push(tag); - await this.fileService.findFiles(this.searchTags); + this.fileSearch.addSearchTag(tag); + await this.fileSearch.searchForFiles(); } event.source.deselectAll(); } - async addSearchTag(event: MatChipInputEvent) { - const tag = event.value.trim(); - if (tag.length > 0) { - this.searchTags.push(tag); - event.chipInput?.clear(); - await this.fileService.findFiles(this.searchTags); - } - } - async openFile(file: File) { if (this.openingLightbox) { return; @@ -91,7 +77,7 @@ export class HomeComponent implements OnInit { this.openingLightbox = true; try { await this.openLightbox(file); - } catch(err) { + } catch (err) { this.errorBroker.showError(err); } this.openingLightbox = false; diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts index a21c7a2..ff3e901 100644 --- a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -2,17 +2,25 @@ import { Injectable } from '@angular/core'; import {RepositoryService} from "../repository/repository.service"; import {BehaviorSubject} from "rxjs"; import {ErrorBrokerService} from "../error-broker/error-broker.service"; +import {TagService} from "../tag/tag.service"; +import {FileService} from "../file/file.service"; @Injectable({ providedIn: 'root' }) export class DataloaderService { - constructor(private erroBroker: ErrorBrokerService, private repositoryService: RepositoryService) { } + constructor( + private erroBroker: ErrorBrokerService, + private repositoryService: RepositoryService, + private fileService: FileService, + private tagService: TagService) { } public async loadData() { try { await this.repositoryService.loadRepositories(); + await this.tagService.loadTags(); + await this.fileService.getFiles(); } catch (err) { this.erroBroker.showError(err); } diff --git a/mediarepo-ui/src/app/services/tag/tag.service.ts b/mediarepo-ui/src/app/services/tag/tag.service.ts index 4cb36e2..05f514a 100644 --- a/mediarepo-ui/src/app/services/tag/tag.service.ts +++ b/mediarepo-ui/src/app/services/tag/tag.service.ts @@ -1,14 +1,22 @@ import { Injectable } from '@angular/core'; import {invoke} from "@tauri-apps/api/tauri"; import {Tag} from "../../models/Tag"; +import {BehaviorSubject, Observable} from "rxjs"; @Injectable({ providedIn: 'root' }) export class TagService { + public tags: BehaviorSubject = new BehaviorSubject([]); + constructor() { } + public async loadTags() { + const tags = await invoke("plugin:mediarepo|get_all_tags"); + this.tags.next(tags.map(t => new Tag(t.id, t.name, t.namespace))); + } + public async getTagsForFile(hash: string): Promise { const tags = await invoke("plugin:mediarepo|get_tags_for_file", {hash}); return tags.map(t => new Tag(t.id, t.name, t.namespace)); From 5b0769dcd28bed92fba6328910735b7c062f60c0 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 26 Oct 2021 15:50:54 +0200 Subject: [PATCH 020/183] Move home view to separate view and add tabs Signed-off-by: trivernis --- mediarepo-ui/src/app/app.module.ts | 48 +++---- .../file-search/file-search.component.ts | 2 +- .../src/app/pages/home/home.component.html | 26 +--- .../src/app/pages/home/home.component.scss | 29 +---- .../src/app/pages/home/home.component.ts | 88 +------------ .../search-page/search-page.component.html | 22 ++++ .../search-page/search-page.component.scss | 35 ++++++ .../search-page/search-page.component.spec.ts | 25 ++++ .../home/search-page/search-page.component.ts | 119 ++++++++++++++++++ 9 files changed, 239 insertions(+), 155 deletions(-) create mode 100644 mediarepo-ui/src/app/pages/home/search-page/search-page.component.html create mode 100644 mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss create mode 100644 mediarepo-ui/src/app/pages/home/search-page/search-page.component.spec.ts create mode 100644 mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index f2189e5..e386a8f 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -28,6 +28,8 @@ import {MatChipsModule} from "@angular/material/chips"; import {MatIconModule} from "@angular/material/icon"; import {MatAutocompleteModule} from "@angular/material/autocomplete"; import { FileSearchComponent } from './components/file-search/file-search.component'; +import {MatTabsModule} from "@angular/material/tabs"; +import { SearchPageComponent } from './pages/home/search-page/search-page.component'; @NgModule({ declarations: [ @@ -39,29 +41,31 @@ import { FileSearchComponent } from './components/file-search/file-search.compon FileGridComponent, FileGridEntryComponent, FileSearchComponent, + SearchPageComponent, + ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, + MatProgressBarModule, + MatPaginatorModule, + ScrollingModule, + LightboxModule, + MatChipsModule, + MatIconModule, + MatAutocompleteModule, + MatTabsModule ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatSidenavModule, - MatGridListModule, - MatProgressBarModule, - MatPaginatorModule, - ScrollingModule, - LightboxModule, - MatChipsModule, - MatIconModule, - MatAutocompleteModule - ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index 7240fcd..fdc631e 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -15,7 +15,7 @@ import {Observable} from "rxjs"; }) export class FileSearchComponent { - public searchInputSeparators = [ENTER, COMMA]; + public searchInputSeparators = [COMMA]; public formControl = new FormControl(); public searchTags: string[] = []; public suggestionTags: Observable; diff --git a/mediarepo-ui/src/app/pages/home/home.component.html b/mediarepo-ui/src/app/pages/home/home.component.html index f01c3a8..b3db129 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.html +++ b/mediarepo-ui/src/app/pages/home/home.component.html @@ -2,25 +2,9 @@

Files

- - -
- -
-

Selection Tags

- - {{tag.getNormalizedOutput()}} - -
-
-
- - - -
- + + + + +
diff --git a/mediarepo-ui/src/app/pages/home/home.component.scss b/mediarepo-ui/src/app/pages/home/home.component.scss index ff745ae..19565e8 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.scss +++ b/mediarepo-ui/src/app/pages/home/home.component.scss @@ -8,33 +8,12 @@ overflow: hidden } -#file-tag-list { - height: calc(100% - 8em); - overflow: auto; -} - -.drawer-sidebar-inner { - height: 100%; +mat-tab-group { + height: calc(100% - 64px); width: 100%; - display: block; -} - -mat-drawer { - height: 100%; - width: 25%; - overflow: hidden; } -mat-drawer-content { - overflow-x: hidden; - overflow-y: auto; +::ng-deep .mat-tab-body-wrapper { height: 100%; -} - -mat-drawer-container { - height: calc(100% - 64px); -} - -app-file-grid { - padding: 0; + width: 100%; } diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index cca01b7..4eabd72 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -19,92 +19,8 @@ import {FileSearchComponent} from "../../components/file-search/file-search.comp templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) -export class HomeComponent implements OnInit { +export class HomeComponent { - tags: Tag[] = []; - files: File[] = []; - private openingLightbox = false; - @ViewChild('filesearch') fileSearch!: FileSearchComponent; - - constructor( - private errorBroker: ErrorBrokerService, - private fileService: FileService, - private tagService: TagService, - private lightbox: Lightbox, - private lightboxEvent: LightboxEvent) { - } - - async ngOnInit() { - this.fileService.displayedFiles.subscribe((files) => this.files = files); - } - - async onFileMultiSelect(files: File[]) { - if (files.length === 0) { - this.clearFileDetails(); - } - } - - async onFileSelect(file: File | undefined) { - if (file) { - await this.showFileDetails(file); - } else { - this.clearFileDetails(); - } - } - - clearFileDetails() { - this.tags = []; - } - - async showFileDetails(file: File) { - this.tags = await this.tagService.getTagsForFile(file.hash); - } - - async addSearchTagFromList(event: MatSelectionListChange) { - if (event.options.length > 0) { - const tag = event.options[0].value; - this.fileSearch.addSearchTag(tag); - await this.fileSearch.searchForFiles(); - } - event.source.deselectAll(); - } - - async openFile(file: File) { - if (this.openingLightbox) { - return; - } - this.openingLightbox = true; - try { - await this.openLightbox(file); - } catch (err) { - this.errorBroker.showError(err); - } - this.openingLightbox = false; - } - - private async openLightbox(file: File): Promise { - let url = await this.fileService.readFile(file); - - let albums = [ - { - src: url as string, - caption: file.name ?? file.comment, - thumb: url as string, - } - ]; - this.lightbox.open(albums, 0, { - disableScrolling: true, - showImageNumberLabel: false, - showDownloadButton: true, - centerVertically: true, - }); - const lighboxSubscription = this.lightboxEvent.lightboxEvent$.subscribe( - (event: any) => { - if (event?.id == LIGHTBOX_EVENT.CLOSE) { - lighboxSubscription.unsubscribe(); - URL?.revokeObjectURL(url as string); - } - }) - } + constructor() {} } diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html new file mode 100644 index 0000000..050dbb4 --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -0,0 +1,22 @@ + + +
+ +
+

Selection Tags

+ + {{tag.getNormalizedOutput()}} + +
+
+
+ + + +
diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss new file mode 100644 index 0000000..0596f00 --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss @@ -0,0 +1,35 @@ +#file-tag-list { + height: calc(100% - 8em); + overflow: auto; +} + +.drawer-sidebar-inner { + height: 100%; + width: 100%; + display: block; +} + +mat-drawer { + height: 100%; + width: 25%; + overflow: hidden; +} + +mat-drawer-content { + overflow-x: hidden; + overflow-y: auto; + height: 100%; +} + +mat-drawer-container { + height: 100%; +} + +app-file-grid { + padding: 0; +} + +.page { + height: 100%; + width: 100%; +} diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.spec.ts b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.spec.ts new file mode 100644 index 0000000..2df8a8b --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchPageComponent } from './search-page.component'; + +describe('SearchPageComponent', () => { + let component: SearchPageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SearchPageComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SearchPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts new file mode 100644 index 0000000..b4e6fe6 --- /dev/null +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts @@ -0,0 +1,119 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; +import {Tag} from "../../../models/Tag"; +import {File} from "../../../models/File"; +import {FileSearchComponent} from "../../../components/file-search/file-search.component"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; +import {FileService} from "../../../services/file/file.service"; +import {TagService} from "../../../services/tag/tag.service"; +import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; +import {MatSelectionListChange} from "@angular/material/list"; + +@Component({ + selector: 'app-search-page', + templateUrl: './search-page.component.html', + styleUrls: ['./search-page.component.scss'] +}) +export class SearchPageComponent implements OnInit { + + tags: Tag[] = []; + files: File[] = []; + private openingLightbox = false; + + @ViewChild('filesearch') fileSearch!: FileSearchComponent; + + constructor( + private errorBroker: ErrorBrokerService, + private fileService: FileService, + private tagService: TagService, + private lightbox: Lightbox, + private lightboxEvent: LightboxEvent) { + } + + async ngOnInit() { + this.fileService.displayedFiles.subscribe((files) => this.files = files); + } + + async onFileMultiSelect(files: File[]) { + await this.showFileDetails(files); + } + + async onFileSelect(file: File | undefined) { + if (file) { + await this.showFileDetails([file]); + } else { + this.tags = []; + } + } + + async showFileDetails(files: File[]) { + this.tags = []; + + for (const file of files) { + const fileTags = await this.tagService.getTagsForFile(file.hash) + for (const tag of fileTags) { + if (this.tags.findIndex((t) => t.getNormalizedOutput() === tag.getNormalizedOutput()) < 0) { + this.tags.push(tag); + } + } + } + + this.tags = this.tags.sort((a, b) => { + const aNorm = a.getNormalizedOutput(); + const bNorm = b.getNormalizedOutput(); + if (aNorm > bNorm) { + return 1 + } else if (bNorm > aNorm) { + return -1; + } else { + return 0; + } + }); + } + + async addSearchTagFromList(event: MatSelectionListChange) { + if (event.options.length > 0) { + const tag = event.options[0].value; + this.fileSearch.addSearchTag(tag); + await this.fileSearch.searchForFiles(); + } + event.source.deselectAll(); + } + + async openFile(file: File) { + if (this.openingLightbox) { + return; + } + this.openingLightbox = true; + try { + await this.openLightbox(file); + } catch (err) { + this.errorBroker.showError(err); + } + this.openingLightbox = false; + } + + private async openLightbox(file: File): Promise { + let url = await this.fileService.readFile(file); + + let albums = [ + { + src: url as string, + caption: file.name ?? file.comment, + thumb: url as string, + } + ]; + this.lightbox.open(albums, 0, { + disableScrolling: true, + showImageNumberLabel: false, + showDownloadButton: true, + centerVertically: true, + }); + const lighboxSubscription = this.lightboxEvent.lightboxEvent$.subscribe( + (event: any) => { + if (event?.id == LIGHTBOX_EVENT.CLOSE) { + lighboxSubscription.unsubscribe(); + URL?.revokeObjectURL(url as string); + } + }) + } +} From 329962dde28c2e00092b82d270f0ecc29f94f169 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 26 Oct 2021 22:17:27 +0200 Subject: [PATCH 021/183] Add negation to search queries Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 2 +- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src/app/app.component.ts | 3 +-- .../file-search/file-search.component.html | 2 +- .../file-search/file-search.component.ts | 19 ++++++++++++------- mediarepo-ui/src/app/models/TagQuery.ts | 8 ++++++++ .../src/app/pages/home/home.component.ts | 8 ++++++-- .../services/dataloader/dataloader.service.ts | 2 -- .../src/app/services/file/file.service.ts | 3 ++- .../services/repository/repository.service.ts | 4 +++- 10 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 mediarepo-ui/src/app/models/TagQuery.ts diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index df284a3..312f22f 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -1581,7 +1581,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=4600810fca96bf6b457adc39667245a46127e5e8#4600810fca96bf6b457adc39667245a46127e5e8" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=547947b05a28bb8a9191d3691d91dc7e3c68af0f#547947b05a28bb8a9191d3691d91dc7e3c68af0f" dependencies = [ "async-trait", "chrono", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index cf835ff..52a2d26 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["env-filter"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "4600810fca96bf6b457adc39667245a46127e5e8" +rev = "547947b05a28bb8a9191d3691d91dc7e3c68af0f" features = ["tauri-plugin"] [features] diff --git a/mediarepo-ui/src/app/app.component.ts b/mediarepo-ui/src/app/app.component.ts index 8955f9d..c10aa00 100644 --- a/mediarepo-ui/src/app/app.component.ts +++ b/mediarepo-ui/src/app/app.component.ts @@ -17,7 +17,6 @@ export class AppComponent implements OnInit{ private router: Router, private snackBar: MatSnackBar, private errorBroker: ErrorBrokerService, - private dataloaderService: DataloaderService, private repoService: RepositoryService, ) { } @@ -25,7 +24,7 @@ export class AppComponent implements OnInit{ async ngOnInit() { this.errorBroker.errorCb = (err: { message: string }) => this.showError(err); this.errorBroker.infoCb = (info: string) => this.showInfo(info); - await this.dataloaderService.loadData(); + await this.repoService.loadRepositories(); if (this.repoService.selectedRepository.getValue() == undefined) { await this.router.navigate(["repositories"]) } diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.html b/mediarepo-ui/src/app/components/file-search/file-search.component.html index a74f731..783e932 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.html +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.html @@ -1,7 +1,7 @@ - {{tag}} + {{tag.getNormalizedTag()}} diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index fdc631e..a8baa87 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -7,6 +7,7 @@ import {MatChipInputEvent} from "@angular/material/chips"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; import {map, startWith} from "rxjs/operators"; import {Observable} from "rxjs"; +import {TagQuery} from "../../models/TagQuery"; @Component({ selector: 'app-file-search', @@ -17,7 +18,7 @@ export class FileSearchComponent { public searchInputSeparators = [COMMA]; public formControl = new FormControl(); - public searchTags: string[] = []; + public searchTags: TagQuery[] = []; public suggestionTags: Observable; private allTags: string[] = []; @@ -29,7 +30,7 @@ export class FileSearchComponent { this.suggestionTags = this.formControl.valueChanges.pipe(startWith(null), map( (tag: string | null) => tag ? this.allTags.filter( - (t: string) => t.includes(tag)).slice(0, 20) : this.allTags.slice(0, 20))); + (t: string) => t.includes(tag.replace(/^-/g, ''))).map((t) => tag.startsWith("-")? "-" + t : t).slice(0, 20) : this.allTags.slice(0, 20))); } public async searchForFiles() { @@ -37,10 +38,14 @@ export class FileSearchComponent { } public addSearchTag(tag: string) { - this.searchTags.push(tag); + if (tag.startsWith("-")) { + this.searchTags.push(new TagQuery(tag.replace(/^-/g, ''), true)); + } else { + this.searchTags.push(new TagQuery(tag, false)); + } } - async removeSearchTag(tag: string) { + async removeSearchTag(tag: TagQuery) { const index = this.searchTags.indexOf(tag); if (index >= 0) { this.searchTags.splice(index, 1); @@ -50,8 +55,8 @@ export class FileSearchComponent { async addSearchTagByChip(event: MatChipInputEvent) { const tag = event.value.trim(); - if (tag.length > 0 && this.allTags.includes(tag)) { - this.searchTags.push(tag); + if (tag.length > 0 && this.allTags.includes(tag.replace(/-/g, ''))) { + this.addSearchTag(tag); event.chipInput?.clear(); this.formControl.setValue(null); await this.searchForFiles(); } @@ -59,7 +64,7 @@ export class FileSearchComponent { async addSearchTagByAutocomplete(event: MatAutocompleteSelectedEvent) { const tag = event.option.viewValue; - this.searchTags.push(tag); + this.addSearchTag(tag); this.formControl.setValue(null); this.tagInput.nativeElement.value = ''; await this.searchForFiles(); } diff --git a/mediarepo-ui/src/app/models/TagQuery.ts b/mediarepo-ui/src/app/models/TagQuery.ts new file mode 100644 index 0000000..818f0ee --- /dev/null +++ b/mediarepo-ui/src/app/models/TagQuery.ts @@ -0,0 +1,8 @@ +export class TagQuery { + constructor(public name: string, public negate: boolean) { + } + + public getNormalizedTag(): string { + return this.negate? "-" + this.name : this.name; + } +} diff --git a/mediarepo-ui/src/app/pages/home/home.component.ts b/mediarepo-ui/src/app/pages/home/home.component.ts index 4eabd72..5e3e802 100644 --- a/mediarepo-ui/src/app/pages/home/home.component.ts +++ b/mediarepo-ui/src/app/pages/home/home.component.ts @@ -13,14 +13,18 @@ import {Observable} from "rxjs"; import {map, startWith} from "rxjs/operators"; import {FormControl} from "@angular/forms"; import {FileSearchComponent} from "../../components/file-search/file-search.component"; +import {DataloaderService} from "../../services/dataloader/dataloader.service"; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) -export class HomeComponent { +export class HomeComponent implements OnInit { + public async ngOnInit(): Promise { + await this.dataloaderService.loadData(); + } - constructor() {} + constructor(private dataloaderService: DataloaderService) {} } diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts index ff3e901..208b6da 100644 --- a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -12,13 +12,11 @@ export class DataloaderService { constructor( private erroBroker: ErrorBrokerService, - private repositoryService: RepositoryService, private fileService: FileService, private tagService: TagService) { } public async loadData() { try { - await this.repositoryService.loadRepositories(); await this.tagService.loadTags(); await this.fileService.getFiles(); } catch (err) { diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 49f9bfd..439e96b 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -4,6 +4,7 @@ import {File} from "../../models/File"; import {invoke} from "@tauri-apps/api/tauri"; import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; import {Thumbnail} from "../../models/Thumbnail"; +import {TagQuery} from "../../models/TagQuery"; @Injectable({ providedIn: 'root' @@ -21,7 +22,7 @@ export class FileService { this.displayedFiles.next(all_files); } - public async findFiles(tags: string[]) { + public async findFiles(tags: TagQuery[]) { let files = await invoke("plugin:mediarepo|find_files", {tags}); this.displayedFiles.next(files); } diff --git a/mediarepo-ui/src/app/services/repository/repository.service.ts b/mediarepo-ui/src/app/services/repository/repository.service.ts index e39f8af..16f44c8 100644 --- a/mediarepo-ui/src/app/services/repository/repository.service.ts +++ b/mediarepo-ui/src/app/services/repository/repository.service.ts @@ -5,6 +5,7 @@ import {invoke} from "@tauri-apps/api/tauri"; import {listen} from "@tauri-apps/api/event"; import {Info} from "../../models/Info"; import {ErrorBrokerService} from "../error-broker/error-broker.service"; +import {DataloaderService} from "../dataloader/dataloader.service"; @Injectable({ providedIn: 'root' @@ -13,7 +14,7 @@ export class RepositoryService { repositories = new BehaviorSubject([]); public selectedRepository = new BehaviorSubject(undefined); - constructor(private errorBroker: ErrorBrokerService) { + constructor(private errorBroker: ErrorBrokerService, private dataloaderService: DataloaderService) { this.registerListener() } @@ -35,6 +36,7 @@ export class RepositoryService { public async setRepository(repo: Repository) { await invoke("plugin:mediarepo|select_repository", {name: repo.name}); this.selectedRepository.next(repo); + await this.dataloaderService.loadData(); } public async addRepository(name: string, path: string) { From be2608223c3b0b79b267e2fd1f2df5acebf1574f Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 13:46:14 +0200 Subject: [PATCH 022/183] Improve file search input Signed-off-by: trivernis --- mediarepo-ui/package.json | 1 + mediarepo-ui/src-tauri/Cargo.lock | 2 +- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src/app/app.module.ts | 7 ++- .../file-search.component-theme.scss | 32 ++++++++++++ .../file-search/file-search.component.html | 30 +++++------ .../file-search/file-search.component.scss | 45 ++++++++++++++-- .../file-search/file-search.component.ts | 51 +++++++++++++------ .../search-page/search-page.component.html | 8 +-- .../search-page/search-page.component.scss | 24 +++++++-- .../services/dataloader/dataloader.service.ts | 2 +- .../src/app/services/file/file.service.ts | 9 +++- mediarepo-ui/src/styles.scss | 4 +- mediarepo-ui/yarn.lock | 7 +++ 14 files changed, 176 insertions(+), 48 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss diff --git a/mediarepo-ui/package.json b/mediarepo-ui/package.json index 0b68184..0bcd415 100644 --- a/mediarepo-ui/package.json +++ b/mediarepo-ui/package.json @@ -17,6 +17,7 @@ "@angular/common": "~12.2.0", "@angular/compiler": "~12.2.0", "@angular/core": "~12.2.0", + "@angular/flex-layout": "^12.0.0-beta.35", "@angular/forms": "~12.2.0", "@angular/material": "12.2.9", "@angular/platform-browser": "~12.2.0", diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index 312f22f..f823db1 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -1581,7 +1581,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=547947b05a28bb8a9191d3691d91dc7e3c68af0f#547947b05a28bb8a9191d3691d91dc7e3c68af0f" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=476b9d152457f78c73f6f6a36c2421cbce9c9194#476b9d152457f78c73f6f6a36c2421cbce9c9194" dependencies = [ "async-trait", "chrono", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 52a2d26..2ce7fe9 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["env-filter"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "547947b05a28bb8a9191d3691d91dc7e3c68af0f" +rev = "476b9d152457f78c73f6f6a36c2421cbce9c9194" features = ["tauri-plugin"] [features] diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index e386a8f..62057b4 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -30,6 +30,8 @@ import {MatAutocompleteModule} from "@angular/material/autocomplete"; import { FileSearchComponent } from './components/file-search/file-search.component'; import {MatTabsModule} from "@angular/material/tabs"; import { SearchPageComponent } from './pages/home/search-page/search-page.component'; +import {FlexModule, GridModule} from "@angular/flex-layout"; +import {MatRippleModule} from "@angular/material/core"; @NgModule({ declarations: [ @@ -64,7 +66,10 @@ import { SearchPageComponent } from './pages/home/search-page/search-page.compon MatChipsModule, MatIconModule, MatAutocompleteModule, - MatTabsModule + MatTabsModule, + FlexModule, + GridModule, + MatRippleModule ], providers: [], bootstrap: [AppComponent] diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss b/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss new file mode 100644 index 0000000..7f06ba8 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss @@ -0,0 +1,32 @@ +@use 'sass:map'; +@use '~@angular/material' as mat; + +@mixin color($theme) { +$color-config: mat.get-color-config($theme); +$primary-palette: map.get($color-config, 'primary'); +$warn-palette: map.get($color-config, 'warn'); + + .tag-input-item { + background-color: dimgrey; + border-radius: 1em; + } + + mat-form-field:focus { + background-color: dimgrey; + } +} + +@mixin typography($theme) { +} + +@mixin theme($theme) { +$color-config: mat.get-color-config($theme); + @if $color-config != null { + @include color($theme); + } + +$typography-config: mat.get-typography-config($theme); + @if $typography-config != null { + @include typography($theme); + } +} diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.html b/mediarepo-ui/src/app/components/file-search/file-search.component.html index 783e932..e76577f 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.html +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.html @@ -1,20 +1,20 @@ - - - - {{tag.getNormalizedTag()}} - - - - +
+
+
{{tag.getNormalizedTag()}}
+
+
+ +
+ + Enter tags to filter for + + [formControl]="formControl"/> {{tag}} diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.scss b/mediarepo-ui/src/app/components/file-search/file-search.component.scss index 47109f6..88db06f 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.scss +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.scss @@ -1,7 +1,46 @@ -#tag-search { - width: 100%; +.full-width { + min-width: 100%; + width: auto; } -.full-width { +.tag-input-list { + height: 2.7em; + padding: 0.5em 0; + width: calc(100% - 64px); + overflow-x: auto; + overflow-y: hidden; + box-shadow: 0 0 1em 0.1em rgba(0, 0, 0, 0.05) inset; +} + +.tag-input-list-and-actions { + display: block; + height: calc(3em + 10px); width: 100%; + position: relative; +} + +#delete-all-tags-button { + font-size: 0.5em; + width: 64px; + height: 100%; + padding: 0; + position: absolute; + right: 0; + top: 0; +} + +.tag-input-list-inner { + display: inline-flex; + flex-direction: row; + flex-wrap: nowrap; + width: auto; + height: 2.2em; +} + +.tag-input-item { + width: auto; + padding: 0.5em; + margin: 0 0.5em; + cursor: pointer; + white-space: nowrap; } diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index a8baa87..3ca84a9 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -1,9 +1,13 @@ -import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; +import { + AfterViewChecked, + Component, + ElementRef, + ViewChild +} from '@angular/core'; import {TagService} from "../../services/tag/tag.service"; import {FileService} from "../../services/file/file.service"; import {FormControl} from "@angular/forms"; -import {COMMA, ENTER} from "@angular/cdk/keycodes"; -import {MatChipInputEvent} from "@angular/material/chips"; +import {COMMA} from "@angular/cdk/keycodes"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; import {map, startWith} from "rxjs/operators"; import {Observable} from "rxjs"; @@ -14,7 +18,10 @@ import {TagQuery} from "../../models/TagQuery"; templateUrl: './file-search.component.html', styleUrls: ['./file-search.component.scss'] }) -export class FileSearchComponent { +export class FileSearchComponent implements AfterViewChecked { + public ngAfterViewChecked(): void { + this.inputList.nativeElement.scrollLeft = this.inputList.nativeElement.scrollWidth; + } public searchInputSeparators = [COMMA]; public formControl = new FormControl(); @@ -22,15 +29,19 @@ export class FileSearchComponent { public suggestionTags: Observable; private allTags: string[] = []; - @ViewChild('tagInput') tagInput!: ElementRef; + @ViewChild("tagInput") tagInput!: ElementRef; + @ViewChild("tagInputList") inputList!: ElementRef; constructor(private tagService: TagService, private fileService: FileService) { this.tagService.tags.subscribe( (tag) => this.allTags = tag.map(t => t.getNormalizedOutput())); - this.suggestionTags = this.formControl.valueChanges.pipe(startWith(null), map( - (tag: string | null) => tag ? this.allTags.filter( - (t: string) => t.includes(tag.replace(/^-/g, ''))).map((t) => tag.startsWith("-")? "-" + t : t).slice(0, 20) : this.allTags.slice(0, 20))); + this.suggestionTags = this.formControl.valueChanges.pipe(startWith(null), + map( + (tag: string | null) => tag ? this.allTags.filter( + (t: string) => t.includes(tag.replace(/^-/g, ''))) + .map((t) => tag.startsWith("-") ? "-" + t : t) + .slice(0, 20) : this.allTags.slice(0, 20))); } public async searchForFiles() { @@ -45,6 +56,11 @@ export class FileSearchComponent { } } + async removeAllSearchTags() { + this.searchTags = []; + await this.searchForFiles(); + } + async removeSearchTag(tag: TagQuery) { const index = this.searchTags.indexOf(tag); if (index >= 0) { @@ -53,13 +69,15 @@ export class FileSearchComponent { await this.searchForFiles(); } - async addSearchTagByChip(event: MatChipInputEvent) { - const tag = event.value.trim(); - if (tag.length > 0 && this.allTags.includes(tag.replace(/-/g, ''))) { - this.addSearchTag(tag); - event.chipInput?.clear(); - this.formControl.setValue(null); - await this.searchForFiles(); } + async addSearchTagByInput(event: KeyboardEvent) { + if (event.key === "Enter") { + const tag = (this.formControl.value as string ?? "").trim(); + if (tag.length > 0 && this.allTags.includes(tag.replace(/-/g, ''))) { + this.addSearchTag(tag); + this.formControl.setValue(null); + await this.searchForFiles(); + } + } } async addSearchTagByAutocomplete(event: MatAutocompleteSelectedEvent) { @@ -67,5 +85,6 @@ export class FileSearchComponent { this.addSearchTag(tag); this.formControl.setValue(null); this.tagInput.nativeElement.value = ''; - await this.searchForFiles(); } + await this.searchForFiles(); + } } diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html index 050dbb4..f22dc4a 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -1,8 +1,10 @@ -
- -
+
+
+ +
+

Selection Tags

diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss index 0596f00..179cb35 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss @@ -1,14 +1,28 @@ -#file-tag-list { - height: calc(100% - 8em); - overflow: auto; -} - .drawer-sidebar-inner { height: 100%; width: 100%; display: block; } +#file-search-input { + width: 100%; + overflow: hidden; +} + +app-file-search { + display: block; + width: 100%; +} + +#file-tag-list { + height: 100%; + overflow-y: auto; +} + +mat-selection-list { + height: 100%; +} + mat-drawer { height: 100%; width: 25%; diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts index 208b6da..ecd78ef 100644 --- a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -18,7 +18,7 @@ export class DataloaderService { public async loadData() { try { await this.tagService.loadTags(); - await this.fileService.getFiles(); + await this.fileService.findFiles([]); } catch (err) { this.erroBroker.showError(err); } diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 439e96b..833b50c 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -23,7 +23,14 @@ export class FileService { } public async findFiles(tags: TagQuery[]) { - let files = await invoke("plugin:mediarepo|find_files", {tags}); + const sortBy: any[] = [ + {Namespace: {tag: "creator", direction: "Descending"}}, + {Namespace: {tag: "series", direction: "Ascending"}}, + {Namespace: {tag: "title", direction: "Ascending"}}, + {Namespace: {tag: "page", direction: "Ascending"}}, + {Namespace: {tag: "panel", direction: "Ascending"}}, + ]; + let files = await invoke("plugin:mediarepo|find_files", {tags, sortBy}); this.displayedFiles.next(files); } diff --git a/mediarepo-ui/src/styles.scss b/mediarepo-ui/src/styles.scss index 7d686ba..a251b62 100644 --- a/mediarepo-ui/src/styles.scss +++ b/mediarepo-ui/src/styles.scss @@ -2,6 +2,7 @@ @use "~@angular/material" as mat; @use 'src/app/app.component-theme' as app; @use 'src/app/components/file-grid/file-grid-entry/file-grid-entry.component-theme' as file-grid-entry; +@use 'src/app/components/file-search/file-search.component-theme' as file-search; @include mat.core(); $theme: mat.define-dark-theme(( @@ -9,7 +10,7 @@ $theme: mat.define-dark-theme(( primary: mat.define-palette(mat.$deep-purple-palette), accent: mat.define-palette(mat.$green-palette), warn: mat.define-palette(mat.$red-palette), - background: mat.define-palette(mat.$grey-palette) + background: mat.define-palette(mat.$blue-grey-palette) ), typography: mat.define-typography-config( $font-family: 'Noto Sans', @@ -19,3 +20,4 @@ $theme: mat.define-dark-theme(( @include mat.all-component-themes($theme); @include app.theme($theme); @include file-grid-entry.theme($theme); +@include file-search.theme($theme); diff --git a/mediarepo-ui/yarn.lock b/mediarepo-ui/yarn.lock index 1621deb..fcc1285 100644 --- a/mediarepo-ui/yarn.lock +++ b/mediarepo-ui/yarn.lock @@ -264,6 +264,13 @@ dependencies: tslib "^2.2.0" +"@angular/flex-layout@^12.0.0-beta.35": + version "12.0.0-beta.35" + resolved "https://registry.yarnpkg.com/@angular/flex-layout/-/flex-layout-12.0.0-beta.35.tgz#b52c3c82608cbb92a119f8dcde2a5b98186fe558" + integrity sha512-nPi2MGDFuCacwWHqxF/G7lUJd2X99HbLjjUvKXnyLwyCIVgH1sfS52su2wYbVYWJRqAVAB2/VMlrtW8Khr8hDA== + dependencies: + tslib "^2.1.0" + "@angular/forms@~12.2.0": version "12.2.9" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.2.9.tgz#6d39b03413e420d3c3914ac018bc6f6f90ead39a" From a276a37d3d2ea21df1c88cbe2ee3a6d48e99ddda Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 14:24:33 +0200 Subject: [PATCH 023/183] Fix issue with multiple tags in the search expression Signed-off-by: trivernis --- .../app/components/file-search/file-search.component.ts | 7 ++++++- .../app/pages/home/search-page/search-page.component.html | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index 3ca84a9..ed2f5ee 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -50,10 +50,15 @@ export class FileSearchComponent implements AfterViewChecked { public addSearchTag(tag: string) { if (tag.startsWith("-")) { - this.searchTags.push(new TagQuery(tag.replace(/^-/g, ''), true)); + tag = tag.replace(/^-/g, ''); + this.searchTags.push(new TagQuery(tag, true)); } else { this.searchTags.push(new TagQuery(tag, false)); } + if (this.searchTags.filter(t => t.name === tag).length > 1) { + const index = this.searchTags.findIndex(t => t.name === tag); + this.searchTags.splice(index, 1); + } } async removeAllSearchTags() { diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html index f22dc4a..a47c733 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -1,5 +1,5 @@ - +
From 7737fce36a39c5763e1db2b55c6177222c02babd Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 16:04:37 +0200 Subject: [PATCH 024/183] Add sorting dialog Signed-off-by: trivernis --- mediarepo-ui/src/app/app.module.ts | 37 +++++++++++-------- .../file-grid-entry.component.ts | 2 +- .../file-search.component-theme.scss | 4 ++ .../file-search/file-search.component.html | 22 ++++++----- .../file-search/file-search.component.scss | 10 +++++ .../file-search/file-search.component.ts | 27 +++++++++++--- .../filter-dialog.component.html | 37 +++++++++++++++++++ .../filter-dialog.component.scss | 24 ++++++++++++ .../filter-dialog.component.spec.ts | 25 +++++++++++++ .../filter-dialog/filter-dialog.component.ts | 31 ++++++++++++++++ mediarepo-ui/src/app/models/SortKey.ts | 29 +++++++++++++++ .../search-page/search-page.component.html | 2 +- .../home/search-page/search-page.component.ts | 2 + .../services/dataloader/dataloader.service.ts | 2 - .../src/app/services/file/file.service.ts | 12 ++---- 15 files changed, 223 insertions(+), 43 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html create mode 100644 mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss create mode 100644 mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts create mode 100644 mediarepo-ui/src/app/models/SortKey.ts diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 62057b4..042f63c 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -1,12 +1,12 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; +import {NgModule} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RepositoriesComponent } from './pages/repositories/repositories.component'; -import { HomeComponent } from './pages/home/home.component'; -import { RepositoryCardComponent } from './pages/repositories/repository-card/repository-card.component'; +import {AppRoutingModule} from './app-routing.module'; +import {AppComponent} from './app.component'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import {RepositoriesComponent} from './pages/repositories/repositories.component'; +import {HomeComponent} from './pages/home/home.component'; +import {RepositoryCardComponent} from './pages/repositories/repository-card/repository-card.component'; import {MatCardModule} from "@angular/material/card"; import {MatListModule} from "@angular/material/list"; import {MatButtonModule} from "@angular/material/button"; @@ -15,11 +15,11 @@ import {MatSnackBarModule} from "@angular/material/snack-bar"; import {MatFormFieldModule} from "@angular/material/form-field"; import {MatInputModule} from "@angular/material/input"; import {ReactiveFormsModule} from "@angular/forms"; -import { RepoFormComponent } from './pages/repositories/repo-form/repo-form.component'; -import { FileGridComponent } from './components/file-grid/file-grid.component'; +import {RepoFormComponent} from './pages/repositories/repo-form/repo-form.component'; +import {FileGridComponent} from './components/file-grid/file-grid.component'; import {MatSidenavModule} from "@angular/material/sidenav"; import {MatGridListModule} from "@angular/material/grid-list"; -import { FileGridEntryComponent } from './components/file-grid/file-grid-entry/file-grid-entry.component'; +import {FileGridEntryComponent} from './components/file-grid/file-grid-entry/file-grid-entry.component'; import {MatProgressBarModule} from "@angular/material/progress-bar"; import {MatPaginatorModule} from "@angular/material/paginator"; import {ScrollingModule} from "@angular/cdk/scrolling"; @@ -27,11 +27,14 @@ import {LightboxModule} from "ngx-lightbox"; import {MatChipsModule} from "@angular/material/chips"; import {MatIconModule} from "@angular/material/icon"; import {MatAutocompleteModule} from "@angular/material/autocomplete"; -import { FileSearchComponent } from './components/file-search/file-search.component'; +import {FileSearchComponent} from './components/file-search/file-search.component'; import {MatTabsModule} from "@angular/material/tabs"; -import { SearchPageComponent } from './pages/home/search-page/search-page.component'; +import {SearchPageComponent} from './pages/home/search-page/search-page.component'; import {FlexModule, GridModule} from "@angular/flex-layout"; import {MatRippleModule} from "@angular/material/core"; +import {FilterDialogComponent} from './components/file-search/filter-dialog/filter-dialog.component'; +import {MatDialogModule} from "@angular/material/dialog"; +import {MatSelectModule} from "@angular/material/select"; @NgModule({ declarations: [ @@ -44,6 +47,7 @@ import {MatRippleModule} from "@angular/material/core"; FileGridEntryComponent, FileSearchComponent, SearchPageComponent, + FilterDialogComponent, ], imports: [ BrowserModule, @@ -69,9 +73,12 @@ import {MatRippleModule} from "@angular/material/core"; MatTabsModule, FlexModule, GridModule, - MatRippleModule + MatRippleModule, + MatDialogModule, + MatSelectModule, ], providers: [], bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule { +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 0dc7d5b..76c568c 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -45,7 +45,7 @@ export class FileGridEntryComponent implements OnInit, OnDestroy { try { const thumbnails = await this.fileService.getThumbnails(this.gridEntry.file.hash); let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); - this.selectedThumbnail = thumbnail; + this.selectedThumbnail = thumbnail ?? thumbnails[0]; if (!thumbnail) { console.log("Thumbnail is empty?!", thumbnails); diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss b/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss index 7f06ba8..7afff2e 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss +++ b/mediarepo-ui/src/app/components/file-search/file-search.component-theme.scss @@ -14,6 +14,10 @@ $warn-palette: map.get($color-config, 'warn'); mat-form-field:focus { background-color: dimgrey; } + + #sort-button { + background-color: darken(dimgrey, 5); + } } @mixin typography($theme) { diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.html b/mediarepo-ui/src/app/components/file-search/file-search.component.html index e76577f..fbb4360 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.html +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.html @@ -1,7 +1,8 @@
-
{{tag.getNormalizedTag()}}
+
{{tag.getNormalizedTag()}}
diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.scss b/mediarepo-ui/src/app/components/file-search/file-search.component.scss index 88db06f..15a087f 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.scss +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.scss @@ -29,6 +29,16 @@ top: 0; } +#sort-button { + width: 100%; +} + +::ng-deep #sort-button { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + .tag-input-list-inner { display: inline-flex; flex-direction: row; diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index ed2f5ee..04a56a6 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -7,11 +7,13 @@ import { import {TagService} from "../../services/tag/tag.service"; import {FileService} from "../../services/file/file.service"; import {FormControl} from "@angular/forms"; -import {COMMA} from "@angular/cdk/keycodes"; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; import {map, startWith} from "rxjs/operators"; import {Observable} from "rxjs"; import {TagQuery} from "../../models/TagQuery"; +import {SortKey} from "../../models/SortKey"; +import {MatDialog} from "@angular/material/dialog"; +import {FilterDialogComponent} from "./filter-dialog/filter-dialog.component"; @Component({ selector: 'app-file-search', @@ -23,7 +25,8 @@ export class FileSearchComponent implements AfterViewChecked { this.inputList.nativeElement.scrollLeft = this.inputList.nativeElement.scrollWidth; } - public searchInputSeparators = [COMMA]; + public sortExpression: SortKey[] = [new SortKey("FileImportedTime", + "Ascending", undefined)]; public formControl = new FormControl(); public searchTags: TagQuery[] = []; public suggestionTags: Observable; @@ -32,7 +35,7 @@ export class FileSearchComponent implements AfterViewChecked { @ViewChild("tagInput") tagInput!: ElementRef; @ViewChild("tagInputList") inputList!: ElementRef; - constructor(private tagService: TagService, private fileService: FileService) { + constructor(private tagService: TagService, private fileService: FileService, public dialog: MatDialog) { this.tagService.tags.subscribe( (tag) => this.allTags = tag.map(t => t.getNormalizedOutput())); @@ -45,7 +48,7 @@ export class FileSearchComponent implements AfterViewChecked { } public async searchForFiles() { - await this.fileService.findFiles(this.searchTags); + await this.fileService.findFiles(this.searchTags, this.sortExpression); } public addSearchTag(tag: string) { @@ -63,7 +66,7 @@ export class FileSearchComponent implements AfterViewChecked { async removeAllSearchTags() { this.searchTags = []; - await this.searchForFiles(); + await this.searchForFiles(); } async removeSearchTag(tag: TagQuery) { @@ -92,4 +95,18 @@ export class FileSearchComponent implements AfterViewChecked { this.tagInput.nativeElement.value = ''; await this.searchForFiles(); } + + openSortDialog() { + const sortEntries = this.sortExpression.map(key => JSON.parse(JSON.stringify(key))).map(key => new SortKey(key.sortType, key.sortDirection, key.namespaceName)) + const openedDialog = this.dialog.open(FilterDialogComponent, { + minWidth: "40vw", + data: { + sortEntries, + }, + }); + openedDialog.afterClosed().subscribe(async (sortExpression) => { + this.sortExpression = sortExpression; + await this.searchForFiles(); + }); + } } diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html new file mode 100644 index 0000000..0c1febe --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html @@ -0,0 +1,37 @@ +

Sort Entries

+
+
+
+ + Key + + Namespace + File Name + File Size + Time Imported + Time Created + Time Changed + File Type + Number of Tags + + + + Namespace Name + + +
+ + Direction + + Ascending + Descending + + + + +
+
+
+
+ +
diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss new file mode 100644 index 0000000..a66069b --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss @@ -0,0 +1,24 @@ +mat-dialog-content { + height: 100%; +} + +.sort-input-list { + display: table; + width: 100%; +} + +.sort-input-row { + display: table-row; + width: 100%; +} + +mat-form-field, .filler { + display: table-cell; + padding: 0 1em; +} + +.dialog-actions { + align-items: center; + text-align: center; + width: 100%; +} diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.spec.ts b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.spec.ts new file mode 100644 index 0000000..7c3bedb --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilterDialogComponent } from './filter-dialog.component'; + +describe('FilterDialogComponent', () => { + let component: FilterDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FilterDialogComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FilterDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts new file mode 100644 index 0000000..0b4ce10 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts @@ -0,0 +1,31 @@ +import {Component, Inject} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {SortKey} from "../../../models/SortKey"; + +@Component({ + selector: 'app-filter-dialog', + templateUrl: './filter-dialog.component.html', + styleUrls: ['./filter-dialog.component.scss'] +}) +export class FilterDialogComponent { + + public sortEntries: SortKey[] = [] + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) data: any) { + this.sortEntries = data.sortEntries; + } + + addNewSortKey() { + const sortKey = new SortKey("FileName", "Ascending", undefined); + this.sortEntries.push(sortKey) + } + + public removeSortKey(sortKey: SortKey): void { + const index = this.sortEntries.indexOf(sortKey); + this.sortEntries.splice(index, 1); + } + + public confirmSort(): void { + this.dialogRef.close(this.sortEntries); + } +} diff --git a/mediarepo-ui/src/app/models/SortKey.ts b/mediarepo-ui/src/app/models/SortKey.ts new file mode 100644 index 0000000..0616dbd --- /dev/null +++ b/mediarepo-ui/src/app/models/SortKey.ts @@ -0,0 +1,29 @@ +export class SortKey { + + + constructor( + public sortType: "Namespace" | "FileName" | "FileSize" | "FileImportedTime" | "FileCreatedTime" | "FileChangeTime" | "FileType" | "NumTags", + public sortDirection: "Ascending" | "Descending", + public namespaceName: string | undefined + ) {} + + public toString(): string { + if (this.sortType == "Namespace") { + return `${this.sortType} '${this.namespaceName}' ${this.sortDirection}` + } else { + return `${this.sortType} ${this.sortDirection}` + } + } + + public toBackendType(): any { + + if (this.sortType == "Namespace") { + return {"Namespace": {direction: this.sortDirection, tag: this.namespaceName}} + } else { + let returnObj: any = {}; + returnObj[this.sortType] = this.sortDirection; + + return returnObj; + } + } +} diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html index a47c733..3359c08 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -1,7 +1,7 @@
-
+
diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts index b4e6fe6..93f2988 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts @@ -7,6 +7,7 @@ import {FileService} from "../../../services/file/file.service"; import {TagService} from "../../../services/tag/tag.service"; import {Lightbox, LIGHTBOX_EVENT, LightboxEvent} from "ngx-lightbox"; import {MatSelectionListChange} from "@angular/material/list"; +import {SortKey} from "../../../models/SortKey"; @Component({ selector: 'app-search-page', @@ -31,6 +32,7 @@ export class SearchPageComponent implements OnInit { async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.files = files); + await this.fileService.findFiles([], [new SortKey("FileImportedTime", "Ascending", undefined)]) } async onFileMultiSelect(files: File[]) { diff --git a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts index ecd78ef..ddf6d82 100644 --- a/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts +++ b/mediarepo-ui/src/app/services/dataloader/dataloader.service.ts @@ -12,13 +12,11 @@ export class DataloaderService { constructor( private erroBroker: ErrorBrokerService, - private fileService: FileService, private tagService: TagService) { } public async loadData() { try { await this.tagService.loadTags(); - await this.fileService.findFiles([]); } catch (err) { this.erroBroker.showError(err); } diff --git a/mediarepo-ui/src/app/services/file/file.service.ts b/mediarepo-ui/src/app/services/file/file.service.ts index 833b50c..a782dd2 100644 --- a/mediarepo-ui/src/app/services/file/file.service.ts +++ b/mediarepo-ui/src/app/services/file/file.service.ts @@ -5,6 +5,7 @@ import {invoke} from "@tauri-apps/api/tauri"; import {DomSanitizer, SafeResourceUrl} from "@angular/platform-browser"; import {Thumbnail} from "../../models/Thumbnail"; import {TagQuery} from "../../models/TagQuery"; +import {SortKey} from "../../models/SortKey"; @Injectable({ providedIn: 'root' @@ -22,15 +23,8 @@ export class FileService { this.displayedFiles.next(all_files); } - public async findFiles(tags: TagQuery[]) { - const sortBy: any[] = [ - {Namespace: {tag: "creator", direction: "Descending"}}, - {Namespace: {tag: "series", direction: "Ascending"}}, - {Namespace: {tag: "title", direction: "Ascending"}}, - {Namespace: {tag: "page", direction: "Ascending"}}, - {Namespace: {tag: "panel", direction: "Ascending"}}, - ]; - let files = await invoke("plugin:mediarepo|find_files", {tags, sortBy}); + public async findFiles(tags: TagQuery[], sortBy: SortKey[]) { + let files = await invoke("plugin:mediarepo|find_files", {tags, sortBy: sortBy.map(k => k.toBackendType())}); this.displayedFiles.next(files); } From 1120d61cf1dc3bb43ae446909bf13e13d86d3579 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 19:05:35 +0200 Subject: [PATCH 025/183] Add gallery view Signed-off-by: trivernis --- mediarepo-ui/src/app/app.component-theme.scss | 3 +- mediarepo-ui/src/app/app.module.ts | 4 + .../file-gallery-entry.component.html | 3 + .../file-gallery-entry.component.scss | 21 +++ .../file-gallery-entry.component.spec.ts | 25 ++++ .../file-gallery-entry.component.ts | 57 ++++++++ .../file-gallery/file-gallery.component.html | 17 +++ .../file-gallery/file-gallery.component.scss | 52 +++++++ .../file-gallery.component.spec.ts | 25 ++++ .../file-gallery/file-gallery.component.ts | 130 ++++++++++++++++++ .../file-grid-entry.component.ts | 17 +-- mediarepo-ui/src/app/models/Selectable.ts | 16 +++ .../search-page/search-page.component.html | 6 +- .../search-page/search-page.component.scss | 6 + .../home/search-page/search-page.component.ts | 7 + 15 files changed, 379 insertions(+), 10 deletions(-) create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.ts create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery.component.spec.ts create mode 100644 mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts create mode 100644 mediarepo-ui/src/app/models/Selectable.ts diff --git a/mediarepo-ui/src/app/app.component-theme.scss b/mediarepo-ui/src/app/app.component-theme.scss index 3085e01..79ac3d7 100644 --- a/mediarepo-ui/src/app/app.component-theme.scss +++ b/mediarepo-ui/src/app/app.component-theme.scss @@ -11,7 +11,8 @@ color: white } ::ng-deep ::-webkit-scrollbar { - width: 10px; + width: 15px; + height: 15px; } ::ng-deep ::-webkit-scrollbar-thumb { diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index 042f63c..f048369 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -35,6 +35,8 @@ import {MatRippleModule} from "@angular/material/core"; import {FilterDialogComponent} from './components/file-search/filter-dialog/filter-dialog.component'; import {MatDialogModule} from "@angular/material/dialog"; import {MatSelectModule} from "@angular/material/select"; +import { FileGalleryComponent } from './components/file-gallery/file-gallery.component'; +import { FileGalleryEntryComponent } from './components/file-gallery/file-gallery-entry/file-gallery-entry.component'; @NgModule({ declarations: [ @@ -48,6 +50,8 @@ import {MatSelectModule} from "@angular/material/select"; FileSearchComponent, SearchPageComponent, FilterDialogComponent, + FileGalleryComponent, + FileGalleryEntryComponent, ], imports: [ BrowserModule, diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html new file mode 100644 index 0000000..1d28185 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss new file mode 100644 index 0000000..8c1208b --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss @@ -0,0 +1,21 @@ +img { + max-height: 100%; + width: auto; + margin: auto; +} + +.image-wrapper { + width: calc(100% - 20px); + height: calc(100% - 20px); + align-items: center; + text-align: center; + background-color: darken(dimgrey, 15); + padding: 10px; + border-radius: 5px; + cursor: pointer; + user-select:none; +} + +.image-wrapper.selected { + background-color: darken(dimgrey, 5); +} diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.spec.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.spec.ts new file mode 100644 index 0000000..5d0579b --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileGalleryEntryComponent } from './file-gallery-entry.component'; + +describe('FileGalleryEntryComponent', () => { + let component: FileGalleryEntryComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileGalleryEntryComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileGalleryEntryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.ts new file mode 100644 index 0000000..a666b1e --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.ts @@ -0,0 +1,57 @@ +import { + Component, + EventEmitter, + Input, OnChanges, + OnDestroy, + OnInit, + Output, SimpleChanges +} from '@angular/core'; +import {File} from "../../../models/File"; +import {FileService} from "../../../services/file/file.service"; +import {SafeResourceUrl} from "@angular/platform-browser"; +import {ErrorBrokerService} from "../../../services/error-broker/error-broker.service"; +import {Selectable} from "../../../models/Selectable"; + +@Component({ + selector: 'app-file-gallery-entry', + templateUrl: './file-gallery-entry.component.html', + styleUrls: ['./file-gallery-entry.component.scss'] +}) +export class FileGalleryEntryComponent implements OnInit, OnChanges { + + @Input() file!: Selectable; + @Output() fileSelectEvent = new EventEmitter>(); + contentUrl: SafeResourceUrl | undefined; + + private cachedFile: File | undefined; + + constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } + + async ngOnChanges(changes: SimpleChanges): Promise { + if (!this.cachedFile || this.file.data.hash !== this.cachedFile.hash) { // handle changes to the file when the component is not destroyed + this.cachedFile = this.file.data; + await this.loadImage(); + } + } + + async ngOnInit() { + this.cachedFile = this.file.data; + await this.loadImage(); + } + + async loadImage() { + try { + const thumbnails = await this.fileService.getThumbnails(this.file.data.hash); + let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); + thumbnail = thumbnail ?? thumbnails[0]; + + if (!thumbnail) { + console.log("Thumbnail is empty?!", thumbnails); + } else { + this.contentUrl = await this.fileService.readThumbnail(thumbnail!!); + } + } catch (err) { + this.errorBroker.showError(err); + } + } +} diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html new file mode 100644 index 0000000..e83642b --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -0,0 +1,17 @@ + diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss new file mode 100644 index 0000000..77de222 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss @@ -0,0 +1,52 @@ +.file-scroll-viewport { + width: 100%; + height: 100%; +} + +::ng-deep .file-scroll-viewport > .cdk-virtual-scroll-content-wrapper { + display: flex; + flex-direction: row; + height: 100%; +} + +.gallery-container { + height: 100%; + width: 100%; + position: relative; +} + +app-file-gallery-entry, .file-item { + width: 250px; + height: calc(100% - 10px); + padding: 5px; +} + +app-file-gallery-entry { + display: block; +} + +.file-full-view { + width: 100%; + height: 100%; +} + +.file-full-view-inner { + height: 100%; + width: 100%; + display: block; +} + +img { + max-height: 100%; + width: auto; + display: block; + margin: auto; +} + +.close-button { + position: absolute; + top: 0; + right: 0; + width: 3em; + height: 3em; +} diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.spec.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.spec.ts new file mode 100644 index 0000000..7b8f6e3 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileGalleryComponent } from './file-gallery.component'; + +describe('FileGalleryComponent', () => { + let component: FileGalleryComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FileGalleryComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FileGalleryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts new file mode 100644 index 0000000..5a433c4 --- /dev/null +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts @@ -0,0 +1,130 @@ +import { + Component, ElementRef, + EventEmitter, HostListener, + Input, + OnChanges, + OnInit, + Output, SimpleChanges, ViewChild +} from '@angular/core'; +import {File} from "../../models/File"; +import {FileService} from "../../services/file/file.service"; +import {SafeResourceUrl} from "@angular/platform-browser"; +import {Selectable} from "../../models/Selectable"; +import {CdkVirtualScrollViewport} from "@angular/cdk/scrolling"; + +@Component({ + selector: 'app-file-gallery', + templateUrl: './file-gallery.component.html', + styleUrls: ['./file-gallery.component.scss'] +}) +export class FileGalleryComponent implements OnChanges, OnInit { + + @Input() files: File[] = []; + @Input() preselectedFile: File | undefined; + @Output() fileSelectEvent = new EventEmitter(); + @Output() fileDblClickEvent = new EventEmitter(); + @Output() closeEvent = new EventEmitter(); + entries: Selectable[] = []; + + @ViewChild("virtualScroll") virtualScroll!: CdkVirtualScrollViewport; + + selectedFile: Selectable | undefined; + fileContentUrl: SafeResourceUrl | undefined; + + constructor(private fileService: FileService) { + } + + /** + * Called when a new entry is selected + * @param {Selectable} entry + * @returns {Promise} + */ + async onEntrySelect(entry: Selectable) { + if (entry) { + this.selectedFile?.unselect(); + entry.select(); + this.selectedFile = entry; + await this.loadSelectedFile(); + this.virtualScroll.scrollToIndex(this.entries.indexOf(entry), "smooth"); + this.fileSelectEvent.emit(this.selectedFile.data); + } + } + + /** + * Loads the content url of the selected file + * @returns {Promise} + */ + async loadSelectedFile() { + if (this.selectedFile) { + this.fileContentUrl = await this.fileService.readFile(this.selectedFile.data); + } + } + + async ngOnInit(): Promise { + if (!this.selectedFile || this.files.indexOf(this.selectedFile.data) < 0) { + await this.onEntrySelect(this.getPreselectedEntry() ?? this.entries[0]) + } + } + + public async ngOnChanges(changes: SimpleChanges): Promise { + this.entries = this.files.map(f => new Selectable(f, f == this.selectedFile?.data)); + + if (!this.selectedFile || this.files.indexOf(this.selectedFile.data) < 0) { + await this.onEntrySelect(this.getPreselectedEntry() ?? this.entries[0]) + } + } + + /** + * Selects the previous item in the gallery + * @returns {Promise} + */ + public async nextItem() { + if (this.selectedFile) { + let index = this.entries.indexOf(this.selectedFile) + 1; + if (index == this.entries.length) { + index--; // restrict to elements + } + await this.onEntrySelect(this.entries[index]); + } else { + await this.onEntrySelect(this.entries[0]) + } + } + + /** + * Selects the next item in the gallery + * @returns {Promise} + */ + public async previousItem() { + if (this.selectedFile) { + let index = this.entries.indexOf(this.selectedFile) - 1; + if (index < 0) { + index++; // restrict to elements + } + await this.onEntrySelect(this.entries[index]); + } else { + await this.onEntrySelect(this.entries[0]) + } + } + + @HostListener("window:keydown", ["$event"]) + private async handleKeydownEvent(event: KeyboardEvent) { + switch (event.key) { + case "ArrowRight": + await this.nextItem(); + break; + case "ArrowLeft": + await this.previousItem(); + break; + } + } + + private getPreselectedEntry(): Selectable | undefined { + if (this.preselectedFile) { + const entry = this.entries.find(e => e.data.hash == this.preselectedFile?.hash); + if (entry) { + return entry; + } + } + return undefined; + } +} diff --git a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts index 76c568c..7dc5b28 100644 --- a/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts +++ b/mediarepo-ui/src/app/components/file-grid/file-grid-entry/file-grid-entry.component.ts @@ -3,7 +3,7 @@ import { Input, OnInit, ViewChild, - ElementRef, Output, EventEmitter, OnDestroy + ElementRef, Output, EventEmitter, OnDestroy, OnChanges } from '@angular/core'; import {File} from "../../../models/File"; import {FileService} from "../../../services/file/file.service"; @@ -18,26 +18,27 @@ import {GridEntry} from "./GridEntry"; templateUrl: './file-grid-entry.component.html', styleUrls: ['./file-grid-entry.component.scss'] }) -export class FileGridEntryComponent implements OnInit, OnDestroy { +export class FileGridEntryComponent implements OnInit, OnChanges { @ViewChild("card") card!: ElementRef; @Input() public gridEntry!: GridEntry; @Output() clickEvent = new EventEmitter(); @Output() dblClickEvent = new EventEmitter(); - selectedThumbnail: Thumbnail | undefined; contentUrl: SafeResourceUrl | undefined; + private cachedFile: File | undefined; constructor(private fileService: FileService, private errorBroker: ErrorBrokerService) { } async ngOnInit() { + this.cachedFile = this.gridEntry.file; await this.loadImage(); } - public ngOnDestroy(): void { - if (this.contentUrl) { - const url = this.contentUrl; - this.contentUrl = undefined; + async ngOnChanges() { + if (!this.cachedFile || this.gridEntry.file.hash !== this.cachedFile.hash) { + this.cachedFile = this.gridEntry.file; + await this.loadImage(); } } @@ -45,7 +46,7 @@ export class FileGridEntryComponent implements OnInit, OnDestroy { try { const thumbnails = await this.fileService.getThumbnails(this.gridEntry.file.hash); let thumbnail = thumbnails.find(t => (t.height > 250 || t.width > 250) && (t.height < 500 && t.width < 500)); - this.selectedThumbnail = thumbnail ?? thumbnails[0]; + thumbnail = thumbnail ?? thumbnails[0]; if (!thumbnail) { console.log("Thumbnail is empty?!", thumbnails); diff --git a/mediarepo-ui/src/app/models/Selectable.ts b/mediarepo-ui/src/app/models/Selectable.ts new file mode 100644 index 0000000..f522b18 --- /dev/null +++ b/mediarepo-ui/src/app/models/Selectable.ts @@ -0,0 +1,16 @@ +export class Selectable { + constructor(public data: T, public selected: boolean) { + } + + public select() { + this.selected = true; + } + + public unselect() { + this.selected = false; + } + + public toggle() { + this.selected = !this.selected; + } +} diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html index 3359c08..f24ef21 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -16,9 +16,13 @@
- + + diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss index 179cb35..1e0f5c4 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss @@ -43,6 +43,12 @@ app-file-grid { padding: 0; } +app-file-gallery { + padding: 0; + height: 100%; + width: 100%; +} + .page { height: 100%; width: 100%; diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts index 93f2988..4c746e8 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts @@ -19,6 +19,8 @@ export class SearchPageComponent implements OnInit { tags: Tag[] = []; files: File[] = []; private openingLightbox = false; + showGallery = false; + preselectedFile: File | undefined; @ViewChild('filesearch') fileSearch!: FileSearchComponent; @@ -94,6 +96,11 @@ export class SearchPageComponent implements OnInit { this.openingLightbox = false; } + async openGallery(preselectedFile: File) { + this.preselectedFile = preselectedFile; + this.showGallery = true; + } + private async openLightbox(file: File): Promise { let url = await this.fileService.readFile(file); From 46d823720c25bc390c7e5dcf400636abf9600ce8 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 21:17:26 +0200 Subject: [PATCH 026/183] Add loading indicator to file search Signed-off-by: trivernis --- mediarepo-ui/src-tauri/Cargo.lock | 2 +- mediarepo-ui/src-tauri/Cargo.toml | 2 +- mediarepo-ui/src/app/app.module.ts | 6 ++++++ .../file-gallery-entry.component.html | 1 + .../file-gallery-entry.component.scss | 1 + .../file-gallery/file-gallery.component.html | 7 +++++-- .../file-gallery/file-gallery.component.ts | 7 +++++-- .../file-search/file-search.component.html | 2 +- .../file-search/file-search.component.ts | 17 ++++++++++++--- mediarepo-ui/src/app/models/SortKey.ts | 2 +- .../search-page/search-page.component.html | 21 +++++++++++-------- .../search-page/search-page.component.scss | 18 ++++++++++++++++ .../home/search-page/search-page.component.ts | 3 +++ 13 files changed, 69 insertions(+), 20 deletions(-) diff --git a/mediarepo-ui/src-tauri/Cargo.lock b/mediarepo-ui/src-tauri/Cargo.lock index f823db1..e91d1dd 100644 --- a/mediarepo-ui/src-tauri/Cargo.lock +++ b/mediarepo-ui/src-tauri/Cargo.lock @@ -1581,7 +1581,7 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" version = "0.1.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=476b9d152457f78c73f6f6a36c2421cbce9c9194#476b9d152457f78c73f6f6a36c2421cbce9c9194" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=c944cf5d770ac895bd01464c92d41005055c0580#c944cf5d770ac895bd01464c92d41005055c0580" dependencies = [ "async-trait", "chrono", diff --git a/mediarepo-ui/src-tauri/Cargo.toml b/mediarepo-ui/src-tauri/Cargo.toml index 2ce7fe9..167e9c3 100644 --- a/mediarepo-ui/src-tauri/Cargo.toml +++ b/mediarepo-ui/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ features = ["env-filter"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "476b9d152457f78c73f6f6a36c2421cbce9c9194" +rev = "c944cf5d770ac895bd01464c92d41005055c0580" features = ["tauri-plugin"] [features] diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index f048369..a59062f 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -37,6 +37,9 @@ import {MatDialogModule} from "@angular/material/dialog"; import {MatSelectModule} from "@angular/material/select"; import { FileGalleryComponent } from './components/file-gallery/file-gallery.component'; import { FileGalleryEntryComponent } from './components/file-gallery/file-gallery-entry/file-gallery-entry.component'; +import {MatProgressSpinnerModule} from "@angular/material/progress-spinner"; +import {BlockUIModule} from "primeng/blockui"; +import {PanelModule} from "primeng/panel"; @NgModule({ declarations: [ @@ -80,6 +83,9 @@ import { FileGalleryEntryComponent } from './components/file-gallery/file-galler MatRippleModule, MatDialogModule, MatSelectModule, + MatProgressSpinnerModule, + BlockUIModule, + PanelModule, ], providers: [], bootstrap: [AppComponent] diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html index 1d28185..cf26cee 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.html @@ -1,3 +1,4 @@
+
diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss index 8c1208b..3cf660c 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery-entry/file-gallery-entry.component.scss @@ -1,5 +1,6 @@ img { max-height: 100%; + max-width: 100%; width: auto; margin: auto; } diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html index e83642b..d119e9d 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -2,13 +2,16 @@ -
+
+
- +
diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts index 5a433c4..a3f13f8 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts @@ -67,10 +67,13 @@ export class FileGalleryComponent implements OnChanges, OnInit { } public async ngOnChanges(changes: SimpleChanges): Promise { - this.entries = this.files.map(f => new Selectable(f, f == this.selectedFile?.data)); + this.entries = this.files.map(f => new Selectable(f, f.hash == this.selectedFile?.data.hash)); + const selectedIndex = this.files.findIndex(f => f.hash === this.selectedFile?.data.hash); - if (!this.selectedFile || this.files.indexOf(this.selectedFile.data) < 0) { + if (!this.selectedFile || selectedIndex < 0) { await this.onEntrySelect(this.getPreselectedEntry() ?? this.entries[0]) + } else { + await this.onEntrySelect(this.entries[selectedIndex]) } } diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.html b/mediarepo-ui/src/app/components/file-search/file-search.component.html index fbb4360..4e52520 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.html +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.html @@ -5,7 +5,7 @@ (click)="removeSearchTag(tag)">{{tag.getNormalizedTag()}}
-
diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index 04a56a6..418167c 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -1,7 +1,7 @@ import { AfterViewChecked, Component, - ElementRef, + ElementRef, EventEmitter, Output, ViewChild } from '@angular/core'; import {TagService} from "../../services/tag/tag.service"; @@ -14,6 +14,7 @@ import {TagQuery} from "../../models/TagQuery"; import {SortKey} from "../../models/SortKey"; import {MatDialog} from "@angular/material/dialog"; import {FilterDialogComponent} from "./filter-dialog/filter-dialog.component"; +import {ErrorBrokerService} from "../../services/error-broker/error-broker.service"; @Component({ selector: 'app-file-search', @@ -30,12 +31,16 @@ export class FileSearchComponent implements AfterViewChecked { public formControl = new FormControl(); public searchTags: TagQuery[] = []; public suggestionTags: Observable; + + @Output() searchStartEvent = new EventEmitter(); + @Output() searchEndEvent = new EventEmitter(); + private allTags: string[] = []; @ViewChild("tagInput") tagInput!: ElementRef; @ViewChild("tagInputList") inputList!: ElementRef; - constructor(private tagService: TagService, private fileService: FileService, public dialog: MatDialog) { + constructor(private errorBroker: ErrorBrokerService, private tagService: TagService, private fileService: FileService, public dialog: MatDialog) { this.tagService.tags.subscribe( (tag) => this.allTags = tag.map(t => t.getNormalizedOutput())); @@ -48,7 +53,13 @@ export class FileSearchComponent implements AfterViewChecked { } public async searchForFiles() { - await this.fileService.findFiles(this.searchTags, this.sortExpression); + this.searchStartEvent.emit(); + try { + await this.fileService.findFiles(this.searchTags, this.sortExpression); + } catch (err) { + this.errorBroker.showError(err); + } + this.searchEndEvent.emit(); } public addSearchTag(tag: string) { diff --git a/mediarepo-ui/src/app/models/SortKey.ts b/mediarepo-ui/src/app/models/SortKey.ts index 0616dbd..6d8c9da 100644 --- a/mediarepo-ui/src/app/models/SortKey.ts +++ b/mediarepo-ui/src/app/models/SortKey.ts @@ -18,7 +18,7 @@ export class SortKey { public toBackendType(): any { if (this.sortType == "Namespace") { - return {"Namespace": {direction: this.sortDirection, tag: this.namespaceName}} + return {"Namespace": {direction: this.sortDirection, name: this.namespaceName}} } else { let returnObj: any = {}; returnObj[this.sortType] = this.sortDirection; diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html index f24ef21..ed3f260 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.html @@ -2,7 +2,8 @@
- +

Selection Tags

@@ -16,13 +17,15 @@
- - - +
+ +
+ +
diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss index 1e0f5c4..fc6b9c1 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.scss @@ -53,3 +53,21 @@ app-file-gallery { height: 100%; width: 100%; } + +.spinner-overlay { + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 998; + overflow: hidden; + display: flex; + backdrop-filter: blur(5px); + + mat-progress-spinner { + z-index: 999; + margin: auto; + } +} diff --git a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts index 4c746e8..3154c85 100644 --- a/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts +++ b/mediarepo-ui/src/app/pages/home/search-page/search-page.component.ts @@ -21,6 +21,7 @@ export class SearchPageComponent implements OnInit { private openingLightbox = false; showGallery = false; preselectedFile: File | undefined; + contentLoading = false; @ViewChild('filesearch') fileSearch!: FileSearchComponent; @@ -34,7 +35,9 @@ export class SearchPageComponent implements OnInit { async ngOnInit() { this.fileService.displayedFiles.subscribe((files) => this.files = files); + this.contentLoading = true; await this.fileService.findFiles([], [new SortKey("FileImportedTime", "Ascending", undefined)]) + this.contentLoading = false; } async onFileMultiSelect(files: File[]) { From b989e02bee6afdd39f9b1029e5bc67e9094741c2 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 21:29:05 +0200 Subject: [PATCH 027/183] Add cancel to sort dialog and fix backdrop close Signed-off-by: trivernis --- .../app/components/file-search/file-search.component.ts | 7 +++++-- .../file-search/filter-dialog/filter-dialog.component.html | 1 + .../file-search/filter-dialog/filter-dialog.component.scss | 7 +++++-- .../file-search/filter-dialog/filter-dialog.component.ts | 4 ++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/mediarepo-ui/src/app/components/file-search/file-search.component.ts b/mediarepo-ui/src/app/components/file-search/file-search.component.ts index 418167c..761dd1a 100644 --- a/mediarepo-ui/src/app/components/file-search/file-search.component.ts +++ b/mediarepo-ui/src/app/components/file-search/file-search.component.ts @@ -114,10 +114,13 @@ export class FileSearchComponent implements AfterViewChecked { data: { sortEntries, }, + disableClose: true, }); openedDialog.afterClosed().subscribe(async (sortExpression) => { - this.sortExpression = sortExpression; - await this.searchForFiles(); + if (sortExpression) { + this.sortExpression = sortExpression; + await this.searchForFiles(); + } }); } } diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html index 0c1febe..d5c7153 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html @@ -34,4 +34,5 @@
+
diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss index a66069b..0a45271 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss @@ -18,7 +18,10 @@ mat-form-field, .filler { } .dialog-actions { - align-items: center; - text-align: center; + display: flex; + flex-direction: row-reverse; width: 100%; + button { + margin-left: 1em; + } } diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts index 0b4ce10..9cb90e4 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts @@ -28,4 +28,8 @@ export class FilterDialogComponent { public confirmSort(): void { this.dialogRef.close(this.sortEntries); } + + public cancelSort(): void { + this.dialogRef.close() + } } From 8990b0f906c3ecd367baaec6436920d152105ba2 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 30 Oct 2021 21:55:48 +0200 Subject: [PATCH 028/183] Add loading indicator to file gallery display Signed-off-by: trivernis --- .../file-gallery/file-gallery.component.html | 5 ++++- .../file-gallery/file-gallery.component.scss | 14 ++++++++++++++ .../file-gallery/file-gallery.component.ts | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html index d119e9d..76e3127 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -5,7 +5,10 @@
- +
+ +
+ Image
diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss index 77de222..2414535 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss @@ -34,6 +34,7 @@ app-file-gallery-entry { height: 100%; width: 100%; display: block; + position: relative; } img { @@ -50,3 +51,16 @@ img { width: 3em; height: 3em; } + +.url-loading-backdrop { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + overflow: hidden; + display: flex; + mat-progress-spinner { + margin: auto; + } +} diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts index a3f13f8..468bc39 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts @@ -56,6 +56,7 @@ export class FileGalleryComponent implements OnChanges, OnInit { */ async loadSelectedFile() { if (this.selectedFile) { + this.fileContentUrl = undefined; this.fileContentUrl = await this.fileService.readFile(this.selectedFile.data); } } From 80d0de87f93c2f87187fe347cdc725204f4e687c Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 31 Oct 2021 00:29:12 +0200 Subject: [PATCH 029/183] Fix z-index of gallery close button Signed-off-by: trivernis --- .../src/app/components/file-gallery/file-gallery.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss index 2414535..00a5cc0 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss @@ -50,6 +50,7 @@ img { right: 0; width: 3em; height: 3em; + z-index: 999; } .url-loading-backdrop { From fa37c5868344ce80aefa4e3383a24c5e62574efe Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 31 Oct 2021 08:28:16 +0100 Subject: [PATCH 030/183] Allow ordering the sort order via drag and drop Signed-off-by: trivernis --- mediarepo-ui/src/app/app.module.ts | 64 ++++++++++--------- .../filter-dialog.component.html | 6 +- .../filter-dialog.component.scss | 33 +++++++++- .../filter-dialog/filter-dialog.component.ts | 5 ++ 4 files changed, 74 insertions(+), 34 deletions(-) diff --git a/mediarepo-ui/src/app/app.module.ts b/mediarepo-ui/src/app/app.module.ts index a59062f..d1dd417 100644 --- a/mediarepo-ui/src/app/app.module.ts +++ b/mediarepo-ui/src/app/app.module.ts @@ -40,6 +40,7 @@ import { FileGalleryEntryComponent } from './components/file-gallery/file-galler import {MatProgressSpinnerModule} from "@angular/material/progress-spinner"; import {BlockUIModule} from "primeng/blockui"; import {PanelModule} from "primeng/panel"; +import {DragDropModule} from "@angular/cdk/drag-drop"; @NgModule({ declarations: [ @@ -56,37 +57,38 @@ import {PanelModule} from "primeng/panel"; FileGalleryComponent, FileGalleryEntryComponent, ], - imports: [ - BrowserModule, - AppRoutingModule, - BrowserAnimationsModule, - MatCardModule, - MatListModule, - MatButtonModule, - MatToolbarModule, - MatSnackBarModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatSidenavModule, - MatGridListModule, - MatProgressBarModule, - MatPaginatorModule, - ScrollingModule, - LightboxModule, - MatChipsModule, - MatIconModule, - MatAutocompleteModule, - MatTabsModule, - FlexModule, - GridModule, - MatRippleModule, - MatDialogModule, - MatSelectModule, - MatProgressSpinnerModule, - BlockUIModule, - PanelModule, - ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + MatCardModule, + MatListModule, + MatButtonModule, + MatToolbarModule, + MatSnackBarModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + MatSidenavModule, + MatGridListModule, + MatProgressBarModule, + MatPaginatorModule, + ScrollingModule, + LightboxModule, + MatChipsModule, + MatIconModule, + MatAutocompleteModule, + MatTabsModule, + FlexModule, + GridModule, + MatRippleModule, + MatDialogModule, + MatSelectModule, + MatProgressSpinnerModule, + BlockUIModule, + PanelModule, + DragDropModule, + ], providers: [], bootstrap: [AppComponent] }) diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html index d5c7153..d022cb1 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.html @@ -1,7 +1,9 @@

Sort Entries

-
-
+
+
+
+
drag_handle
Key diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss index 0a45271..1245e67 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.scss @@ -12,7 +12,7 @@ mat-dialog-content { width: 100%; } -mat-form-field, .filler { +mat-form-field, .filler, .drag-handle { display: table-cell; padding: 0 1em; } @@ -25,3 +25,34 @@ mat-form-field, .filler { margin-left: 1em; } } + +.drag-handle { + cursor: grab; + height: 100%; + width: 2em; +} + +.drag-handle:active { + cursor: grabbing; +} + +::ng-deep .cdk-drag-preview { + box-sizing: border-box; + border-radius: 4px; + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), + 0 8px 10px 1px rgba(0, 0, 0, 0.14), + 0 3px 14px 2px rgba(0, 0, 0, 0.12); + background: rgba(0, 0, 0, 0.5); +} + +::ng-deep .cdk-drag-animating { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +.drag-placeholder { + display: block; + height: 71px; + width: 100%; + background-color: darken(dimgrey, 20); + border-radius: 1em; +} diff --git a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts index 9cb90e4..a4eb477 100644 --- a/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts +++ b/mediarepo-ui/src/app/components/file-search/filter-dialog/filter-dialog.component.ts @@ -1,6 +1,7 @@ import {Component, Inject} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {SortKey} from "../../../models/SortKey"; +import {CdkDragDrop, moveItemInArray} from "@angular/cdk/drag-drop"; @Component({ selector: 'app-filter-dialog', @@ -32,4 +33,8 @@ export class FilterDialogComponent { public cancelSort(): void { this.dialogRef.close() } + + public onSortEntryDrop(event: CdkDragDrop): void { + moveItemInArray(this.sortEntries, event.previousIndex, event.currentIndex); + } } From e93e75221ecc19832d9f98e97475b6ebb2f4f110 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 31 Oct 2021 08:47:23 +0100 Subject: [PATCH 031/183] Add scaling of full image view depending on aspect ratio Signed-off-by: trivernis --- .../components/file-gallery/file-gallery.component.html | 6 ++++-- .../components/file-gallery/file-gallery.component.scss | 9 +++++++++ .../components/file-gallery/file-gallery.component.ts | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html index 76e3127..18984fd 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -4,11 +4,13 @@
-
+
- Image + Image
diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss index 00a5cc0..92aade4 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.scss @@ -44,6 +44,15 @@ img { margin: auto; } +.align-width { + width: 100%; + height: auto; +} +.align-height { + height: 100%; + width: auto; +} + .close-button { position: absolute; top: 0; diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts index 468bc39..b241a1a 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.ts @@ -30,6 +30,7 @@ export class FileGalleryComponent implements OnChanges, OnInit { selectedFile: Selectable | undefined; fileContentUrl: SafeResourceUrl | undefined; + scaleWidth = false; constructor(private fileService: FileService) { } @@ -131,4 +132,11 @@ export class FileGalleryComponent implements OnChanges, OnInit { } return undefined; } + + public adjustImageSize(fullImage: HTMLImageElement, imageContainer: HTMLDivElement): void { + const containerRatio = imageContainer.clientHeight / imageContainer.clientWidth; + const imageAdjHeight = fullImage.height / containerRatio; + const imageAdjWidth = fullImage.width * containerRatio; + this.scaleWidth = imageAdjWidth > imageAdjHeight; + } } From 79bcf7c528c123fd74f4ff8b86f92d49ebf4c6b1 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 31 Oct 2021 09:20:46 +0100 Subject: [PATCH 032/183] Fix to Keep selection when exiting the gallery view Signed-off-by: trivernis --- .../file-gallery/file-gallery.component.html | 2 +- .../file-gallery/file-gallery.component.ts | 4 +- .../file-grid/file-grid.component.html | 2 +- .../file-grid/file-grid.component.ts | 59 +++++++++++++++++-- .../search-page/search-page.component.html | 3 +- .../home/search-page/search-page.component.ts | 5 ++ 6 files changed, 66 insertions(+), 9 deletions(-) diff --git a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html index 18984fd..b32b076 100644 --- a/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html +++ b/mediarepo-ui/src/app/components/file-gallery/file-gallery.component.html @@ -1,5 +1,5 @@