diff --git a/.eslintrc.json b/.eslintrc.json index 31d2023e3..4fd0d7001 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,7 +7,7 @@ "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ - "error", + "warn", { "enforceBuildableLibDependency": true, "allow": [], diff --git a/.vscode/settings.json b/.vscode/settings.json index ae38b7d37..19aa47027 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,6 @@ "apps/picsa-server/_deprecated/scripts" ], "deno.unstable": true, - "deno.config": "apps/picsa-server/supabase/functions/deno.jsonc" + "deno.config": "apps/picsa-server/supabase/functions/deno.jsonc", + "angular.enable-strict-mode-prompt": false } diff --git a/apps/picsa-apps/dashboard/.eslintrc.json b/apps/picsa-apps/dashboard/.eslintrc.json index 904d31f0d..a8a7428e6 100644 --- a/apps/picsa-apps/dashboard/.eslintrc.json +++ b/apps/picsa-apps/dashboard/.eslintrc.json @@ -6,6 +6,8 @@ "files": ["*.ts"], "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"], "rules": { + "@typescript-eslint/no-unused-vars": ["warn"], + "@typescript-eslint/no-explicit-any": ["warn"], "@angular-eslint/directive-selector": [ "error", { diff --git a/apps/picsa-apps/dashboard/src/app/app.component.html b/apps/picsa-apps/dashboard/src/app/app.component.html index 1fcd78283..1330340b3 100644 --- a/apps/picsa-apps/dashboard/src/app/app.component.html +++ b/apps/picsa-apps/dashboard/src/app/app.component.html @@ -4,9 +4,9 @@ menu PICSA Dashboard - @if(supabaseService.authUser(); as user){ + @if(supabaseService.auth.authUser(); as user){
- @@ -16,7 +16,7 @@
} @else { - @@ -24,10 +24,30 @@ - + @for (link of navLinks; track link.href) { - {{ link.label }} + + {{ link.label }} + + } + +
Global Admin
+ + @for (link of globalLinks; track link.href) { + + {{ link.label }} + }
diff --git a/apps/picsa-apps/dashboard/src/app/app.component.scss b/apps/picsa-apps/dashboard/src/app/app.component.scss index 457cb4bcf..696b9d0ec 100644 --- a/apps/picsa-apps/dashboard/src/app/app.component.scss +++ b/apps/picsa-apps/dashboard/src/app/app.component.scss @@ -3,6 +3,10 @@ mat-sidenav { } mat-nav-list { --mdc-list-list-item-one-line-container-height: 48px; + + height: calc(100% - 16px); + display: flex; + flex-direction: column; } mat-toolbar { z-index: 2; @@ -11,3 +15,6 @@ mat-sidenav-content { display: flex; flex-direction: column; } +.active-link { + text-decoration: underline; +} diff --git a/apps/picsa-apps/dashboard/src/app/app.component.ts b/apps/picsa-apps/dashboard/src/app/app.component.ts index 74d8f63ba..bac41280c 100644 --- a/apps/picsa-apps/dashboard/src/app/app.component.ts +++ b/apps/picsa-apps/dashboard/src/app/app.component.ts @@ -1,7 +1,6 @@ import { CommonModule } from '@angular/common'; import { AfterViewInit, Component } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { PicsaNotificationService } from '@picsa/shared/services/core/notification.service'; import { SupabaseService } from '@picsa/shared/services/core/supabase'; import { DashboardMaterialModule } from './material.module'; @@ -27,16 +26,43 @@ export class AppComponent implements AfterViewInit { label: 'Home', href: '/', }, + { + label: 'Resources', + href: '/resources', + }, + // { + // label: 'Climate Data', + // href: '/climate-data', + // }, + // { + // label: 'Crop Information', + // href: '/crop-information', + // }, + // { + // label: 'Monitoring Forms', + // href: '/monitoring-forms', + // }, + // { + // label: 'Translations', + // href: '/translations', + // }, + ]; + + globalLinks: INavLink[] = [ + // { + // label: 'Deployments', + // href: '/deployments', + // }, // { - // label: 'Resources', - // href: '/resources', + // label: 'Users', + // href: '/users', // }, ]; - constructor(public supabaseService: SupabaseService, private notificationService: PicsaNotificationService) {} + constructor(public supabaseService: SupabaseService) {} async ngAfterViewInit() { - await this.supabaseService.init(); - await this.supabaseService.signInDefaultUser(); + await this.supabaseService.ready(); + await this.supabaseService.auth.signInDefaultUser(); } } diff --git a/apps/picsa-apps/dashboard/src/app/app.routes.ts b/apps/picsa-apps/dashboard/src/app/app.routes.ts index 0e7f01bb8..e417943af 100644 --- a/apps/picsa-apps/dashboard/src/app/app.routes.ts +++ b/apps/picsa-apps/dashboard/src/app/app.routes.ts @@ -3,6 +3,6 @@ import { Route } from '@angular/router'; export const appRoutes: Route[] = [ { path: 'resources', - loadChildren: () => import('./pages/resources/resources.module').then((m) => m.ResourcesPageModule), + loadChildren: () => import('./modules/resources/resources.module').then((m) => m.ResourcesPageModule), }, ]; diff --git a/apps/picsa-apps/dashboard/src/app/material.module.ts b/apps/picsa-apps/dashboard/src/app/material.module.ts index dd707f61e..e6dd0d0ce 100644 --- a/apps/picsa-apps/dashboard/src/app/material.module.ts +++ b/apps/picsa-apps/dashboard/src/app/material.module.ts @@ -1,11 +1,31 @@ import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; import { MatListModule } from '@angular/material/list'; +import { MatRadioModule } from '@angular/material/radio'; import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatTableModule } from '@angular/material/table'; +import { MatTabsModule } from '@angular/material/tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -const matModules = [MatButtonModule, MatIconModule, MatListModule, MatSidenavModule, MatToolbarModule]; +const matModules = [ + MatButtonModule, + MatChipsModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatRadioModule, + MatSidenavModule, + MatStepperModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, +]; @NgModule({ imports: matModules, diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/components/index.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/components/index.ts new file mode 100644 index 000000000..576086513 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/components/index.ts @@ -0,0 +1 @@ +export * from './storage-link/storage-link.component'; diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.html b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.html new file mode 100644 index 000000000..e0bed275f --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.html @@ -0,0 +1,29 @@ +@if(entry){ @switch (displayStyle) { + +@case ('button') { + + +} + +@case ('link') { + + + +} + +@default { +
+ {{ fileTypeIcon }} +
{{ entry.name?.split('/')?.pop() }}
+
+} } } @if(notFound) { +

Storage file not found

+} diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.scss b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.scss new file mode 100644 index 000000000..77f37357e --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.scss @@ -0,0 +1,82 @@ +:host { + display: block; + max-width: 200px; +} +.error-message { + color: var(--color-warn); +} +mat-icon { + overflow: visible; +} + +a { + text-decoration: none; + color: var(--color-primary); +} + +button.chip-button { + padding: 0; + margin-bottom: 4px; + border: 1px solid; + height: auto; + + .chip-icon { + color: white; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 32px; + display: flex; + align-items: center; + justify-content: center; + } + .chip-text { + margin-left: 32px; + padding: 8px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } +} +.filename { + word-break: break-word; +} + +// Colors used for different filetypes +$color-file-document: hsl(230, 40%, 40%); +$color-file-video: hsl(0, 70%, 60%); +$color-file-image: hsl(150, 60%, 40%); +$color-file-audio: hsl(300, 60%, 40%); + +.filetype-icon { + color: var(--color-primary); + &[data-icon='description'] { + color: $color-file-document; + } + &[data-icon='smart_display'] { + color: $color-file-video; + } + &[data-icon='image'] { + color: $color-file-image; + } + &[data-icon='music_note'] { + color: $color-file-audio; + } +} + +.filetype-icon.inverted { + color: white; + background: var(--color-primary); + &[data-icon='description'] { + background: $color-file-document; + } + &[data-icon='smart_display'] { + background: $color-file-video; + } + &[data-icon='image'] { + background: $color-file-image; + } + &[data-icon='music_note'] { + background: $color-file-audio; + } +} diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.spec.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.spec.ts new file mode 100644 index 000000000..4cde03cf4 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DashboardResourcesStorageLinkComponent } from './storage-link.component'; + +describe('StorageLinkComponent', () => { + let component: DashboardResourcesStorageLinkComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DashboardResourcesStorageLinkComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(DashboardResourcesStorageLinkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.ts new file mode 100644 index 000000000..d30f030bb --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/components/storage-link/storage-link.component.ts @@ -0,0 +1,65 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input, OnInit } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { IResourceStorageEntry, ResourcesDashboardService } from '../../resources.service'; + +/** + * Mat icons used to represent various filetype extensions + * https://fonts.google.com/icons + */ +const filetypeIconMapping = { + pdf: 'description', + jpeg: 'image', + jpg: 'image', + png: 'image', + svg: 'image', + mp4: 'smart_display', + mp3: 'music_note', +}; + +@Component({ + selector: 'dashboard-resources-storage-link', + standalone: true, + imports: [CommonModule, MatButtonModule, MatIconModule], + templateUrl: './storage-link.component.html', + styleUrls: ['./storage-link.component.scss'], +}) +/** + * Minimal component that takes a storage file id input and returns a link + * to the public url of the file, as populated from resources store cache + */ +export class DashboardResourcesStorageLinkComponent implements OnInit { + /** Resource storage id */ + @Input() id: string; + + @Input() displayStyle: 'button' | 'link' | 'default' = 'default'; + + constructor(private service: ResourcesDashboardService) {} + + public entry?: IResourceStorageEntry; + + public notFound = false; + + public fileTypeIcon = 'description'; + + async ngOnInit() { + const entry = await this.service.getStorageFileById(this.id); + this.entry = entry; + this.notFound = entry ? false : true; + if (entry) { + this.fileTypeIcon = this.getFileTypeIcon(entry); + } + } + + public handleLinkClick(url: string) { + window.open(url, '_blank', 'noopener'); + } + + private getFileTypeIcon(entry: IResourceStorageEntry) { + const extension = entry.name?.split('.').pop(); + if (!extension) return 'document'; + return filetypeIconMapping[extension] || 'document'; + } +} diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.html b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.html new file mode 100644 index 000000000..0fbc4250e --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.html @@ -0,0 +1,119 @@ +
+

Edit Resource

+ +
+ + + File + Link + +
+ + @if (resourceType==='file') { +
+ + @for (item of [{code:'global',label:'Global'}]; track $index) { + +
+ +
+ + @if(fileForm.value.storage_file ){ + + + } @else { + + + } +
+ +
+ + @if(fileForm.value.storage_cover ){ + + + + + } @else { + + + } +
+ + + Title + + + + + Description + + +
+
+ } +
+ +
+ + } @if (resourceType==='link') { +
+ + URL + + + @if (linkForm.controls.url.errors) { + Please enter a valid url + } +
+ } +
diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.scss b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.scss new file mode 100644 index 000000000..0b10c43ce --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.scss @@ -0,0 +1,40 @@ +mat-radio-button { + margin-right: 1rem; +} +mat-form-field { + flex: 1; + min-width: 200px; +} + +label { + display: flex; + align-items: center; + margin-bottom: 1rem; + mat-icon { + margin-right: 4px; + } +} +picsa-supabase-upload { + width: 100%; + max-width: 284px; +} +dashboard-resources-storage-link { + display: inline-block; +} +button.file-remove { + display: inline; + padding: 0; + mat-icon { + margin-bottom: -4px; + } +} +textarea.mdc-text-field__input { + color: var(--color-primary) !important; + font-size: 20px; +} +img.cover-preview { + width: 200px; + max-height: 200px; + object-fit: contain; + border: 1px solid var(--color-light); +} diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.spec.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.spec.ts new file mode 100644 index 000000000..d5188806c --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ResourceCreateComponent } from './resource-create.component'; + +describe('ResourceCreateComponent', () => { + let component: ResourceCreateComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ResourceCreateComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ResourceCreateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.ts new file mode 100644 index 000000000..500e29ea6 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/create/resource-create.component.ts @@ -0,0 +1,115 @@ +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import type { Database } from '@picsa/server-types'; +import { PICSAFormValidators } from '@picsa/shared/modules/forms/validators'; +import { + IUploadResult, + SupabaseStoragePickerDirective, + SupabaseUploadComponent, +} from '@picsa/shared/services/core/supabase'; +import { IStorageEntry } from '@picsa/shared/services/core/supabase/services/supabase-storage.service'; + +import { DashboardMaterialModule } from '../../../../material.module'; +import { DashboardResourcesStorageLinkComponent } from '../../components/storage-link/storage-link.component'; +import { ResourcesDashboardService } from '../../resources.service'; + +type IResourceEntry = Database['public']['Tables']['resources']['Row']; + +@Component({ + selector: 'dashboard-resource-create', + standalone: true, + imports: [ + CommonModule, + DashboardMaterialModule, + DashboardResourcesStorageLinkComponent, + FormsModule, + ReactiveFormsModule, + SupabaseStoragePickerDirective, + SupabaseUploadComponent, + ], + templateUrl: './resource-create.component.html', + styleUrls: ['./resource-create.component.scss'], +}) +export class ResourceCreateComponent implements OnInit { + constructor( + private service: ResourcesDashboardService, + private formBuilder: FormBuilder, + private route: ActivatedRoute + ) {} + + public resourceType: 'file' | 'link'; + + public allowedFileTypes = ['pdf', 'mp4', 'mp3', 'jpg', 'jpeg', 'svg', 'png', 'webp'].map((ext) => `.${ext}`); + public allowedCoverTypes = ['jpg', 'jpeg', 'svg', 'png'].map((ext) => `.${ext}`); + + public linkForm = this.formBuilder.group({ + id: new FormControl(null), + type: ['link'], + url: ['', PICSAFormValidators.isUrl], + }); + public fileForm = this.formBuilder.group({ + id: new FormControl(null), + type: ['file'], + title: ['', Validators.required], + description: [''], + storage_file: ['', Validators.required], + storage_cover: [''], + }); + + private get form() { + return this.resourceType === 'file' ? this.fileForm : this.linkForm; + } + + async ngOnInit() { + await this.service.ready(); + const { id } = this.route.snapshot.params; + if (id) { + const { data } = await this.service.table.select<'*', IResourceEntry>('*').eq('id', id); + const resource = data?.[0]; + if (resource) { + this.populateResource(resource); + } + } + } + + // TODO - handle success/error messages + public async saveResource() { + const values = this.form.getRawValue() as any; + // Remove id entry if not populated + if (values.id === null) { + delete values.id; + } + const { data, error } = await this.service.table.upsert(values); + console.log({ data, error }); + } + + private populateResource(resource: IResourceEntry) { + this.resourceType = resource.type as any; + console.log('populate resource', resource); + switch (resource.type) { + case 'file': + this.fileForm.patchValue(resource); + break; + case 'link': + this.linkForm.patchValue(resource); + break; + default: + console.warn('Resource type not supported', resource.type); + } + } + + public async handleUploadComplete(res: IUploadResult[], controlName: 'storage_file' | 'storage_cover') { + if (res.length === 0) { + return; + } + const [{ entry }] = res; + this.fileForm.patchValue({ [controlName]: entry.id }); + } + + public handleStorageFileSelected(entry: IStorageEntry | undefined, controlName: 'storage_file' | 'storage_cover') { + this.fileForm.patchValue({ [controlName]: entry?.id }); + } +} diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.html b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.html new file mode 100644 index 000000000..d184666bb --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.html @@ -0,0 +1,30 @@ +
+
+

Resources

+ +
+ + + + + + + + + + + + +
Title{{resource.title}}storage_file + @if(resource.storage_file; as storage_file ){ + + } +
+ +

Super Admin

+ + +
diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.scss b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.scss new file mode 100644 index 000000000..05bb98ef7 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.scss @@ -0,0 +1,14 @@ +table.resources-table { + max-height: 50vh; + display: block; + overflow: auto; +} +tr.resource-row { + cursor: pointer; + &:hover { + background: whitesmoke; + } +} +th { + font-weight: bold; +} diff --git a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.spec.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.spec.ts similarity index 100% rename from apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.spec.ts rename to apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.spec.ts diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.ts new file mode 100644 index 000000000..9628f05d2 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/pages/home/resources.page.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { DashboardMaterialModule } from '../../../../material.module'; +import { DashboardResourcesStorageLinkComponent } from '../../components'; +import { ResourcesDashboardService } from '../../resources.service'; + +@Component({ + selector: 'dashboard-resources-page', + standalone: true, + imports: [CommonModule, DashboardResourcesStorageLinkComponent, DashboardMaterialModule, RouterModule], + templateUrl: './resources.page.html', + styleUrls: ['./resources.page.scss'], +}) +export class ResourcesPageComponent implements OnInit { + public displayedColumns = ['title', 'storage_file']; + constructor(public service: ResourcesDashboardService) {} + ngOnInit(): void { + this.service.ready(); + } +} diff --git a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.module.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/resources.module.ts similarity index 52% rename from apps/picsa-apps/dashboard/src/app/pages/resources/resources.module.ts rename to apps/picsa-apps/dashboard/src/app/modules/resources/resources.module.ts index c47e15277..f51054707 100644 --- a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.module.ts +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/resources.module.ts @@ -2,7 +2,8 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { ResourcesPageComponent } from './resources.page'; +import { ResourceCreateComponent } from './pages/create/resource-create.component'; +import { ResourcesPageComponent } from './pages/home/resources.page'; @NgModule({ declarations: [], @@ -13,6 +14,14 @@ import { ResourcesPageComponent } from './resources.page'; path: '', component: ResourcesPageComponent, }, + { + path: 'create', + component: ResourceCreateComponent, + }, + { + path: ':id', + component: ResourceCreateComponent, + }, ]), ], }) diff --git a/apps/picsa-apps/dashboard/src/app/modules/resources/resources.service.ts b/apps/picsa-apps/dashboard/src/app/modules/resources/resources.service.ts new file mode 100644 index 000000000..0638c4133 --- /dev/null +++ b/apps/picsa-apps/dashboard/src/app/modules/resources/resources.service.ts @@ -0,0 +1,113 @@ +import { Injectable, signal } from '@angular/core'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import { Database } from '@picsa/server-types'; +import { PicsaAsyncService } from '@picsa/shared/services/asyncService.service'; +import { PicsaNotificationService } from '@picsa/shared/services/core/notification.service'; +import { SupabaseService } from '@picsa/shared/services/core/supabase'; +import { IStorageEntry } from '@picsa/shared/services/core/supabase/services/supabase-storage.service'; +import { arrayToHashmap } from '@picsa/utils'; + +export interface IResourceStorageEntry extends IStorageEntry { + /** Url generated when upload to public bucket (will always be populated, even if bucket not public) */ + publicUrl: string; +} + +export type IResourceEntry = Database['public']['Tables']['resources']['Row']; + +@Injectable({ providedIn: 'root' }) +export class ResourcesDashboardService extends PicsaAsyncService { + private storageFiles: IResourceStorageEntry[] = []; + public storageFilesHashmap: Record = {}; + public readonly resources = signal([]); + + public get table() { + return this.supabaseService.db.table('resources'); + } + + constructor(private supabaseService: SupabaseService, private notificationService: PicsaNotificationService) { + super(); + } + + public override async init() { + await this.supabaseService.ready(); + await this.listStorageFiles(); + await this.listResources(); + } + + /** Retrieve storage db meta for a file */ + public async getStorageFileById(id: string) { + // Refresh storage file cache if id not found + if (!this.storageFilesHashmap[id]) { + await this.listStorageFiles(); + } + return this.storageFilesHashmap[id]; + } + + /** + * + * TODO - only enable super admin/local dev + * TODO - remove when no longer required + */ + public async migrateHardcodedResources() { + // NOTE - assumes storage files manually uploaded + + // eslint-disable-next-line @nx/enforce-module-boundaries + const { DB_COLLECTION_ENTRIES, DB_FILE_ENTRIES, DB_LINK_ENTRIES } = await import( + '@picsa/resources/src/app/data/index' + ); + console.log({ DB_COLLECTION_ENTRIES, DB_FILE_ENTRIES, DB_LINK_ENTRIES }); + const ref = this.supabaseService.db.table('resources'); + const uploaded: unknown[] = []; + const missing: unknown[] = []; + + for (const fileEntry of Object.values(DB_FILE_ENTRIES)) { + const { type, description, url } = fileEntry; + // extract pathname from firebase url + const { pathname } = new URL(url); + const storagePath = decodeURI(pathname).replace(/%2F/g, '/').replace('/v0/b/picsa-apps.appspot.com/o/', ''); + // check for equivalent storage file + const storageFile = this.storageFiles.find((file) => file.name === storagePath); + if (storageFile) { + const dbEntry: Database['public']['Tables']['resources']['Insert'] = { + description, + type, + + storage_file: storageFile.id, + }; + const { error } = await ref.upsert(dbEntry, { ignoreDuplicates: false }); + + if (error) { + console.error(error); + } + uploaded.push(fileEntry); + } else { + missing.push(fileEntry); + } + } + console.log({ uploaded, missing }); + if (missing.length > 0) { + this.notificationService.showUserNotification({ + matIcon: 'error', + message: `${missing.length} files missing from storage`, + }); + } + } + + private async listStorageFiles() { + const storageFiles = await this.supabaseService.storage.list('resources'); + this.storageFiles = storageFiles.map((file) => ({ + ...file, + publicUrl: this.supabaseService.storage.getPublicLink(file.bucket_id as string, file.name as string), + })); + this.storageFilesHashmap = arrayToHashmap(this.storageFiles, 'id'); + console.log('storage files', this.storageFilesHashmap); + } + + private async listResources() { + const { data, error } = await this.supabaseService.db.table('resources').select<'*', IResourceEntry>('*'); + if (error) { + throw error; + } + this.resources.set(data); + } +} diff --git a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.html b/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.html deleted file mode 100644 index 16913ac32..000000000 --- a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.html +++ /dev/null @@ -1,4 +0,0 @@ -
- - -
diff --git a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.scss b/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.ts b/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.ts deleted file mode 100644 index e77cef65d..000000000 --- a/apps/picsa-apps/dashboard/src/app/pages/resources/resources.page.ts +++ /dev/null @@ -1,30 +0,0 @@ -import '@uppy/core/dist/style.min.css'; -import '@uppy/dashboard/dist/style.min.css'; - -import { CommonModule } from '@angular/common'; -import { Component, OnInit } from '@angular/core'; -import { SupabaseService } from '@picsa/shared/services/core/supabase'; -import { UppyAngularDashboardModule } from '@uppy/angular'; -import Uppy from '@uppy/core'; - -import { DashboardMaterialModule } from '../../material.module'; - -@Component({ - selector: 'dashboard-resources-page', - standalone: true, - imports: [CommonModule, DashboardMaterialModule, UppyAngularDashboardModule], - templateUrl: './resources.page.html', - styleUrls: ['./resources.page.scss'], -}) -export class ResourcesPageComponent implements OnInit { - uppy: Uppy = new Uppy({ debug: true, autoProceed: true }); - - constructor(public supabaseService: SupabaseService) {} - - async ngOnInit() { - const table = this.supabaseService.db.table('resources'); - - const { data, error } = await table.select(); - console.log({ data, error }); - } -} diff --git a/apps/picsa-apps/dashboard/tsconfig.json b/apps/picsa-apps/dashboard/tsconfig.json index 25ca437b4..d15278881 100644 --- a/apps/picsa-apps/dashboard/tsconfig.json +++ b/apps/picsa-apps/dashboard/tsconfig.json @@ -6,7 +6,7 @@ "forceConsistentCasingInFileNames": true, "strict": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, + "noPropertyAccessFromIndexSignature": false, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true }, diff --git a/apps/picsa-server/supabase/migrations/20231012180747_create_monitoring_tool_submissions.sql b/apps/picsa-server/supabase/migrations/20231012180747_create_monitoring_tool_submissions.sql index c7743bc46..c937ba48a 100644 --- a/apps/picsa-server/supabase/migrations/20231012180747_create_monitoring_tool_submissions.sql +++ b/apps/picsa-server/supabase/migrations/20231012180747_create_monitoring_tool_submissions.sql @@ -1,14 +1,32 @@ +SET + statement_timeout = 0; -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET xmloption = content; -SET client_min_messages = warning; -SET row_security = off; +SET + lock_timeout = 0; + +SET + idle_in_transaction_session_timeout = 0; + +SET + client_encoding = 'UTF8'; + +SET + standard_conforming_strings = on; + +SELECT + pg_catalog.set_config('search_path', '', false); + +SET + check_function_bodies = false; + +SET + xmloption = content; + +SET + client_min_messages = warning; + +SET + row_security = off; CREATE EXTENSION IF NOT EXISTS "pgsodium" WITH SCHEMA "pgsodium"; @@ -24,50 +42,72 @@ CREATE EXTENSION IF NOT EXISTS "supabase_vault" WITH SCHEMA "vault"; CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA "extensions"; -SET default_tablespace = ''; +SET + default_tablespace = ''; -SET default_table_access_method = "heap"; +SET + default_table_access_method = "heap"; CREATE TABLE IF NOT EXISTS "public"."monitoring_tool_submissions" ( - "_id" "text" NOT NULL, - "_created" timestamp with time zone DEFAULT "now"() NOT NULL, - "_modified" timestamp with time zone DEFAULT "now"() NOT NULL, - "formId" character varying NOT NULL, - "enketoEntry" "jsonb" NOT NULL, - "json" "jsonb" NOT NULL, - "_app_user_id" character varying NOT NULL, - "_attachments" "jsonb" NOT NULL, - "_deleted" boolean DEFAULT false NOT NULL + "_id" "text" NOT NULL, + "_created" timestamp with time zone DEFAULT "now"() NOT NULL, + "_modified" timestamp with time zone DEFAULT "now"() NOT NULL, + "formId" character varying NOT NULL, + "enketoEntry" "jsonb" NOT NULL, + "json" "jsonb" NOT NULL, + "_app_user_id" character varying NOT NULL, + "_attachments" "jsonb" NOT NULL, + "_deleted" boolean DEFAULT false NOT NULL ); -ALTER TABLE "public"."monitoring_tool_submissions" OWNER TO "postgres"; +ALTER TABLE + "public"."monitoring_tool_submissions" OWNER TO "postgres"; + +ALTER TABLE + ONLY "public"."monitoring_tool_submissions" +ADD + CONSTRAINT "monitoring_tool_submissions_pkey" PRIMARY KEY ("_id"); -ALTER TABLE ONLY "public"."monitoring_tool_submissions" - ADD CONSTRAINT "monitoring_tool_submissions_pkey" PRIMARY KEY ("_id"); +REVOKE USAGE ON SCHEMA "public" +FROM + PUBLIC; -REVOKE USAGE ON SCHEMA "public" FROM PUBLIC; GRANT USAGE ON SCHEMA "public" TO "postgres"; + GRANT USAGE ON SCHEMA "public" TO "anon"; + GRANT USAGE ON SCHEMA "public" TO "authenticated"; + GRANT USAGE ON SCHEMA "public" TO "service_role"; GRANT ALL ON TABLE "public"."monitoring_tool_submissions" TO "anon"; + GRANT ALL ON TABLE "public"."monitoring_tool_submissions" TO "authenticated"; + GRANT ALL ON TABLE "public"."monitoring_tool_submissions" TO "service_role"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated"; -ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role"; -RESET ALL; +RESET ALL; \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231016165456_add_kobo_sync.sql b/apps/picsa-server/supabase/migrations/20231016165456_add_kobo_sync.sql index 258cd3144..9f1e10123 100644 --- a/apps/picsa-server/supabase/migrations/20231016165456_add_kobo_sync.sql +++ b/apps/picsa-server/supabase/migrations/20231016165456_add_kobo_sync.sql @@ -1,52 +1,61 @@ -- kobo_sync table keeps track of all pending sync operations CREATE TABLE IF NOT EXISTS "public"."kobo_sync" ( - "_id" "text", - "_created" timestamp with time zone DEFAULT "now"() NOT NULL, - "_modified" timestamp with time zone DEFAULT "now"() NOT NULL, - "operation" "text" NOT NULL, - "kobo_form_id" "text", - "kobo_uuid" "text", - "kobo_sync_time" timestamp with time zone, - "kobo_sync_status" integer, - "enketo_entry" "jsonb", - "kobo_sync_required" boolean GENERATED ALWAYS AS ((kobo_sync_time IS NULL) OR (kobo_sync_time < _modified)) STORED, - constraint kobo_sync_pkey primary key (_id) + "_id" "text", + "_created" timestamp with time zone DEFAULT "now"() NOT NULL, + "_modified" timestamp with time zone DEFAULT "now"() NOT NULL, + "operation" "text" NOT NULL, + "kobo_form_id" "text", + "kobo_uuid" "text", + "kobo_sync_time" timestamp with time zone, + "kobo_sync_status" integer, + "enketo_entry" "jsonb", + "kobo_sync_required" boolean GENERATED ALWAYS AS ( + (kobo_sync_time IS NULL) + OR (kobo_sync_time < _modified) + ) STORED, + constraint kobo_sync_pkey primary key (_id) ); -- Write to kobo_sync table when records changed -- Assumes synced table includes _id reference column -create function add_kobo_sync_entry() returns trigger as $$ -begin - -- Handle upsert - if (TG_OP = 'CREATE' OR TG_OP = 'UPDATE') then - insert into - kobo_sync(_id, operation, enketo_entry) - values - -- Hack - enketoEntry must be quoted as default to lowercase. - -- Extract json xml child property, cast to text and then cast to xml data type - -- TODO - would be cleaner if just storing xml in app instead of enketoEntry json - -- although would need to be more careful with handling escape characters (can store as xml data type) - (NEW._id, TG_OP, NEW."enketoEntry") - ON CONFLICT (_id) DO UPDATE - SET - operation = 'UPDATE', - enketo_entry = excluded.enketo_entry, - _modified = excluded._modified; - -- Handle delete - -- TODO - want to avoid updating current row, prefer to delete current and create new 'DELETE' entry - -- (double detection with update followed by delete) - elsif (TG_OP = 'DELETE') then - insert into - kobo_sync(_id, operation) - values - (OLD._id, TG_OP) - ON CONFLICT (_id) DO UPDATE - SET - operation = 'DELETE', - _modified = excluded._modified; - END IF; - RETURN NULL; +create function add_kobo_sync_entry() returns trigger as $$ begin -- Handle upsert +if ( + TG_OP = 'CREATE' + OR TG_OP = 'UPDATE' +) then +insert into + kobo_sync(_id, operation, enketo_entry) +values + -- Hack - enketoEntry must be quoted as default to lowercase. + -- Extract json xml child property, cast to text and then cast to xml data type + -- TODO - would be cleaner if just storing xml in app instead of enketoEntry json + -- although would need to be more careful with handling escape characters (can store as xml data type) + (NEW._id, TG_OP, NEW."enketoEntry") ON CONFLICT (_id) DO +UPDATE +SET + operation = 'UPDATE', + enketo_entry = excluded.enketo_entry, + _modified = excluded._modified; + +-- Handle delete +-- TODO - want to avoid updating current row, prefer to delete current and create new 'DELETE' entry +-- (double detection with update followed by delete) +elsif (TG_OP = 'DELETE') then +insert into + kobo_sync(_id, operation) +values + (OLD._id, TG_OP) ON CONFLICT (_id) DO +UPDATE +SET + operation = 'DELETE', + _modified = excluded._modified; + +END IF; + +RETURN NULL; + end; + $$ language plpgsql; -- Trigger kobo-sync backend function when kobo_sync table updated @@ -54,21 +63,19 @@ $$ language plpgsql; -- https://github.com/supabase/pg_net/issues/79 -- https://github.com/orgs/supabase/discussions/9837 create trigger trigger_kobo_sync_function - after insert or update on kobo_sync - for each row - -- TODO - handle production endpoint and auth token - execute function "supabase_functions"."http_request"( +after +insert + or +update + on kobo_sync for each row -- TODO - handle production endpoint and auth token + execute function "supabase_functions"."http_request"( 'http://172.17.0.1:54321/functions/v1/kobo-sync', 'POST', '{"Content-Type":"application/json", "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU"}', '{}', '1000' - ); - - - + ); -- Alt - could concat id with table `concat(TG_TABLE_NAME,'||',NEW._id` - -- Alt - could keep one entry per instance ID although could lead to data loss if next batch process -- starts before previous finishes \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231016168059_kobo_sync_monitoring_tool_submissions.sql b/apps/picsa-server/supabase/migrations/20231016168059_kobo_sync_monitoring_tool_submissions.sql index 662d43cb8..41158241e 100644 --- a/apps/picsa-server/supabase/migrations/20231016168059_kobo_sync_monitoring_tool_submissions.sql +++ b/apps/picsa-server/supabase/migrations/20231016168059_kobo_sync_monitoring_tool_submissions.sql @@ -1,5 +1,7 @@ -- Sync records from monitoring_tool_submissions table to kobo create trigger monitoring_tool_kobo_sync - after insert or update or delete on monitoring_tool_submissions - for each row - execute function add_kobo_sync_entry(); \ No newline at end of file +after +insert + or +update + or delete on monitoring_tool_submissions for each row execute function add_kobo_sync_entry(); \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231130163233_resources_storage_bucket.sql b/apps/picsa-server/supabase/migrations/20231130163233_resources_storage_bucket.sql new file mode 100644 index 000000000..e1094ecab --- /dev/null +++ b/apps/picsa-server/supabase/migrations/20231130163233_resources_storage_bucket.sql @@ -0,0 +1,27 @@ +-- Use Postgres to create a bucket. +insert into + storage.buckets (id, name, public) +values + ('resources', 'resources', true); + +-- Make resources fully accessisble to public +-- NOTE - SELECT and UPDATE requires `WITH CHECK` whilst others require `USING` +-- https://www.postgresql.org/docs/current/sql-createpolicy.html#:~:text=The%20USING%20expression%20determines%20which,stored%20back%20into%20the%20relation. +-- TODO - try to limit some actions to authentciated (needs troubleshooting) +-- https://supabase.com/docs/guides/storage/security/access-control +CREATE POLICY "Storage resources public INSERT" ON storage.objects FOR +INSERT + TO public WITH CHECK (bucket_id = 'resources'); + +CREATE POLICY "Storage resources public SELECT" ON storage.objects FOR +SELECT + TO public USING (bucket_id = 'resources'); + +CREATE POLICY "Storage resources public UPDATE" ON storage.objects FOR +UPDATE + TO public USING (bucket_id = 'resources'); + +CREATE POLICY "Storage resources public DELETE" ON storage.objects FOR DELETE TO public USING (bucket_id = 'resources'); + +-- CREATE POLICY "(debug) full access" ON "storage"."objects" AS PERMISSIVE +-- FOR ALL TO authenticated WITH CHECK (bucket_id = 'resources') \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231130163716_auth_anon_user.sql b/apps/picsa-server/supabase/migrations/20231130163716_auth_anon_user.sql new file mode 100644 index 000000000..438aa7995 --- /dev/null +++ b/apps/picsa-server/supabase/migrations/20231130163716_auth_anon_user.sql @@ -0,0 +1,43 @@ +-- https://github.com/orgs/supabase/discussions/5248 +INSERT INTO + auth.users ( + id, + instance_id, + ROLE, + aud, + email, + raw_app_meta_data, + raw_user_meta_data, + is_super_admin, + encrypted_password, + created_at, + updated_at, + last_sign_in_at, + email_confirmed_at, + confirmation_sent_at, + confirmation_token, + recovery_token, + email_change_token_new, + email_change + ) +VALUES + ( + gen_random_uuid(), + '00000000-0000-0000-0000-000000000000', + 'authenticated', + 'authenticated', + 'anonymous_user@picsa.app', + '{"provider":"email","providers":["email"]}', + '{}', + FALSE, + crypt('anonymous_user@picsa.app', gen_salt('bf')), + NOW(), + NOW(), + NOW(), + NOW(), + NOW(), + '', + '', + '', + '' + ); \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231204104530_resources_table_create.sql b/apps/picsa-server/supabase/migrations/20231204104530_resources_table_create.sql new file mode 100644 index 000000000..a535a9cc6 --- /dev/null +++ b/apps/picsa-server/supabase/migrations/20231204104530_resources_table_create.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS "public"."resources" ( + "id" text not null default gen_random_uuid (), + "created_at" timestamp with time zone not null default now(), + "modified_at" timestamp with time zone not null default now(), + "type" text not null, + "description" text not null default ''::text, + "storage_file" uuid null, + "storage_cover" uuid null, + "title" text null, + constraint resources_pkey primary key (id), + constraint resources_storage_cover_fkey foreign key (storage_cover) references storage.objects (id) on update cascade on delete set null, + constraint resources_storage_file_fkey foreign key (storage_file) references storage.objects (id) on update cascade on delete set null); + +CREATE POLICY "Resources authenticated public access" ON "public"."resources" AS PERMISSIVE FOR ALL TO PUBLIC USING (true) \ No newline at end of file diff --git a/apps/picsa-server/supabase/migrations/20231204124638_storage_objects_view.sql b/apps/picsa-server/supabase/migrations/20231204124638_storage_objects_view.sql new file mode 100644 index 000000000..d3e005efe --- /dev/null +++ b/apps/picsa-server/supabase/migrations/20231204124638_storage_objects_view.sql @@ -0,0 +1,15 @@ +-- List resource entries from private storage.objects table +CREATE VIEW storage_objects AS +SELECT + * +FROM + storage.objects; + +-- create or replace function storage_objects_list() +-- returns setof Record language plpgsql security definer +-- set search_path = public as $$ +-- begin +-- return query +-- select * from storage.objects; +-- end; +-- $$ \ No newline at end of file diff --git a/apps/picsa-server/supabase/types/index.ts b/apps/picsa-server/supabase/types/index.ts index 7da0fb0f8..581e0b7c7 100644 --- a/apps/picsa-server/supabase/types/index.ts +++ b/apps/picsa-server/supabase/types/index.ts @@ -109,9 +109,161 @@ export interface Database { } Relationships: [] } + resources: { + Row: { + created_at: string + description: string | null + id: string + modified_at: string + storage_cover: string | null + storage_file: string | null + type: string + } + Insert: { + created_at?: string + description?: string | null + id?: string + modified_at?: string + storage_cover?: string | null + storage_file?: string | null + type: string + } + Update: { + created_at?: string + description?: string | null + id?: string + modified_at?: string + storage_cover?: string | null + storage_file?: string | null + type?: string + } + Relationships: [ + { + foreignKeyName: "resources_storage_cover_fkey" + columns: ["storage_cover"] + referencedRelation: "objects" + referencedColumns: ["id"] + }, + { + foreignKeyName: "resources_storage_cover_fkey" + columns: ["storage_cover"] + referencedRelation: "storage_objects" + referencedColumns: ["id"] + }, + { + foreignKeyName: "resources_storage_file_fkey" + columns: ["storage_file"] + referencedRelation: "objects" + referencedColumns: ["id"] + }, + { + foreignKeyName: "resources_storage_file_fkey" + columns: ["storage_file"] + referencedRelation: "storage_objects" + referencedColumns: ["id"] + } + ] + } + resources_child: { + Row: { + country_code: string | null + created_at: string + id: number + language_code: string | null + parent: string + storage_file: string + tag: string | null + } + Insert: { + country_code?: string | null + created_at?: string + id?: number + language_code?: string | null + parent: string + storage_file: string + tag?: string | null + } + Update: { + country_code?: string | null + created_at?: string + id?: number + language_code?: string | null + parent?: string + storage_file?: string + tag?: string | null + } + Relationships: [ + { + foreignKeyName: "resources_child_parent_fkey" + columns: ["parent"] + referencedRelation: "resources" + referencedColumns: ["id"] + }, + { + foreignKeyName: "resources_child_storage_file_fkey" + columns: ["storage_file"] + referencedRelation: "objects" + referencedColumns: ["id"] + }, + { + foreignKeyName: "resources_child_storage_file_fkey" + columns: ["storage_file"] + referencedRelation: "storage_objects" + referencedColumns: ["id"] + } + ] + } } Views: { - [_ in never]: never + storage_objects: { + Row: { + bucket_id: string | null + created_at: string | null + id: string | null + last_accessed_at: string | null + metadata: Json | null + name: string | null + owner: string | null + owner_id: string | null + path_tokens: string[] | null + updated_at: string | null + version: string | null + } + Insert: { + bucket_id?: string | null + created_at?: string | null + id?: string | null + last_accessed_at?: string | null + metadata?: Json | null + name?: string | null + owner?: string | null + owner_id?: string | null + path_tokens?: string[] | null + updated_at?: string | null + version?: string | null + } + Update: { + bucket_id?: string | null + created_at?: string | null + id?: string | null + last_accessed_at?: string | null + metadata?: Json | null + name?: string | null + owner?: string | null + owner_id?: string | null + path_tokens?: string[] | null + updated_at?: string | null + version?: string | null + } + Relationships: [ + { + foreignKeyName: "objects_bucketId_fkey" + columns: ["bucket_id"] + referencedRelation: "buckets" + referencedColumns: ["id"] + } + ] + } } Functions: { [_ in never]: never @@ -134,6 +286,7 @@ export interface Database { id: string name: string owner: string | null + owner_id: string | null public: boolean | null updated_at: string | null } @@ -145,6 +298,7 @@ export interface Database { id: string name: string owner?: string | null + owner_id?: string | null public?: boolean | null updated_at?: string | null } @@ -156,17 +310,11 @@ export interface Database { id?: string name?: string owner?: string | null + owner_id?: string | null public?: boolean | null updated_at?: string | null } - Relationships: [ - { - foreignKeyName: "buckets_owner_fkey" - columns: ["owner"] - referencedRelation: "users" - referencedColumns: ["id"] - } - ] + Relationships: [] } migrations: { Row: { @@ -198,6 +346,7 @@ export interface Database { metadata: Json | null name: string | null owner: string | null + owner_id: string | null path_tokens: string[] | null updated_at: string | null version: string | null @@ -210,6 +359,7 @@ export interface Database { metadata?: Json | null name?: string | null owner?: string | null + owner_id?: string | null path_tokens?: string[] | null updated_at?: string | null version?: string | null @@ -222,6 +372,7 @@ export interface Database { metadata?: Json | null name?: string | null owner?: string | null + owner_id?: string | null path_tokens?: string[] | null updated_at?: string | null version?: string | null diff --git a/apps/picsa-tools/resources-tool/server/.gitignore b/apps/picsa-tools/resources-tool/server/.gitignore index 49e5796a3..93f607ab6 100644 --- a/apps/picsa-tools/resources-tool/server/.gitignore +++ b/apps/picsa-tools/resources-tool/server/.gitignore @@ -1,3 +1,4 @@ *.* +resources !.gitignore !README.md \ No newline at end of file diff --git a/apps/picsa-tools/resources-tool/src/app/data/index.ts b/apps/picsa-tools/resources-tool/src/app/data/index.ts index d191138c7..b67e475d7 100644 --- a/apps/picsa-tools/resources-tool/src/app/data/index.ts +++ b/apps/picsa-tools/resources-tool/src/app/data/index.ts @@ -11,7 +11,6 @@ const byId: Record = { ...WEATHER, ...PICSA_RESOURCES, }; -console.log({ PICSA_RESOURCES }); const typeExports: { collection: schemas.IResourceCollection[]; diff --git a/libs/environments/src/.gitignore b/libs/environments/src/.gitignore new file mode 100644 index 000000000..4ebf008cd --- /dev/null +++ b/libs/environments/src/.gitignore @@ -0,0 +1 @@ +supabase/config.json \ No newline at end of file diff --git a/libs/environments/src/environment.prod.ts b/libs/environments/src/environment.prod.ts index 7c7eecb14..9bc6bb12d 100644 --- a/libs/environments/src/environment.prod.ts +++ b/libs/environments/src/environment.prod.ts @@ -11,10 +11,14 @@ const productionEnvironment: IEnvironment = { defaultConfiguration: 'global', // TODO - load from CI supabase: { - apiUrl: 'https://earfrmpodubnbuhclccx.supabase.co', appUser: { email: 'anonymous_user@picsa.app' }, - anonKey: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVhcmZybXBvZHVibmJ1aGNsY2N4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODQ3NTM2ODIsImV4cCI6MjAwMDMyOTY4Mn0.bNZcTIB-LqzcubgEy0_azbw7chMtCp-w4Ss9plTeuKY', + load: async () => { + return { + anonKey: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVhcmZybXBvZHVibmJ1aGNsY2N4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODQ3NTM2ODIsImV4cCI6MjAwMDMyOTY4Mn0.bNZcTIB-LqzcubgEy0_azbw7chMtCp-w4Ss9plTeuKY', + apiUrl: 'https://earfrmpodubnbuhclccx.supabase.co', + }; + }, }, }; diff --git a/libs/environments/src/environment.ts b/libs/environments/src/environment.ts index e35b6528a..c920890c8 100644 --- a/libs/environments/src/environment.ts +++ b/libs/environments/src/environment.ts @@ -10,10 +10,36 @@ const ENVIRONMENT: IEnvironment = { production: false, supabase: { ...PRODUCTION_ENVIRONMENT.supabase, - apiUrl: 'http://localhost:54321', - anonKey: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0', + load: loadSupabaseDevEnvironment, }, }; export default ENVIRONMENT; + +/** + * Asynchronously load supabase dev environment from local config file + * This enables any developers to provide their own local anonKey by creating a + * `config.json` file in the local `supabase` environment folder + * + * https://stackoverflow.com/a/47956054/5693245 + * */ +async function loadSupabaseDevEnvironment(): Promise<{ anonKey: string; apiUrl: string }> { + const defaultConfig = { + anonKey: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0', + apiUrl: 'http://localhost:54321', + }; + return new Promise((resolve) => { + try { + // Use a variable filename so that compiler bundles all files in folder + // regardless of whether specific config file exists or not + const filename = 'config.json'; + import(`./supabase/${filename}`).then((res) => { + resolve({ ...defaultConfig, ...res.default }); + }); + } catch (error) { + console.warn('[Supabase] Dev config not provided\nlibs/environments/src/supabase/config.json'); + resolve(defaultConfig); + } + }); +} diff --git a/libs/environments/src/supabase/config.example.json b/libs/environments/src/supabase/config.example.json new file mode 100644 index 000000000..63fee1d3c --- /dev/null +++ b/libs/environments/src/supabase/config.example.json @@ -0,0 +1,3 @@ +{ + "anonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.my_supabase_anon_key" +} diff --git a/libs/models/src/models.ts b/libs/models/src/models.ts index fe7ce1909..ec1830776 100644 --- a/libs/models/src/models.ts +++ b/libs/models/src/models.ts @@ -34,11 +34,13 @@ export interface IFirebaseConfig { } export interface ISupabaseConfig { - apiUrl: string; /** Default credentials used by app to login as anonymous user */ appUser: { email: string; password?: string }; - /** DB anon key (TODO - is required?) */ - anonKey: string; + /** Async function used to load credentials which may be stored in local file */ + load: () => Promise<{ + anonKey: string; + apiUrl: string; + }>; } // combined settings diff --git a/libs/shared/src/modules/forms/errorStateMatcher.ts b/libs/shared/src/modules/forms/errorStateMatcher.ts new file mode 100644 index 000000000..2bc94ca06 --- /dev/null +++ b/libs/shared/src/modules/forms/errorStateMatcher.ts @@ -0,0 +1,13 @@ +import { FormControl, FormGroupDirective, NgForm } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; + +/** + * Implement custom error handler to only display if control is dirty, touched, or submitted. + * https://material.angular.io/components/input/overview#changing-when-error-messages-are-shown + * */ +export class showErrorAfterInteraction implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/libs/shared/src/modules/forms/index.ts b/libs/shared/src/modules/forms/index.ts new file mode 100644 index 000000000..54a549e2c --- /dev/null +++ b/libs/shared/src/modules/forms/index.ts @@ -0,0 +1,3 @@ +export * from './components'; +export * from './forms.module'; +export * from './validators'; diff --git a/libs/shared/src/modules/forms/validators/index.ts b/libs/shared/src/modules/forms/validators/index.ts new file mode 100644 index 000000000..0bd9608b0 --- /dev/null +++ b/libs/shared/src/modules/forms/validators/index.ts @@ -0,0 +1,7 @@ +import isUrl from './isUrl'; +import passwordMatch from './passwordMatch'; + +export const PICSAFormValidators = { + isUrl, + passwordMatch, +}; diff --git a/libs/shared/src/modules/forms/validators/isUrl.ts b/libs/shared/src/modules/forms/validators/isUrl.ts new file mode 100644 index 000000000..79fa27433 --- /dev/null +++ b/libs/shared/src/modules/forms/validators/isUrl.ts @@ -0,0 +1,7 @@ +import { Validators } from '@angular/forms'; + +/** + * Custom form validator to match url regex pattern + * https://www.positronx.io/angular-url-validation-with-reactive-forms-tutorial/ + */ +export default Validators.pattern('(https?://)?([\\da-z.-]+)\\.([a-z.]{2,6})[/\\w .-]*/?'); diff --git a/libs/shared/src/modules/forms/validators/passwordMatch.ts b/libs/shared/src/modules/forms/validators/passwordMatch.ts new file mode 100644 index 000000000..8c1f899dd --- /dev/null +++ b/libs/shared/src/modules/forms/validators/passwordMatch.ts @@ -0,0 +1,15 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; + +/** + * Custom form validator to ensure passwords match. Adapted from + * https://stackoverflow.com/a/51606362/5693245 + */ +const passwordMatch: ValidatorFn = (control: AbstractControl): ValidationErrors | null => { + if (!control) return null; + const form = control.parent; + if (!form) return null; + const pass = form.get('password')?.value; + return pass === control.value ? null : { notSame: true }; +}; + +export default passwordMatch; diff --git a/libs/shared/src/services/core/supabase/components/index.ts b/libs/shared/src/services/core/supabase/components/index.ts new file mode 100644 index 000000000..8ad6b3ecd --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/index.ts @@ -0,0 +1,2 @@ +export * from './storage-file-picker/storage-file-picker.component'; +export * from './upload/supabase-upload.component'; diff --git a/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.html b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.html new file mode 100644 index 000000000..de68e0fce --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.html @@ -0,0 +1,24 @@ + + @for (entry of fileEntries; track entry.id) { + {{ entry.name }} + } + +
+ @if(previewUrl){ + + + } +
+ +
+ + +
diff --git a/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.scss b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.scss new file mode 100644 index 000000000..ae33ec169 --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.scss @@ -0,0 +1,15 @@ +.preview-image { + height: 200px; + width: 200px; + border: 1px solid var(--color-light); + img { + object-fit: contain; + width: 100%; + height: 100%; + } +} +mat-selection-list { + max-height: 50vh; + overflow: auto; + width: 600px; +} diff --git a/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.spec.ts b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.spec.ts new file mode 100644 index 000000000..85ff16cbe --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { StorageFilePickerComponent } from './storage-file-picker.component'; + +describe('StorageFilePickerComponent', () => { + let component: StorageFilePickerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [StorageFilePickerComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(StorageFilePickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.ts b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.ts new file mode 100644 index 000000000..e0dfd1712 --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/storage-file-picker/storage-file-picker.component.ts @@ -0,0 +1,86 @@ +import { CommonModule } from '@angular/common'; +import { Component, Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialog } from '@angular/material/dialog'; +import { MatListModule } from '@angular/material/list'; + +import { IStorageEntry } from '../../services/supabase-storage.service'; +import { SupabaseService } from '../../supabase.service'; + +/** + * Directive that can be added to any component to launch storage file picker component + * ``` + * + * ``` + */ +@Directive({ + selector: '[supabaseStoragePicker]', + standalone: true, +}) +export class SupabaseStoragePickerDirective { + @Input() storageBucketName = 'default'; + @Input() storageFolderPath?: string; + @Output() storageFileSelected = new EventEmitter(); + + @HostListener('click') pickerOpen() { + const dialogRef = this.dialog.open(SupabaseStorageFilePickerComponent, {}); + const { componentInstance } = dialogRef; + componentInstance.storageBucketName = this.storageBucketName; + componentInstance.storageFolderPath = this.storageFolderPath; + componentInstance.fileSelected.subscribe((entry) => { + dialogRef.close(); + this.storageFileSelected.next(entry); + }); + } + + constructor(private dialog: MatDialog) {} +} + +@Component({ + selector: 'picsa-supabase-storage-file-picker', + standalone: true, + imports: [CommonModule, FormsModule, MatButtonModule, MatListModule], + templateUrl: './storage-file-picker.component.html', + styleUrls: ['./storage-file-picker.component.scss'], +}) +export class SupabaseStorageFilePickerComponent { + @Output() fileSelected = new EventEmitter(); + @Input() storageBucketName = 'default'; + @Input() storageFolderPath?: string; + + public fileEntries: IStorageEntry[] = []; + + public selected: IStorageEntry[] = []; + + public previewUrl: string; + + constructor(private supabaseService: SupabaseService) {} + + private get storage() { + return this.supabaseService.storage; + } + + async ngOnInit() { + await this.supabaseService.ready(); + const entries = await this.storage.list(this.storageBucketName, this.storageFolderPath); + this.fileEntries = entries + // filter out metadata files which have filename starting with `.` + .filter(({ name }) => !name?.split('/').pop()?.startsWith('.')) + .sort((a, b) => { + if (!b.name) return 1; + if (!a.name) return -1; + return a.name > b.name ? 1 : -1; + }); + } + public compareFn(a: IStorageEntry, b: IStorageEntry) { + return a.id === b.id; + } + + public handleFileSelect() { + const [entry] = this.selected; + if (this.selected) { + this.previewUrl = this.storage.getPublicLink(this.storageBucketName, entry.name as string); + } + } +} diff --git a/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.html b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.html new file mode 100644 index 000000000..509ac9363 --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.html @@ -0,0 +1,25 @@ + + +@if(uppy){ + +} + + +@if(storageFolderPathEditable){ + + Storage Folder + + @if (storageFolderPath) { + + } + +} + + +@if(!this.autoUpload){ + +} diff --git a/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.scss b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.spec.ts b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.spec.ts new file mode 100644 index 000000000..e4925cf7c --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupabaseUploadComponent } from './supabase-upload.component'; + +describe('SupabaseUploadComponent', () => { + let component: SupabaseUploadComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SupabaseUploadComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(SupabaseUploadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.ts b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.ts new file mode 100644 index 000000000..25928c919 --- /dev/null +++ b/libs/shared/src/services/core/supabase/components/upload/supabase-upload.component.ts @@ -0,0 +1,220 @@ +import '@uppy/core/dist/style.min.css'; +import '@uppy/dashboard/dist/style.min.css'; + +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { ENVIRONMENT } from '@picsa/environments'; +import { UppyAngularDashboardModule } from '@uppy/angular'; +import Uppy, { InternalMetadata, UploadResult, UppyFile, UppyOptions } from '@uppy/core'; +import { DashboardOptions } from '@uppy/dashboard'; +import Tus from '@uppy/tus'; + +import { PicsaNotificationService } from '../../../notification.service'; +import { IStorageEntrySDK, SupabaseStorageService } from '../../services/supabase-storage.service'; +import { SupabaseService } from '../../supabase.service'; + +/** Metadata populated to uploads so that supabase can process correctly */ +interface IUploadMeta extends InternalMetadata { + bucketName: string; + cacheControl: number; + contentType?: string; + objectName: string; +} + +/** Storage entry data returned following upload */ +export interface IUploadResult { + data: File | Blob; + entry: IStorageEntrySDK; +} + +/** + * Supabase storage uploader built on top of Uppy dashboard, with support for resumable uploads + * + * https://supabase.com/docs/guides/storage/uploads/resumable-uploads + * https://uppy.io/docs/tus/ + * https://tus.io/ + * + */ +@Component({ + selector: 'picsa-supabase-upload', + standalone: true, + imports: [ + CommonModule, + UppyAngularDashboardModule, + MatIconModule, + MatButtonModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + ], + templateUrl: './supabase-upload.component.html', + styleUrls: ['./supabase-upload.component.scss'], +}) +export class SupabaseUploadComponent { + /** Default height of file dropper */ + @Input() fileDropHeight = 300; + + /** Name of storage bucket for upload. Must already exist with required access permissions */ + @Input() storageBucketName = 'default'; + + /** Nested folder path within storage bucket */ + @Input() storageFolderPath = ''; + + /** Specify if storage folder path can be manually edited */ + @Input() storageFolderPathEditable = false; + + @Input() autoUpload = false; + + @Input() set disabled(disabled: boolean) { + // Update options through plugin interface for better change detection + this.dashboardOptions = { ...this.dashboardOptions, disabled }; + } + /** + * Specify input file type. Must correspond to unique file type specifiers + * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#unique_file_type_specifiers + */ + @Input() set fileTypes(filetypes: string[]) { + this.setFileTypeRestrictions(filetypes); + } + + @Output() uploadComplete = new EventEmitter(); + + public uppy: Uppy; + + public dashboardOptions: DashboardOptions = { + proudlyDisplayPoweredByUppy: false, + hideUploadButton: true, + }; + + private uppyOptions: UppyOptions = { + debug: false, + autoProceed: false, + restrictions: { maxNumberOfFiles: 1 }, + }; + + private storageService: SupabaseStorageService; + + constructor(private supabaseService: SupabaseService, private notificationService: PicsaNotificationService) {} + + async ngOnInit() { + await this.supabaseService.ready(); + this.storageService = this.supabaseService.storage; + this.initUppy(); + } + + private async initUppy() { + // Create new Uppy instance, mapping configurable props + this.uppy = new Uppy(this.uppyOptions); + this.dashboardOptions.height = this.fileDropHeight; + // Create custom upload to support upload to supabase + await this.registerSupabaseUppyUploader(); + } + + public async startUpload() { + // remove duplicates + for (const file of this.uppy.getFiles()) { + const objectName = this.storageFolderPath ? `${this.storageFolderPath}/${file.name}` : file.name; + const meta: IUploadMeta = { + ...file.meta, + contentType: file.type, + bucketName: this.storageBucketName, + objectName, + cacheControl: 3600, + }; + this.uppy.setFileMeta(file.id, meta as Record); + await this.checkDuplicateUpload(file); + } + const res = await this.uppy.upload(); + await this.handleUploadComplete(res); + this.storageFolderPath = ''; + } + + private async handleUploadComplete(res: UploadResult) { + const uploads = await Promise.all( + res.successful.map(async (res) => { + const meta: IUploadMeta = res.meta as any; + // HACK - manually retrieve db data associated with file. In future this may be handled automatically + // https://github.com/orgs/supabase/discussions/4303 + const entry = await this.storageService.getFile({ + bucketId: meta.bucketName, + filename: meta.name, + folderPath: meta.objectName.split('/').slice(0, -1).join('/'), + }); + if (!entry) { + console.warn('Storage entry not found', meta); + throw new Error(`Storage entry not found`); + } + return { data: res.data, entry }; + }) + ); + this.uploadComplete.next(uploads); + } + + private async registerSupabaseUppyUploader() { + const { anonKey, apiUrl } = await ENVIRONMENT.supabase.load(); + this.uppy.use(Tus, { + endpoint: `${apiUrl}/storage/v1/upload/resumable`, + headers: { + authorization: `Bearer ${anonKey}`, + apikey: anonKey, + }, + // Retry upload after delay if not working immediately + retryDelays: [0, 2000, 5000], + uploadDataDuringCreation: true, + removeFingerprintOnSuccess: true, + + chunkSize: 6 * 1024 * 1024, + allowedMetaFields: ['bucketName', 'objectName', 'contentType', 'cacheControl'], + onShouldRetry: (err) => { + if (err?.message.includes('The resource already exists')) { + // TODO - notify user + return false; + } + return true; + }, + }); + // Use file-added hook to update metadata used by supabase for managing file metadata + // NOTE - additional hooks can also be added to observe upload progress, errors etc. + this.uppy.on('file-added', (file) => this.handleFileAdded()); + } + private handleFileAdded() { + if (this.autoUpload) { + this.startUpload(); + } + } + + private setFileTypeRestrictions(types: string[]) { + // Specify options loaded on init + this.uppyOptions = { + ...this.uppyOptions, + restrictions: { + ...this.uppyOptions.restrictions, + allowedFileTypes: types, + }, + }; + // Update options if uppy already initialised + if (this.uppy) { + this.uppy.setOptions(this.uppyOptions); + } + } + + private async checkDuplicateUpload(file: UppyFile) { + const storageFile = await this.storageService.getFile({ + bucketId: 'resources', + filename: file.name, + folderPath: this.storageFolderPath || '', + }); + if (storageFile) { + this.notificationService.showUserNotification({ + matIcon: 'error', + message: `Resource with name ${file.name} already exists`, + }); + this.uppy.removeFile(file.id); + } + } +} diff --git a/libs/shared/src/services/core/supabase/dialogs/sign-in.dialog.ts b/libs/shared/src/services/core/supabase/dialogs/sign-in.dialog.ts index 8e971e5b2..d758136a1 100644 --- a/libs/shared/src/services/core/supabase/dialogs/sign-in.dialog.ts +++ b/libs/shared/src/services/core/supabase/dialogs/sign-in.dialog.ts @@ -1,14 +1,11 @@ import { Component, Inject } from '@angular/core'; import { - AbstractControl, FormControl, FormGroup, FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule, - ValidationErrors, - ValidatorFn, Validators, } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; @@ -17,11 +14,12 @@ import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/materia import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; +import { PICSAFormValidators } from '../../../../modules/forms/validators'; import { PicsaNotificationService } from '../../notification.service'; -import type { SupabaseService } from '../supabase.service'; +import type { SupabaseAuthService } from '../services/supabase-auth.service'; export interface ISignInDialogData { - service: SupabaseService; + authService: SupabaseAuthService; } /** @@ -35,18 +33,6 @@ export class showErrorAfterInteraction implements ErrorStateMatcher { } } -/** - * Custom form validator to ensure passwords match. Adapted from - * https://stackoverflow.com/a/51606362/5693245 - */ -const validatePasswordMatch: ValidatorFn = (control: AbstractControl): ValidationErrors | null => { - if (!control) return null; - const form = control.parent; - if (!form) return null; - const pass = form.get('password')?.value; - return pass === control.value ? null : { notSame: true }; -}; - @Component({ selector: 'picsa-supabase-sign-in-dialog', standalone: true, @@ -136,7 +122,7 @@ export class SupabaseSignInDialogComponent { errorMatcher = new showErrorAfterInteraction(); - private service: SupabaseService; + private authService: SupabaseAuthService; public form = new FormGroup<{ email: FormControl; password: FormControl; passwordConfirm?: FormControl }>({ email: new FormControl('', [Validators.required, Validators.email]), @@ -148,19 +134,22 @@ export class SupabaseSignInDialogComponent { @Inject(MAT_DIALOG_DATA) data: ISignInDialogData, private notificationService: PicsaNotificationService ) { - this.service = data.service; + this.authService = data.authService; } public enableRegisterMode() { this.template = 'register'; this.title = 'Register'; - this.form.addControl('passwordConfirm', new FormControl('', [Validators.required, validatePasswordMatch])); + this.form.addControl( + 'passwordConfirm', + new FormControl('', [Validators.required, PICSAFormValidators.passwordMatch]) + ); } public async handleSignIn() { this.form.disable(); const { email, password } = this.form.value; - const { data, error } = await this.service.signInUser(email, password); + const { data, error } = await this.authService.signInUser(email, password); console.log({ data, error }); if (error) { console.error(error); @@ -173,7 +162,7 @@ export class SupabaseSignInDialogComponent { public async handleRegister() { this.form.disable(); const { email, password } = this.form.value; - const { error } = await this.service.signUpUser(email, password); + const { error } = await this.authService.signUpUser(email, password); if (error) { console.error(error); this.notificationService.showUserNotification({ message: error.message, matIcon: 'error' }); diff --git a/libs/shared/src/services/core/supabase/index.ts b/libs/shared/src/services/core/supabase/index.ts index 87efe61cb..bd38b603f 100644 --- a/libs/shared/src/services/core/supabase/index.ts +++ b/libs/shared/src/services/core/supabase/index.ts @@ -1 +1,2 @@ +export * from './components'; export * from './supabase.service'; diff --git a/libs/shared/src/services/core/supabase/services/supabase-auth.service.ts b/libs/shared/src/services/core/supabase/services/supabase-auth.service.ts new file mode 100644 index 000000000..133bc3d83 --- /dev/null +++ b/libs/shared/src/services/core/supabase/services/supabase-auth.service.ts @@ -0,0 +1,116 @@ +import { Injectable, signal } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ENVIRONMENT } from '@picsa/environments'; +import { AuthError, SupabaseClient, User } from '@supabase/supabase-js'; + +import { PicsaAsyncService } from '../../../asyncService.service'; +import { PicsaNotificationService } from '../../notification.service'; +import { SupabaseSignInDialogComponent } from '../dialogs/sign-in.dialog'; + +@Injectable({ providedIn: 'root' }) +export class SupabaseAuthService extends PicsaAsyncService { + /** Authenticated user */ + public authUser = signal(undefined); + + private supabaseClient: SupabaseClient; + + private get auth() { + if (!this.supabaseClient) { + throw new Error('Supabase client not registered in auth'); + } + return this.supabaseClient.auth; + } + + constructor(private dialog: MatDialog, private notificationService: PicsaNotificationService) { + super(); + } + + public override async init(): Promise { + this.subscribeToAuthChanges(); + } + + public registerSupabaseClient(client: SupabaseClient) { + this.supabaseClient = client; + } + + public async signInPrompt() { + this.dialog.open(SupabaseSignInDialogComponent, { data: { service: this } }); + } + + public async signInUser(email: string, password: string) { + return this.auth.signInWithPassword({ email, password }); + } + + public async signUpUser(email: string, password: string) { + return this.auth.signUp({ email, password }); + } + + public async signOut() { + return this.auth.signOut(); + } + + /** Attempt to sign-in as persisted user, with fallback to anonymous */ + public async signInDefaultUser() { + const { error } = await this.auth.getUser(); + if (error) { + console.log('User session not found, signing in anonymous user'); + return this.signInAnonymousUser(); + } + // return user as updated by auth change subscriber + return this.authUser; + } + + /** Create variants of error messages received in supabase for notification purposes */ + public getUserErrorMessage(error: AuthError): { message: string; matIcon: string; devMessage?: string } { + const { name, message } = error; + const mapping = { + AuthRetryableFetchError: { + message: 'Server connection Failed', + matIcon: 'cloud_off', + devMessage: 'Ensure the server is running locally', + }, + 'Invalid login credentials': { + message: 'User does not exist or password incorrect', + matIcon: 'person_alert', + }, + 'invalid claim: missing sub claim': { + message: 'No user signed in, unable to load', + }, + }; + return mapping[message] || { message: `${name} - ${message}`, matIcon: 'error' }; + } + + public logUserErrorMessage(error: AuthError) { + const { message, matIcon, devMessage } = this.getUserErrorMessage(error); + this.notificationService.showUserNotification({ matIcon, message }); + if (devMessage) { + console.error('[Developer Note]\n' + devMessage); + } + } + + /** User shared credential to sign in as an anonymous user for supabase */ + private async signInAnonymousUser() { + const { email, password } = ENVIRONMENT.supabase.appUser; + const { error } = await this.auth.signInWithPassword({ email, password: password || email }); + // TODO - could consider function to generate app user base on id which could also use RLS for sync + if (error) { + console.error(error); + this.logUserErrorMessage(error); + if (error.message === 'Invalid login credentials') { + const devMessage = `Ensure user with email: [${email}] created in supabase auth.\nSee guidance in server Readme`; + console.error('[Developer Note]\n' + devMessage); + } + } + // return user as updated by auth change subscriber + return this.authUser; + } + + private subscribeToAuthChanges() { + this.auth.onAuthStateChange((_event, session) => { + const user = session?.user; + if (user?.id !== this.authUser()?.id) { + this.authUser.set(session?.user); + } + }); + } +} diff --git a/libs/shared/src/services/core/supabase/services/supabase-storage.service.ts b/libs/shared/src/services/core/supabase/services/supabase-storage.service.ts new file mode 100644 index 000000000..6290aeed8 --- /dev/null +++ b/libs/shared/src/services/core/supabase/services/supabase-storage.service.ts @@ -0,0 +1,129 @@ +import { Injectable } from '@angular/core'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import { Database } from '@picsa/server-types'; +import { FileObject } from '@supabase/storage-js'; +import { SupabaseClient } from '@supabase/supabase-js'; + +import { PicsaNotificationService } from '../../notification.service'; + +type IStorageDB = Database['storage']['Tables']['objects']['Row']; + +/** DB entry populated to server storage objects with explicit metadata expected */ +export interface IStorageEntry extends IStorageDB { + metadata: { + /** cacheControl will be altered from input metadata, e.g. `3600` -> `"max-age=3600"` */ + cacheControl: string; + contentLength: number; + eTag: string; + httpStatusCode: number; + lastModified: string; + mimetype: string; + size: number; + }; +} + +/** Data populated when storage object retrieved via SDK (as opposed to storage table direct) */ +export interface IStorageEntrySDK extends FileObject {} + +/** + * Utility class for interacting with supabase storage client + **/ +@Injectable({ providedIn: 'root' }) +export class SupabaseStorageService { + private supabaseClient: SupabaseClient; + + constructor(private notificationService: PicsaNotificationService) {} + + private get storage() { + if (!this.supabaseClient) { + throw new Error('Supabase client not registered in storage'); + } + return this.supabaseClient.storage; + } + + public registerSupabaseClient(client: SupabaseClient) { + this.supabaseClient = client; + } + + /** + * List a bucket contents + * Uses custom table view as by default js sdk appears to only return top-level files/folders + * and not recursive children + * Requires custom view created (see example resources migration) + * */ + public async list(bucketId: string, folderPath?: string) { + // NOTE - access via storage table instead of storage api as does not support recursive list + let query = this.supabaseClient.from(`storage_objects`).select<'*', IStorageEntry>('*').eq('bucket_id', bucketId); + + if (folderPath) { + query = query.like('name', `${folderPath}/%`); + } + const { data, error } = await query; + + if (error) { + console.error(error); + this.notificationService.showUserNotification({ matIcon: 'error', message: error.message }); + } + return data || []; + } + + public async getFile(options: { + bucketId: string; + filename: string; + folderPath?: string; + }): Promise { + const defaults = { folderPath: '' }; + const { bucketId, filename, folderPath } = { ...defaults, ...options }; + const { data, error } = await this.storage.from(bucketId).list(folderPath, { limit: 1, search: filename }); + if (error) { + throw error; + } + return data?.[0] || null; + } + + /** Return the link to a file in a public bucket */ + public getPublicLink(bucketId: string, objectPath: string) { + return this.storage.from(bucketId).getPublicUrl(objectPath).data.publicUrl; + } +} + +/** + * WiP + * Currently most API methods seem to not be passing auth credentials as expected + * Need to determine whether issue in local code/config or with supabase itself + * Existing workaround handles upload via xhr requests in uploader component + * + * TODO - check config toml if can be updated to provide right urls, or perhaps + * some setting needs to be enabled in supabase-js for local paths? + * Should also try via insomnia + * + * https://github.com/supabase/storage/issues?q=local + * + * https://github.com/supabase/supabase-js/issues?q=storage + */ + +// private async getBucket(bucketId: string = 'default'): Promise { +// const { data, error } = await this.storage.getBucket(bucketId); + +// console.log(`getBucket ${bucketId}`, { data, error }); +// if (error) { +// if (error?.message === 'Bucket not found') { +// this.notificationService.showUserNotification({ +// matIcon: 'error', +// message: `[${bucketId}] Storage bucket not available`, +// }); +// } + +// throw error; +// } + +// return data; +// } + +// private async createBucket(id: string) { +// const { data, error } = await this.storage.createBucket(id); +// console.log('create bucket', { id, data, error }); +// } + +// TODO - make buckets private but add RLS for authenticated user +// https://supabase.com/docs/guides/storage/security/access-control diff --git a/libs/shared/src/services/core/supabase/supabase.service.ts b/libs/shared/src/services/core/supabase/supabase.service.ts index 83df66561..6d70174db 100644 --- a/libs/shared/src/services/core/supabase/supabase.service.ts +++ b/libs/shared/src/services/core/supabase/supabase.service.ts @@ -1,121 +1,36 @@ -import { Injectable, signal } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { Injectable } from '@angular/core'; import { ENVIRONMENT } from '@picsa/environments/src'; -import { StorageClient } from '@supabase/storage-js'; -import { AuthError, createClient, RealtimeClient, SupabaseClient, User } from '@supabase/supabase-js'; -import { SupabaseAuthClient } from '@supabase/supabase-js/dist/module/lib/SupabaseAuthClient'; +import { createClient, SupabaseClient } from '@supabase/supabase-js'; import { PicsaAsyncService } from '../../asyncService.service'; -import { PicsaNotificationService } from '../notification.service'; -import { SupabaseSignInDialogComponent } from './dialogs/sign-in.dialog'; - -/** Key safe to use in browser (assuming tables have row-level security) */ +import { SupabaseAuthService } from './services/supabase-auth.service'; +import { SupabaseStorageService } from './services/supabase-storage.service'; +/** + * Main entrypoint for interacting with Supabase backend + * Module-specific code (e.g. storage, auth) injected via child services + */ @Injectable({ providedIn: 'root' }) export class SupabaseService extends PicsaAsyncService { - /** Authenticated user */ - public authUser = signal(undefined); - /** Access to postgres db as a shortcut to table from method */ public db: { table: SupabaseClient['from'] }; private supabase: SupabaseClient; - private storage: StorageClient; - private realtime: RealtimeClient; - - private auth: SupabaseAuthClient; - constructor(private notificationService: PicsaNotificationService, private dialog: MatDialog) { + constructor(public storage: SupabaseStorageService, public auth: SupabaseAuthService) { super(); - const { anonKey, apiUrl } = ENVIRONMENT.supabase; - this.supabase = createClient(apiUrl, anonKey, {}); - this.storage = this.supabase.storage; - this.realtime = this.supabase.realtime; - this.auth = this.supabase.auth; - this.db = { table: (relation: string) => this.supabase.from(relation) }; - } - public override async init(...args: any): Promise { - this.subscribeToAuthChanges(); } - public async signInPrompt() { - this.dialog.open(SupabaseSignInDialogComponent, { data: { service: this } }); - } - - public async signInUser(email: string, password: string) { - return this.auth.signInWithPassword({ email, password }); - } - - public async signUpUser(email: string, password: string) { - return this.auth.signUp({ email, password }); - } - - public async signOut() { - return this.auth.signOut(); - } - - /** Attempt to sign-in as persisted user, with fallback to anonymous */ - public async signInDefaultUser() { - const { error } = await this.auth.getUser(); - if (error) { - console.log('User session not found, signing in anonymous user'); - return this.signInAnonymousUser(); - } - // return user as updated by auth change subscriber - return this.authUser; - } - - /** User shared credential to sign in as an anonymous user for supabase */ - private async signInAnonymousUser() { - const { email, password } = ENVIRONMENT.supabase.appUser; - const { error } = await this.supabase.auth.signInWithPassword({ email, password: password || email }); - // TODO - could consider function to generate app user base on id which could also use RLS for sync - if (error) { - console.error(error); - this.logUserErrorMessage(error); - if (error.message === 'Invalid login credentials') { - const devMessage = `Ensure user with email: [${email}] created in supabase auth.\nSee guidance in server Readme`; - console.error('[Developer Note]\n' + devMessage); - } - } - // return user as updated by auth change subscriber - return this.authUser; - } + public override async init(): Promise { + const { anonKey, apiUrl } = await ENVIRONMENT.supabase.load(); + this.supabase = createClient(apiUrl, anonKey, {}); - private subscribeToAuthChanges() { - this.auth.onAuthStateChange((_event, session) => { - const user = session?.user; - if (user?.id !== this.authUser()?.id) { - this.authUser.set(session?.user); - } - }); - } + // register supabase instance with child services + this.storage.registerSupabaseClient(this.supabase); + this.auth.registerSupabaseClient(this.supabase); - /** Create variants of error messages received in supabase for notification purposes */ - private getUserErrorMessage(error: AuthError): { message: string; matIcon: string; devMessage?: string } { - const { name, message } = error; - const mapping = { - AuthRetryableFetchError: { - message: 'Server connection Failed', - matIcon: 'cloud_off', - devMessage: 'Ensure the server is running locally', - }, - 'Invalid login credentials': { - message: 'User does not exist or password incorrect', - matIcon: 'person_alert', - }, - 'invalid claim: missing sub claim': { - message: 'No user signed in, unable to load', - }, - }; - return mapping[message] || { message: `${name} - ${message}`, matIcon: 'error' }; - } + this.db = { table: (relation: string) => this.supabase.from(relation) }; - private logUserErrorMessage(error: AuthError) { - const { message, matIcon, devMessage } = this.getUserErrorMessage(error); - this.notificationService.showUserNotification({ matIcon, message }); - if (devMessage) { - console.error('[Developer Note]\n' + devMessage); - } + await this.auth.ready(); } } diff --git a/libs/theme/src/_overrides.scss b/libs/theme/src/_overrides.scss index 0c077535e..325ec5d15 100644 --- a/libs/theme/src/_overrides.scss +++ b/libs/theme/src/_overrides.scss @@ -1,9 +1,12 @@ $fontFamily: Roboto, 'Helvetica Neue', sans-serif; // fix height styles lost since angular/material 17 updates +// NOTE - these may have been fixed since inclusion of `mat.all-component-bases` body { --mdc-protected-button-container-height: 36px; --mdc-outlined-button-container-height: 36px; + --mdc-filled-button-container-height: 36px; + --mat-stepper-header-height: 72px; } // Revert changes appliec md14 -> md15 @@ -86,6 +89,13 @@ mat-form-field.no-hint { margin-left: 4px; } +mat-chip { + // Mat chip pointer cursor + .mdc-evolution-chip__action--presentational { + cursor: pointer; + } +} + // Create a colum-style layout for radio buttons where button appears below text mat-radio-group.layout-column { display: block; diff --git a/libs/theme/src/themes/_index.scss b/libs/theme/src/themes/_index.scss index a4d8f21e4..140950e39 100644 --- a/libs/theme/src/themes/_index.scss +++ b/libs/theme/src/themes/_index.scss @@ -4,6 +4,17 @@ @use '@angular/material' as mat; @include mat.core(); +$theme-base: mat.define-light-theme( + ( + color: ( + primary: mat.$indigo-palette, + accent: mat.$indigo-palette, + warn: mat.$indigo-palette, + ), + ) +); +@include mat.all-component-bases($theme-base); + @import './picsa-global.scss'; @import './picsa-mw.scss'; @import './picsa-tj.scss'; diff --git a/libs/theme/src/themes/picsa-global.scss b/libs/theme/src/themes/picsa-global.scss index b73705103..5cb5e637c 100644 --- a/libs/theme/src/themes/picsa-global.scss +++ b/libs/theme/src/themes/picsa-global.scss @@ -84,7 +84,10 @@ $theme-global: mat.define-light-theme( ); body[data-theme='picsa-global'] { - @include mat.all-component-colors($theme-global); + // Include base layouts for all mat components. Could be restricted to specific components, e.g. + // https://github.com/angular/components/blob/main/src/material/core/theming/_all-theme.scss + // @include mat.all-component-themes($theme-global); + @include mat.all-component-themes($theme-global); --color-primary: #{map-get($palette-primary, 500)}; --color-primary-50: #{map-get($palette-primary, 50)}; --color-secondary: #{map-get($palette-accent, 500)}; diff --git a/libs/theme/src/themes/picsa-mw.scss b/libs/theme/src/themes/picsa-mw.scss index fb0cd9c74..ed2838bf8 100644 --- a/libs/theme/src/themes/picsa-mw.scss +++ b/libs/theme/src/themes/picsa-mw.scss @@ -84,7 +84,7 @@ $theme-mw: mat.define-light-theme( ); body[data-theme='picsa-mw'] { - @include mat.all-component-colors($theme-mw); + @include mat.all-component-themes($theme-mw); --color-primary: #{map-get($palette-primary, 500)}; --color-primary-50: #{map-get($palette-primary, 50)}; --color-secondary: #{map-get($palette-accent, 500)}; diff --git a/libs/theme/src/themes/picsa-tj.scss b/libs/theme/src/themes/picsa-tj.scss index 23b690eea..c552cc9de 100644 --- a/libs/theme/src/themes/picsa-tj.scss +++ b/libs/theme/src/themes/picsa-tj.scss @@ -84,7 +84,7 @@ $theme-tj: mat.define-light-theme( ); body[data-theme='picsa-tj'] { - @include mat.all-component-colors($theme-tj); + @include mat.all-component-themes($theme-tj); --color-primary: #{map-get($palette-primary, 500)}; --color-primary-50: #{map-get($palette-primary, 50)}; --color-secondary: #{map-get($palette-accent, 500)}; diff --git a/libs/theme/src/themes/picsa-zm.scss b/libs/theme/src/themes/picsa-zm.scss index d3b0b3098..9a7f20e5e 100644 --- a/libs/theme/src/themes/picsa-zm.scss +++ b/libs/theme/src/themes/picsa-zm.scss @@ -84,7 +84,7 @@ $theme-zm: mat.define-light-theme( ); body[data-theme='picsa-zm'] { - @include mat.all-component-colors($theme-zm); + @include mat.all-component-themes($theme-zm); --color-primary: #{map-get($palette-primary, 500)}; --color-primary-50: #{map-get($palette-primary, 50)}; --color-secondary: #{map-get($palette-accent, 500)}; diff --git a/package.json b/package.json index 62cc37020..b1b49cb19 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,12 @@ }, "dependencies": { "@angular/animations": "17.0.3", - "@angular/cdk": "17.0.1", + "@angular/cdk": "17.0.3", "@angular/common": "17.0.3", "@angular/compiler": "17.0.3", "@angular/core": "17.0.3", "@angular/forms": "17.0.3", - "@angular/material": "17.0.1", + "@angular/material": "17.0.3", "@angular/platform-browser": "17.0.3", "@angular/platform-browser-dynamic": "17.0.3", "@angular/router": "17.0.3", @@ -65,13 +65,14 @@ "@ngx-translate/http-loader": "~8.0.0", "@nx/angular": "17.1.2", "@stencil/angular-output-target": "^0.7.1", - "@supabase/supabase-js": "^2.38.5", + "@supabase/supabase-js": "^2.39.0", "@uppy/angular": "^0.6.1", "@uppy/core": "^3.7.1", "@uppy/dashboard": "^3.7.1", "@uppy/drag-drop": "^3.0.3", "@uppy/progress-bar": "^3.0.4", "@uppy/status-bar": "^3.2.5", + "@uppy/tus": "^3.4.0", "c3": "^0.7.20", "capacitor-blob-writer": "^1.1.14", "capacitor-video-player": "^5.0.3", @@ -108,14 +109,14 @@ "zone.js": "0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.1", - "@angular-devkit/core": "17.0.1", - "@angular-devkit/schematics": "17.0.1", + "@angular-devkit/build-angular": "17.1.0-next.1", + "@angular-devkit/core": "17.1.0-next.1", + "@angular-devkit/schematics": "17.1.0-next.1", "@angular-eslint/eslint-plugin": "17.1.0", "@angular-eslint/eslint-plugin-template": "17.1.0", "@angular-eslint/template-parser": "17.1.0", - "@angular/cli": "~17.0.0", - "@angular/compiler-cli": "17.0.3", + "@angular/cli": "17.1.0-next.1", + "@angular/compiler-cli": "17.1.0-next.1", "@angular/language-service": "17.0.3", "@biesbjerg/ngx-translate-extract-marker": "^1.0.0", "@capacitor/android": "5.5.1", @@ -129,7 +130,7 @@ "@nx/web": "17.1.2", "@nx/workspace": "17.1.2", "@nxext/stencil": "^17.0.2", - "@schematics/angular": "17.0.1", + "@schematics/angular": "17.0.3", "@stencil/core": "3.2.2", "@stencil/sass": "^3.0.2", "@swc-node/register": "~1.6.7", @@ -178,7 +179,7 @@ "puppeteer": "^15.5.0", "rollup-plugin-node-polyfills": "^0.2.1", "rollup-plugin-visualizer": "^5.8.3", - "supabase": "^1.113.2", + "supabase": "1.115.4", "tailwindcss": "^3.0.2", "ts-jest": "29.1.1", "ts-node": "10.9.1", diff --git a/tsconfig.base.json b/tsconfig.base.json index 17c4e319c..9c558f0ec 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -39,6 +39,7 @@ "@picsa/option/*": ["apps/picsa-tools/option-tool/*"], "@picsa/resources/*": ["apps/picsa-tools/resources-tool/*"], "@picsa/seasonal-calendar/*": ["apps/picsa-tools/seasonal-calendar-tool/*"], + "@picsa/server-types": ["apps/picsa-server/supabase/types/index.ts"], "@picsa/shared": ["libs/shared/src/index.ts"], "@picsa/shared/*": ["libs/shared/src/*"], "@picsa/theme": ["libs/theme/src/index.ts"], diff --git a/yarn.lock b/yarn.lock index 4608f8a60..6073e3e70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,52 +36,51 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.1700.1": - version: 0.1700.1 - resolution: "@angular-devkit/architect@npm:0.1700.1" +"@angular-devkit/architect@npm:0.1701.0-next.1": + version: 0.1701.0-next.1 + resolution: "@angular-devkit/architect@npm:0.1701.0-next.1" dependencies: - "@angular-devkit/core": 17.0.1 + "@angular-devkit/core": 17.1.0-next.1 rxjs: 7.8.1 - checksum: 09ab67c6a266895fa29f8ecec38459eed1b07999d30e059582d76ecb3d46176991ae8c9f7356e83d10b287b06b58efbea07a2a5be091789b6add0050c76f2463 + checksum: aeea813fe1186089b8e2e5fc5eb9e71a1ea78b65771e042d3340a2d06e31ceb2a8a3dd757bd737e2c38865ca0da3fc7cffffd6e0e1de54aef2c95b761b59aa86 languageName: node linkType: hard -"@angular-devkit/build-angular@npm:17.0.1": - version: 17.0.1 - resolution: "@angular-devkit/build-angular@npm:17.0.1" +"@angular-devkit/build-angular@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@angular-devkit/build-angular@npm:17.1.0-next.1" dependencies: "@ampproject/remapping": 2.2.1 - "@angular-devkit/architect": 0.1700.1 - "@angular-devkit/build-webpack": 0.1700.1 - "@angular-devkit/core": 17.0.1 - "@babel/core": 7.23.2 - "@babel/generator": 7.23.0 + "@angular-devkit/architect": 0.1701.0-next.1 + "@angular-devkit/build-webpack": 0.1701.0-next.1 + "@angular-devkit/core": 17.1.0-next.1 + "@babel/core": 7.23.5 + "@babel/generator": 7.23.5 "@babel/helper-annotate-as-pure": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 - "@babel/plugin-transform-async-generator-functions": 7.23.2 - "@babel/plugin-transform-async-to-generator": 7.22.5 - "@babel/plugin-transform-runtime": 7.23.2 - "@babel/preset-env": 7.23.2 - "@babel/runtime": 7.23.2 + "@babel/plugin-transform-async-generator-functions": 7.23.4 + "@babel/plugin-transform-async-to-generator": 7.23.3 + "@babel/plugin-transform-runtime": 7.23.4 + "@babel/preset-env": 7.23.5 + "@babel/runtime": 7.23.5 "@discoveryjs/json-ext": 0.5.7 - "@ngtools/webpack": 17.0.1 - "@vitejs/plugin-basic-ssl": 1.0.1 + "@ngtools/webpack": 17.1.0-next.1 + "@vitejs/plugin-basic-ssl": 1.0.2 ansi-colors: 4.1.3 autoprefixer: 10.4.16 babel-loader: 9.1.3 babel-plugin-istanbul: 6.1.1 - browser-sync: 2.29.3 browserslist: ^4.21.5 chokidar: 3.5.3 copy-webpack-plugin: 11.0.0 critters: 0.0.20 css-loader: 6.8.1 - esbuild: 0.19.5 - esbuild-wasm: 0.19.5 - fast-glob: 3.3.1 + esbuild: 0.19.8 + esbuild-wasm: 0.19.8 + fast-glob: 3.3.2 http-proxy-middleware: 2.0.6 https-proxy-agent: 7.0.2 - inquirer: 9.2.11 + inquirer: 9.2.12 jsonc-parser: 3.2.0 karma-source-map-support: 1.4.0 less: 4.2.0 @@ -95,8 +94,8 @@ __metadata: ora: 5.4.1 parse5-html-rewriting-stream: 7.0.0 picomatch: 3.0.1 - piscina: 4.1.0 - postcss: 8.4.31 + piscina: 4.2.0 + postcss: 8.4.32 postcss-loader: 7.3.3 resolve-url-loader: 5.0.0 rxjs: 7.8.1 @@ -105,29 +104,30 @@ __metadata: semver: 7.5.4 source-map-loader: 4.0.1 source-map-support: 0.5.21 - terser: 5.24.0 + terser: 5.25.0 text-table: 0.2.0 tree-kill: 1.2.2 tslib: 2.6.2 - undici: 5.27.2 - vite: 4.5.0 + undici: 6.0.1 + vite: 5.0.6 webpack: 5.89.0 webpack-dev-middleware: 6.1.1 webpack-dev-server: 4.15.1 webpack-merge: 5.10.0 webpack-subresource-integrity: 5.1.0 peerDependencies: - "@angular/compiler-cli": ^17.0.0 - "@angular/localize": ^17.0.0 - "@angular/platform-server": ^17.0.0 - "@angular/service-worker": ^17.0.0 + "@angular/compiler-cli": ^17.0.0 || ^17.1.0-next.0 + "@angular/localize": ^17.0.0 || ^17.1.0-next.0 + "@angular/platform-server": ^17.0.0 || ^17.1.0-next.0 + "@angular/service-worker": ^17.0.0 || ^17.1.0-next.0 + browser-sync: ^2.29.3 jest: ^29.5.0 jest-environment-jsdom: ^29.5.0 karma: ^6.3.0 - ng-packagr: ^17.0.0 + ng-packagr: ^17.0.0 || ^17.1.0-next.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 - typescript: ">=5.2 <5.3" + typescript: ">=5.2 <5.4" dependenciesMeta: esbuild: optional: true @@ -138,6 +138,8 @@ __metadata: optional: true "@angular/service-worker": optional: true + browser-sync: + optional: true jest: optional: true jest-environment-jsdom: @@ -150,20 +152,20 @@ __metadata: optional: true tailwindcss: optional: true - checksum: 80ef057e5e59d4a06dfa8d32ae635b5fc2ad45ecefc642d5c576f04656d782fcbfdb9fb046adab98535d6b65812910c8bc64d61302f63785833b31f58e67c24e + checksum: d46fab008a7a3bea28fac331adbbbf8bfef0ed933fb5f585c4efd47cce3744dd6d3b9eee2f9d49966076c3db5e7cbb5d877b533fce5ec0a343f61a00817ba765 languageName: node linkType: hard -"@angular-devkit/build-webpack@npm:0.1700.1": - version: 0.1700.1 - resolution: "@angular-devkit/build-webpack@npm:0.1700.1" +"@angular-devkit/build-webpack@npm:0.1701.0-next.1": + version: 0.1701.0-next.1 + resolution: "@angular-devkit/build-webpack@npm:0.1701.0-next.1" dependencies: - "@angular-devkit/architect": 0.1700.1 + "@angular-devkit/architect": 0.1701.0-next.1 rxjs: 7.8.1 peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 - checksum: cb2067ab4b1455c45273027b32e9422243e388998b3c769a99dab3367e9a591f61f57249f1fc2573ab35340f4a1bdf901e09c66575927decb87f1320dfca38c5 + checksum: 92e1eef2c470d07e7caa44b9c6723df523d1e9341f6b2f9015851e685a0b9e6ebf7472e17249a375b5c1c7bc7a0d72de7805a2e66217326725a3d4e7f4708dc2 languageName: node linkType: hard @@ -185,9 +187,28 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:17.0.1": - version: 17.0.1 - resolution: "@angular-devkit/core@npm:17.0.1" +"@angular-devkit/core@npm:17.0.3": + version: 17.0.3 + resolution: "@angular-devkit/core@npm:17.0.3" + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1 + jsonc-parser: 3.2.0 + picomatch: 3.0.1 + rxjs: 7.8.1 + source-map: 0.7.4 + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + checksum: 35b1bfac3757efb89f02cfb07c20502d9b18386643ab8953cd23bbe0b23fcbe6226a76a439dee099f41a783bc2b2d433853335df8b28fd969451a3df7fdf4f61 + languageName: node + linkType: hard + +"@angular-devkit/core@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@angular-devkit/core@npm:17.1.0-next.1" dependencies: ajv: 8.12.0 ajv-formats: 2.1.1 @@ -200,7 +221,7 @@ __metadata: peerDependenciesMeta: chokidar: optional: true - checksum: e9832de3c2520f6a049331567386b4824a05fbcf6aa0b62a48bd2ba3aee8af080d7e988e3fc4d1157037e1ce4ee4c43fd1c0cc6941cc4a8996ed912779007510 + checksum: c60c39517d11aef064384cef09a181cb89f434a6e48baabf209ea57da0fccff87ca486d3cac3c5f16ed66436210ff9f54c7986ca80de928e25b590b539eebd41 languageName: node linkType: hard @@ -217,16 +238,29 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/schematics@npm:17.0.1": - version: 17.0.1 - resolution: "@angular-devkit/schematics@npm:17.0.1" +"@angular-devkit/schematics@npm:17.0.3": + version: 17.0.3 + resolution: "@angular-devkit/schematics@npm:17.0.3" + dependencies: + "@angular-devkit/core": 17.0.3 + jsonc-parser: 3.2.0 + magic-string: 0.30.5 + ora: 5.4.1 + rxjs: 7.8.1 + checksum: d9e2c5d56db8096963b6cabe26df8dfd57ce7e57bbeda6cccc1446e91c4e902a3b16456a1fe3480e7050a1e8baba58ad63dc1d2f9370edc44869a10692dacdca + languageName: node + linkType: hard + +"@angular-devkit/schematics@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@angular-devkit/schematics@npm:17.1.0-next.1" dependencies: - "@angular-devkit/core": 17.0.1 + "@angular-devkit/core": 17.1.0-next.1 jsonc-parser: 3.2.0 magic-string: 0.30.5 ora: 5.4.1 rxjs: 7.8.1 - checksum: 6d630fb23f5958fb785f05cd514d4a8030061e8800410de9bee58d2ebf298d355d9f28e049acbaf2b16f61a6ff1b8dccd769cfbb7e2370750efbdb2ce3c4f364 + checksum: e8e49a3c0bfd68e4e312260f58ff41bb10b4708311bd15be9b9260fbb2acb91be3ffa41949b36a24c050bfa9970fa45e668a7fe41e075322d9cb81bb8f212785 languageName: node linkType: hard @@ -304,9 +338,9 @@ __metadata: languageName: node linkType: hard -"@angular/cdk@npm:17.0.1": - version: 17.0.1 - resolution: "@angular/cdk@npm:17.0.1" +"@angular/cdk@npm:17.0.3": + version: 17.0.3 + resolution: "@angular/cdk@npm:17.0.3" dependencies: parse5: ^7.1.2 tslib: ^2.3.0 @@ -317,35 +351,35 @@ __metadata: dependenciesMeta: parse5: optional: true - checksum: 0610b16c08ca48fc90528edf12ac7eceb590ba227f9acd8b862fc81180afe56b816e8509b0228e1818c96b37721ad82a85913ff24bc1c7edd4bf8389ce3a10f6 + checksum: 616875935bd4d6119b639666bdad3c20a83da245af6a381266c246b927bbae98cce29a41752fcd4fc4d22fde05417c1f54cf2ec1c7a5dfafc363ff004afea084 languageName: node linkType: hard -"@angular/cli@npm:~17.0.0": - version: 17.0.1 - resolution: "@angular/cli@npm:17.0.1" +"@angular/cli@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@angular/cli@npm:17.1.0-next.1" dependencies: - "@angular-devkit/architect": 0.1700.1 - "@angular-devkit/core": 17.0.1 - "@angular-devkit/schematics": 17.0.1 - "@schematics/angular": 17.0.1 + "@angular-devkit/architect": 0.1701.0-next.1 + "@angular-devkit/core": 17.1.0-next.1 + "@angular-devkit/schematics": 17.1.0-next.1 + "@schematics/angular": 17.1.0-next.1 "@yarnpkg/lockfile": 1.1.0 ansi-colors: 4.1.3 ini: 4.1.1 - inquirer: 9.2.11 + inquirer: 9.2.12 jsonc-parser: 3.2.0 npm-package-arg: 11.0.1 npm-pick-manifest: 9.0.0 open: 8.4.2 ora: 5.4.1 - pacote: 17.0.4 + pacote: 17.0.5 resolve: 1.22.8 semver: 7.5.4 symbol-observable: 4.0.0 yargs: 17.7.2 bin: ng: bin/ng.js - checksum: f27b3406140ca84a4cca9f0a5a66600b94adecce979e0bb5aa60001fa915808850be986577bdf7f3a4584c9309ef64ba12561f432fbac9978b20ededd6d9ed82 + checksum: 0f0b4843ab39de6e69ecb0ff782e0c67247704ec8bb71722da784173bec33d5b7cf916d7a6fb47927c95d93789ca455b4b8264bd4ea8ebaf5a6662c35e31a1b7 languageName: node linkType: hard @@ -361,9 +395,9 @@ __metadata: languageName: node linkType: hard -"@angular/compiler-cli@npm:17.0.3": - version: 17.0.3 - resolution: "@angular/compiler-cli@npm:17.0.3" +"@angular/compiler-cli@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@angular/compiler-cli@npm:17.1.0-next.1" dependencies: "@babel/core": 7.23.2 "@jridgewell/sourcemap-codec": ^1.4.14 @@ -374,13 +408,13 @@ __metadata: tslib: ^2.3.0 yargs: ^17.2.1 peerDependencies: - "@angular/compiler": 17.0.3 - typescript: ">=5.2 <5.3" + "@angular/compiler": 17.1.0-next.1 + typescript: ">=5.2 <5.4" bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js ngcc: bundles/ngcc/index.js - checksum: acb81a4118d7be15f1f82da744d1480abd09d63598288540ebcbb3b9c590bb2f0fbffed16915a68351dd23e5a31edfcf1854204f3e2efed46f3811ecbd84979c + checksum: c3d9bc58ffa89b8bf19e5644f05d657a72609f5ccb35fc0ff7057d29538f6c876dc70b53bddedb4e89baccbde9370768bc358b21c422ca1ac1c73fe17db47c1e languageName: node linkType: hard @@ -431,9 +465,9 @@ __metadata: languageName: node linkType: hard -"@angular/material@npm:17.0.1": - version: 17.0.1 - resolution: "@angular/material@npm:17.0.1" +"@angular/material@npm:17.0.3": + version: 17.0.3 + resolution: "@angular/material@npm:17.0.3" dependencies: "@material/animation": 15.0.0-canary.a246a4439.0 "@material/auto-init": 15.0.0-canary.a246a4439.0 @@ -485,13 +519,13 @@ __metadata: tslib: ^2.3.0 peerDependencies: "@angular/animations": ^17.0.0 || ^18.0.0 - "@angular/cdk": 17.0.1 + "@angular/cdk": 17.0.3 "@angular/common": ^17.0.0 || ^18.0.0 "@angular/core": ^17.0.0 || ^18.0.0 "@angular/forms": ^17.0.0 || ^18.0.0 "@angular/platform-browser": ^17.0.0 || ^18.0.0 rxjs: ^6.5.3 || ^7.4.0 - checksum: 3d2ba23780bd4d65fe10b37f3938e22d599fb8647c090569dad130a5d8e3bc2285da191e677bf20ac4c423355423e5effa42179a3d733f2fc3c194189769471f + checksum: d074130488977340819a82f996e872a7dd0bea0e25d33f7c4c7f50b014ea17a62ea212aa5cc34cf5605572d7eeff5a1e0a23e59d31420098d806972baacae94b languageName: node linkType: hard @@ -642,6 +676,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.20 resolution: "@babel/compat-data@npm:7.22.20" @@ -649,10 +693,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.2": - version: 7.23.3 - resolution: "@babel/compat-data@npm:7.23.3" - checksum: 52fff649d4e25b10e29e8a9b1c9ef117f44d354273c17b5ef056555f8e5db2429b35df4c38bdfb6865d23133e0fba92e558d31be87bb8457db4ac688646fdbf1 +"@babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 languageName: node linkType: hard @@ -679,6 +723,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:7.23.5": + version: 7.23.5 + resolution: "@babel/core@npm:7.23.5" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helpers": ^7.23.5 + "@babel/parser": ^7.23.5 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.5 + "@babel/types": ^7.23.5 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 5e5dfb1e61f298676f1fca18c646dbf6fb164ca1056b0169b8d42b7f5c35e026d81823582ccb2358e93a61b035e22b3ad37e2abaae4bf43f1ffb93b6ce19466e + languageName: node + linkType: hard + "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.9": version: 7.22.20 resolution: "@babel/core@npm:7.22.20" @@ -702,15 +769,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:7.23.0": - version: 7.23.0 - resolution: "@babel/generator@npm:7.23.0" +"@babel/generator@npm:7.23.5, @babel/generator@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/generator@npm:7.23.5" dependencies: - "@babel/types": ^7.23.0 + "@babel/types": ^7.23.5 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 8efe24adad34300f1f8ea2add420b28171a646edc70f2a1b3e1683842f23b8b7ffa7e35ef0119294e1901f45bfea5b3dc70abe1f10a1917ccdfb41bed69be5f1 + checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 languageName: node linkType: hard @@ -747,7 +814,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15, @babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: @@ -788,7 +855,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: @@ -944,7 +1011,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": +"@babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": version: 7.22.20 resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: @@ -991,6 +1058,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.19, @babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -1005,6 +1079,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -1038,6 +1119,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helpers@npm:7.23.5" + dependencies: + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.5 + "@babel/types": ^7.23.5 + checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.22.13": version: 7.22.20 resolution: "@babel/highlight@npm:7.22.20" @@ -1049,6 +1141,17 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.16": version: 7.22.16 resolution: "@babel/parser@npm:7.22.16" @@ -1067,6 +1170,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/parser@npm:7.23.5" + bin: + parser: ./bin/babel-parser.js + checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" @@ -1078,6 +1190,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" @@ -1091,6 +1214,31 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.23.3 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 4690123f0ef7c11d6bf1a9579e4f463ce363563b75ec3f6ca66cf68687e39d8d747a82c833847653962f79da367eca895d9095c60d8ebb224a1d4277003acc11 + languageName: node + linkType: hard + "@babel/plugin-proposal-decorators@npm:^7.22.7": version: 7.22.15 resolution: "@babel/plugin-proposal-decorators@npm:7.22.15" @@ -1203,6 +1351,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-attributes@npm:7.22.5" @@ -1214,6 +1373,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -1369,9 +1539,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:7.23.2": - version: 7.23.2 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" +"@babel/plugin-transform-arrow-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:7.23.4, @babel/plugin-transform-async-generator-functions@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" dependencies: "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-plugin-utils": ^7.22.5 @@ -1379,7 +1560,7 @@ __metadata: "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868 + checksum: e2fc132c9033711d55209f4781e1fc73f0f4da5e0ca80a2da73dec805166b73c92a6e83571a8994cd2c893a28302e24107e90856202b24781bab734f800102bb languageName: node linkType: hard @@ -1397,21 +1578,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.2": +"@babel/plugin-transform-async-to-generator@npm:7.23.3, @babel/plugin-transform-async-to-generator@npm:^7.23.3": version: 7.23.3 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.3" + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-remap-async-to-generator": ^7.22.20 - "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 39407e5d92905a824d6ef115af70755b26a6b458639686092d7e05d0701f7ff42e995e2c5aab28d6ab5311752190667766417e58834b54c98fac78c857e30320 + checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:7.22.5, @babel/plugin-transform-async-to-generator@npm:^7.22.5": +"@babel/plugin-transform-async-to-generator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" dependencies: @@ -1435,6 +1615,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-block-scoping@npm:7.22.15" @@ -1446,14 +1637,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.0": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.3" +"@babel/plugin-transform-block-scoping@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2bad9491502942266ddacd76e026ee2095e71c2a6aa3d038343d65f8db67a2a2262701b2db23a30b7f06ab49710cbf0ab5bedbb930a9f39780cb366aecd30540 + checksum: fc4b2100dd9f2c47d694b4b35ae8153214ccb4e24ef545c259a9db17211b18b6a430f22799b56db8f6844deaeaa201af45a03331d0c80cc28b0c4e3c814570e4 languageName: node linkType: hard @@ -1469,6 +1660,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9c6f8366f667897541d360246de176dd29efc7a13d80a5b48361882f7173d9173be4646c3b7d9b003ccc0e01e25df122330308f33db921fa553aa17ad544b3fc + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" @@ -1482,6 +1685,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-classes@npm:7.22.15" @@ -1501,6 +1717,25 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/plugin-transform-classes@npm:7.23.5" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 + "@babel/helper-split-export-declaration": ^7.22.6 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6d0dd3b0828e84a139a51b368f33f315edee5688ef72c68ba25e0175c68ea7357f9c8810b3f61713e368a3063cdcec94f3a2db952e453b0b14ef428a34aa8169 + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" @@ -1513,6 +1748,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/template": ^7.22.15 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 80452661dc25a0956f89fe98cb562e8637a9556fb6c00d312c57653ce7df8798f58d138603c7e1aad96614ee9ccd10c47e50ab9ded6b6eded5adeb230d2a982e + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-destructuring@npm:7.22.15" @@ -1524,7 +1771,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.0": +"@babel/plugin-transform-destructuring@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" dependencies: @@ -1547,6 +1794,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" @@ -1558,6 +1817,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" @@ -1570,6 +1840,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" @@ -1582,6 +1864,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" @@ -1594,6 +1888,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-for-of@npm:7.22.15" @@ -1605,6 +1911,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a6288122a5091d96c744b9eb23dc1b2d4cce25f109ac1e26a0ea03c4ea60330e6f3cc58530b33ba7369fa07163b71001399a145238b7e92bff6270ef3b9c32a0 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-function-name@npm:7.22.5" @@ -1618,6 +1935,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" + dependencies: + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" @@ -1630,6 +1960,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-json-strings": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-literals@npm:7.22.5" @@ -1641,9 +1983,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": - version: 7.22.11 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" +"@babel/plugin-transform-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + languageName: node + linkType: hard + +"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 @@ -1653,6 +2006,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" @@ -1664,6 +2029,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" @@ -1676,7 +2052,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.0": +"@babel/plugin-transform-modules-amd@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" dependencies: @@ -1701,7 +2077,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.23.0": +"@babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" dependencies: @@ -1728,7 +2104,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": +"@babel/plugin-transform-modules-systemjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" dependencies: @@ -1754,6 +2130,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" + dependencies: + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 586a7a2241e8b4e753a37af9466a9ffa8a67b4ba9aa756ad7500712c05d8fa9a8c1ed4f7bd25fae2a8265e6cf8fe781ec85a8ee885dd34cf50d8955ee65f12dc + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" @@ -1777,6 +2165,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" @@ -1789,6 +2188,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a27d73ea134d3d9560a6b2e26ab60012fba15f1db95865aa0153c18f5ec82cfef6a7b3d8df74e3c2fca81534fa5efeb6cacaf7b08bdb7d123e3dafdd079886a3 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" @@ -1801,6 +2212,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" @@ -1816,6 +2239,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" + dependencies: + "@babel/compat-data": ^7.23.3 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-transform-parameters": ^7.23.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 73fec495e327ca3959c1c03d07a621be09df00036c69fff0455af9a008291677ee9d368eec48adacdc6feac703269a649747568b4af4c4e9f134aa71cc5b378d + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-object-super@npm:7.22.5" @@ -1828,6 +2266,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" @@ -1840,6 +2290,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.15" @@ -1853,16 +2315,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0": - version: 7.23.3 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.3" +"@babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 98529b9d10b5502ceb87259b538e5649d111ec1582c4c49c620f3181d53489c1ff887075fb208245baa43fa45ae85c9950f0db47be00e55b52c9bcd36271d701 + checksum: e7a4c08038288057b7a08d68c4d55396ada9278095509ca51ed8dfb72a7f13f26bdd7c5185de21079fe0a9d60d22c227cb32e300d266c1bda40f70eee9f4bc1e languageName: node linkType: hard @@ -1877,6 +2339,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a735b3e85316d17ec102e3d3d1b6993b429bdb3b494651c9d754e3b7d270462ee1f1a126ccd5e3d871af5e683727e9ef98c9d34d4a42204fffaabff91052ed16 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" @@ -1889,6 +2362,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: cedc1285c49b5a6d9a3d0e5e413b756ac40b3ac2f8f68bdfc3ae268bc8d27b00abd8bb0861c72756ff5dd8bf1eb77211b7feb5baf4fdae2ebbaabe49b9adc1d0 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.22.11": version: 7.22.11 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" @@ -1903,6 +2388,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fb7adfe94ea97542f250a70de32bddbc3e0b802381c92be947fec83ebffda57e68533c4d0697152719a3496fdd3ebf3798d451c024cd4ac848fc15ac26b70aa7 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" @@ -1914,6 +2413,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" @@ -1926,6 +2436,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + regenerator-transform: ^0.15.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" @@ -1937,9 +2459,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.23.2": - version: 7.23.2 - resolution: "@babel/plugin-transform-runtime@npm:7.23.2" +"@babel/plugin-transform-reserved-words@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:7.23.4": + version: 7.23.4 + resolution: "@babel/plugin-transform-runtime@npm:7.23.4" dependencies: "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 @@ -1949,7 +2482,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 09f4273bfe9600c67e72e26f853f11c24ee4c1cbb3935c4a28a94d388e7c0d8733479d868c333cb34e9c236f1765788c6daef7852331f5c70a3b5543fd0247a1 + checksum: a1693d27cd5ce17d0917280942a62bbf4ee27f6f0fe7beb33789bdc699cda21e5253997663248b32e8e36c01ccd202f96246413b9328b70a05d4cf64faa3191e languageName: node linkType: hard @@ -1980,6 +2513,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-spread@npm:7.22.5" @@ -1992,6 +2536,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8fd5cac201e77a0b4825745f4e07a25f923842f282f006b3a79223c00f61075c8868d12eafec86b2642cd0b32077cdd32314e27bcb75ee5e6a68c0144140dcf2 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" @@ -2003,6 +2559,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" @@ -2014,6 +2581,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" @@ -2025,6 +2603,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-typescript@npm:7.22.15" @@ -2050,6 +2639,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.22.5" @@ -2062,6 +2662,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" @@ -2074,6 +2686,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.22.5" @@ -2086,24 +2710,37 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.23.2": - version: 7.23.2 - resolution: "@babel/preset-env@npm:7.23.2" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + languageName: node + linkType: hard + +"@babel/preset-env@npm:7.23.5": + version: 7.23.5 + resolution: "@babel/preset-env@npm:7.23.5" dependencies: - "@babel/compat-data": ^7.23.2 + "@babel/compat-data": ^7.23.5 "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.15 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.15 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.22.15 + "@babel/helper-validator-option": ^7.23.5 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.23.3 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.23.3 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.23.3 "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 "@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-import-assertions": ^7.22.5 - "@babel/plugin-syntax-import-attributes": ^7.22.5 + "@babel/plugin-syntax-import-assertions": ^7.23.3 + "@babel/plugin-syntax-import-attributes": ^7.23.3 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-json-strings": ^7.8.3 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 @@ -2115,56 +2752,55 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 - "@babel/plugin-transform-arrow-functions": ^7.22.5 - "@babel/plugin-transform-async-generator-functions": ^7.23.2 - "@babel/plugin-transform-async-to-generator": ^7.22.5 - "@babel/plugin-transform-block-scoped-functions": ^7.22.5 - "@babel/plugin-transform-block-scoping": ^7.23.0 - "@babel/plugin-transform-class-properties": ^7.22.5 - "@babel/plugin-transform-class-static-block": ^7.22.11 - "@babel/plugin-transform-classes": ^7.22.15 - "@babel/plugin-transform-computed-properties": ^7.22.5 - "@babel/plugin-transform-destructuring": ^7.23.0 - "@babel/plugin-transform-dotall-regex": ^7.22.5 - "@babel/plugin-transform-duplicate-keys": ^7.22.5 - "@babel/plugin-transform-dynamic-import": ^7.22.11 - "@babel/plugin-transform-exponentiation-operator": ^7.22.5 - "@babel/plugin-transform-export-namespace-from": ^7.22.11 - "@babel/plugin-transform-for-of": ^7.22.15 - "@babel/plugin-transform-function-name": ^7.22.5 - "@babel/plugin-transform-json-strings": ^7.22.11 - "@babel/plugin-transform-literals": ^7.22.5 - "@babel/plugin-transform-logical-assignment-operators": ^7.22.11 - "@babel/plugin-transform-member-expression-literals": ^7.22.5 - "@babel/plugin-transform-modules-amd": ^7.23.0 - "@babel/plugin-transform-modules-commonjs": ^7.23.0 - "@babel/plugin-transform-modules-systemjs": ^7.23.0 - "@babel/plugin-transform-modules-umd": ^7.22.5 + "@babel/plugin-transform-arrow-functions": ^7.23.3 + "@babel/plugin-transform-async-generator-functions": ^7.23.4 + "@babel/plugin-transform-async-to-generator": ^7.23.3 + "@babel/plugin-transform-block-scoped-functions": ^7.23.3 + "@babel/plugin-transform-block-scoping": ^7.23.4 + "@babel/plugin-transform-class-properties": ^7.23.3 + "@babel/plugin-transform-class-static-block": ^7.23.4 + "@babel/plugin-transform-classes": ^7.23.5 + "@babel/plugin-transform-computed-properties": ^7.23.3 + "@babel/plugin-transform-destructuring": ^7.23.3 + "@babel/plugin-transform-dotall-regex": ^7.23.3 + "@babel/plugin-transform-duplicate-keys": ^7.23.3 + "@babel/plugin-transform-dynamic-import": ^7.23.4 + "@babel/plugin-transform-exponentiation-operator": ^7.23.3 + "@babel/plugin-transform-export-namespace-from": ^7.23.4 + "@babel/plugin-transform-for-of": ^7.23.3 + "@babel/plugin-transform-function-name": ^7.23.3 + "@babel/plugin-transform-json-strings": ^7.23.4 + "@babel/plugin-transform-literals": ^7.23.3 + "@babel/plugin-transform-logical-assignment-operators": ^7.23.4 + "@babel/plugin-transform-member-expression-literals": ^7.23.3 + "@babel/plugin-transform-modules-amd": ^7.23.3 + "@babel/plugin-transform-modules-commonjs": ^7.23.3 + "@babel/plugin-transform-modules-systemjs": ^7.23.3 + "@babel/plugin-transform-modules-umd": ^7.23.3 "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5 - "@babel/plugin-transform-new-target": ^7.22.5 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.22.11 - "@babel/plugin-transform-numeric-separator": ^7.22.11 - "@babel/plugin-transform-object-rest-spread": ^7.22.15 - "@babel/plugin-transform-object-super": ^7.22.5 - "@babel/plugin-transform-optional-catch-binding": ^7.22.11 - "@babel/plugin-transform-optional-chaining": ^7.23.0 - "@babel/plugin-transform-parameters": ^7.22.15 - "@babel/plugin-transform-private-methods": ^7.22.5 - "@babel/plugin-transform-private-property-in-object": ^7.22.11 - "@babel/plugin-transform-property-literals": ^7.22.5 - "@babel/plugin-transform-regenerator": ^7.22.10 - "@babel/plugin-transform-reserved-words": ^7.22.5 - "@babel/plugin-transform-shorthand-properties": ^7.22.5 - "@babel/plugin-transform-spread": ^7.22.5 - "@babel/plugin-transform-sticky-regex": ^7.22.5 - "@babel/plugin-transform-template-literals": ^7.22.5 - "@babel/plugin-transform-typeof-symbol": ^7.22.5 - "@babel/plugin-transform-unicode-escapes": ^7.22.10 - "@babel/plugin-transform-unicode-property-regex": ^7.22.5 - "@babel/plugin-transform-unicode-regex": ^7.22.5 - "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 + "@babel/plugin-transform-new-target": ^7.23.3 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.23.4 + "@babel/plugin-transform-numeric-separator": ^7.23.4 + "@babel/plugin-transform-object-rest-spread": ^7.23.4 + "@babel/plugin-transform-object-super": ^7.23.3 + "@babel/plugin-transform-optional-catch-binding": ^7.23.4 + "@babel/plugin-transform-optional-chaining": ^7.23.4 + "@babel/plugin-transform-parameters": ^7.23.3 + "@babel/plugin-transform-private-methods": ^7.23.3 + "@babel/plugin-transform-private-property-in-object": ^7.23.4 + "@babel/plugin-transform-property-literals": ^7.23.3 + "@babel/plugin-transform-regenerator": ^7.23.3 + "@babel/plugin-transform-reserved-words": ^7.23.3 + "@babel/plugin-transform-shorthand-properties": ^7.23.3 + "@babel/plugin-transform-spread": ^7.23.3 + "@babel/plugin-transform-sticky-regex": ^7.23.3 + "@babel/plugin-transform-template-literals": ^7.23.3 + "@babel/plugin-transform-typeof-symbol": ^7.23.3 + "@babel/plugin-transform-unicode-escapes": ^7.23.3 + "@babel/plugin-transform-unicode-property-regex": ^7.23.3 + "@babel/plugin-transform-unicode-regex": ^7.23.3 + "@babel/plugin-transform-unicode-sets-regex": ^7.23.3 "@babel/preset-modules": 0.1.6-no-external-plugins - "@babel/types": ^7.23.0 babel-plugin-polyfill-corejs2: ^0.4.6 babel-plugin-polyfill-corejs3: ^0.8.5 babel-plugin-polyfill-regenerator: ^0.5.3 @@ -2172,7 +2808,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 49327ef584b529b56aedd6577937b80c0d89603c68b23795495a13af04b5aa008db9ad04cd280423600cdc0d3cce13ae9d0d9a977db5c8193697b20ced8a10b2 + checksum: adddd58d14fc1b2e5f8cf90995f522879362a0543e316afe9e5783f1bd715bb1e92300cd49d7ce3a95c64a96d60788d0089651e2cf4cac937f5469aac1087bb1 languageName: node linkType: hard @@ -2338,12 +2974,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.23.2": - version: 7.23.2 - resolution: "@babel/runtime@npm:7.23.2" +"@babel/runtime@npm:7.23.5": + version: 7.23.5 + resolution: "@babel/runtime@npm:7.23.5" dependencies: regenerator-runtime: ^0.14.0 - checksum: 6c4df4839ec75ca10175f636d6362f91df8a3137f86b38f6cd3a4c90668a0fe8e9281d320958f4fbd43b394988958585a17c3aab2a4ea6bf7316b22916a371fb + checksum: 164d9802424f06908e62d29b8fd3a87db55accf82f46f964ac481dcead11ff7df8391e3696e5fa91a8ca10ea8845bf650acd730fa88cf13f8026cd8d5eec6936 languageName: node linkType: hard @@ -2403,6 +3039,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/traverse@npm:7.23.5" + dependencies: + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.23.5 + "@babel/types": ^7.23.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.19 resolution: "@babel/types@npm:7.22.19" @@ -2425,6 +3079,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/types@npm:7.23.5" + dependencies: + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 + to-fast-properties: ^2.0.0 + checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -3053,13 +3718,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm64@npm:0.18.20" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.19.3": version: 0.19.3 resolution: "@esbuild/android-arm64@npm:0.19.3" @@ -3067,17 +3725,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-arm64@npm:0.19.5" +"@esbuild/android-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-arm64@npm:0.19.8" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm@npm:0.18.20" - conditions: os=android & cpu=arm +"@esbuild/android-arm64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/android-arm64@npm:0.19.9" + conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3088,17 +3746,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-arm@npm:0.19.5" +"@esbuild/android-arm@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-arm@npm:0.19.8" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-x64@npm:0.18.20" - conditions: os=android & cpu=x64 +"@esbuild/android-arm@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/android-arm@npm:0.19.9" + conditions: os=android & cpu=arm languageName: node linkType: hard @@ -3109,17 +3767,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/android-x64@npm:0.19.5" +"@esbuild/android-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-x64@npm:0.19.8" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-arm64@npm:0.18.20" - conditions: os=darwin & cpu=arm64 +"@esbuild/android-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/android-x64@npm:0.19.9" + conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3130,17 +3788,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/darwin-arm64@npm:0.19.5" +"@esbuild/darwin-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/darwin-arm64@npm:0.19.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-x64@npm:0.18.20" - conditions: os=darwin & cpu=x64 +"@esbuild/darwin-arm64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/darwin-arm64@npm:0.19.9" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3151,17 +3809,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/darwin-x64@npm:0.19.5" +"@esbuild/darwin-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/darwin-x64@npm:0.19.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-arm64@npm:0.18.20" - conditions: os=freebsd & cpu=arm64 +"@esbuild/darwin-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/darwin-x64@npm:0.19.9" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3172,17 +3830,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/freebsd-arm64@npm:0.19.5" +"@esbuild/freebsd-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/freebsd-arm64@npm:0.19.8" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-x64@npm:0.18.20" - conditions: os=freebsd & cpu=x64 +"@esbuild/freebsd-arm64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/freebsd-arm64@npm:0.19.9" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3193,17 +3851,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/freebsd-x64@npm:0.19.5" +"@esbuild/freebsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/freebsd-x64@npm:0.19.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm64@npm:0.18.20" - conditions: os=linux & cpu=arm64 +"@esbuild/freebsd-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/freebsd-x64@npm:0.19.9" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3214,17 +3872,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-arm64@npm:0.19.5" +"@esbuild/linux-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-arm64@npm:0.19.8" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm@npm:0.18.20" - conditions: os=linux & cpu=arm +"@esbuild/linux-arm64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-arm64@npm:0.19.9" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3235,17 +3893,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-arm@npm:0.19.5" +"@esbuild/linux-arm@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-arm@npm:0.19.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ia32@npm:0.18.20" - conditions: os=linux & cpu=ia32 +"@esbuild/linux-arm@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-arm@npm:0.19.9" + conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3256,17 +3914,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-ia32@npm:0.19.5" +"@esbuild/linux-ia32@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-ia32@npm:0.19.8" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-loong64@npm:0.18.20" - conditions: os=linux & cpu=loong64 +"@esbuild/linux-ia32@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-ia32@npm:0.19.9" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3277,17 +3935,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-loong64@npm:0.19.5" +"@esbuild/linux-loong64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-loong64@npm:0.19.8" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-mips64el@npm:0.18.20" - conditions: os=linux & cpu=mips64el +"@esbuild/linux-loong64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-loong64@npm:0.19.9" + conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -3298,17 +3956,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-mips64el@npm:0.19.5" +"@esbuild/linux-mips64el@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-mips64el@npm:0.19.8" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ppc64@npm:0.18.20" - conditions: os=linux & cpu=ppc64 +"@esbuild/linux-mips64el@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-mips64el@npm:0.19.9" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3319,17 +3977,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-ppc64@npm:0.19.5" +"@esbuild/linux-ppc64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-ppc64@npm:0.19.8" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-riscv64@npm:0.18.20" - conditions: os=linux & cpu=riscv64 +"@esbuild/linux-ppc64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-ppc64@npm:0.19.9" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3340,17 +3998,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-riscv64@npm:0.19.5" +"@esbuild/linux-riscv64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-riscv64@npm:0.19.8" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-s390x@npm:0.18.20" - conditions: os=linux & cpu=s390x +"@esbuild/linux-riscv64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-riscv64@npm:0.19.9" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3361,17 +4019,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-s390x@npm:0.19.5" +"@esbuild/linux-s390x@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-s390x@npm:0.19.8" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-x64@npm:0.18.20" - conditions: os=linux & cpu=x64 +"@esbuild/linux-s390x@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-s390x@npm:0.19.9" + conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3382,17 +4040,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/linux-x64@npm:0.19.5" +"@esbuild/linux-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-x64@npm:0.19.8" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/netbsd-x64@npm:0.18.20" - conditions: os=netbsd & cpu=x64 +"@esbuild/linux-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/linux-x64@npm:0.19.9" + conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3403,17 +4061,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/netbsd-x64@npm:0.19.5" +"@esbuild/netbsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/netbsd-x64@npm:0.19.8" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/openbsd-x64@npm:0.18.20" - conditions: os=openbsd & cpu=x64 +"@esbuild/netbsd-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/netbsd-x64@npm:0.19.9" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -3424,17 +4082,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/openbsd-x64@npm:0.19.5" +"@esbuild/openbsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/openbsd-x64@npm:0.19.8" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/sunos-x64@npm:0.18.20" - conditions: os=sunos & cpu=x64 +"@esbuild/openbsd-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/openbsd-x64@npm:0.19.9" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3445,17 +4103,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/sunos-x64@npm:0.19.5" +"@esbuild/sunos-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/sunos-x64@npm:0.19.8" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-arm64@npm:0.18.20" - conditions: os=win32 & cpu=arm64 +"@esbuild/sunos-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/sunos-x64@npm:0.19.9" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3466,17 +4124,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-arm64@npm:0.19.5" +"@esbuild/win32-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-arm64@npm:0.19.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-ia32@npm:0.18.20" - conditions: os=win32 & cpu=ia32 +"@esbuild/win32-arm64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/win32-arm64@npm:0.19.9" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -3487,17 +4145,17 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-ia32@npm:0.19.5" +"@esbuild/win32-ia32@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-ia32@npm:0.19.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-x64@npm:0.18.20" - conditions: os=win32 & cpu=x64 +"@esbuild/win32-ia32@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/win32-ia32@npm:0.19.9" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3508,9 +4166,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.5": - version: 0.19.5 - resolution: "@esbuild/win32-x64@npm:0.19.5" +"@esbuild/win32-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-x64@npm:0.19.8" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.19.9": + version: 0.19.9 + resolution: "@esbuild/win32-x64@npm:0.19.9" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4575,7 +5240,7 @@ __metadata: languageName: node linkType: hard -"@ljharb/through@npm:^2.3.9": +"@ljharb/through@npm:^2.3.11": version: 2.3.11 resolution: "@ljharb/through@npm:2.3.11" dependencies: @@ -5409,14 +6074,14 @@ __metadata: languageName: node linkType: hard -"@ngtools/webpack@npm:17.0.1": - version: 17.0.1 - resolution: "@ngtools/webpack@npm:17.0.1" +"@ngtools/webpack@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@ngtools/webpack@npm:17.1.0-next.1" peerDependencies: - "@angular/compiler-cli": ^17.0.0 - typescript: ">=5.2 <5.3" + "@angular/compiler-cli": ^17.0.0 || ^17.1.0-next.0 + typescript: ">=5.2 <5.4" webpack: ^5.54.0 - checksum: dfd40b92ada65fde2af44c3b2a315f4dd16d487dd0318f7dc8c9128250238e9de42364400dd98e69830a40bca07055fda6224b540e9dfc05541434b160bb171b + checksum: cc13d3a308aaa9ee266d1cbe65c66107d95e04e4bdbc13bbbc2b71d5fda47d34dfb8efffee23de87c20d94d0865626beb80c76e8f70aa940d255f829013a1f44 languageName: node linkType: hard @@ -6714,14 +7379,25 @@ __metadata: languageName: node linkType: hard -"@schematics/angular@npm:17.0.1": - version: 17.0.1 - resolution: "@schematics/angular@npm:17.0.1" +"@schematics/angular@npm:17.0.3": + version: 17.0.3 + resolution: "@schematics/angular@npm:17.0.3" + dependencies: + "@angular-devkit/core": 17.0.3 + "@angular-devkit/schematics": 17.0.3 + jsonc-parser: 3.2.0 + checksum: c211e74052ab0f9b9ee3a01982aee8828e3d7f82200f3f6942adb9492f6fa94d45cf7bb4029506f4dc76a383cb312ed71de61695f9424fabb5fae848459a6db2 + languageName: node + linkType: hard + +"@schematics/angular@npm:17.1.0-next.1": + version: 17.1.0-next.1 + resolution: "@schematics/angular@npm:17.1.0-next.1" dependencies: - "@angular-devkit/core": 17.0.1 - "@angular-devkit/schematics": 17.0.1 + "@angular-devkit/core": 17.1.0-next.1 + "@angular-devkit/schematics": 17.1.0-next.1 jsonc-parser: 3.2.0 - checksum: 7f006cad03409d78dabf13cba91bc46f3ec770b030160ad89fa662d5c1d95f22b006e2829cb2347c53e2bcb72f0cd2dc0c911f79fae8d5359c20b3b15e256053 + checksum: df53cb8001997471be9197217e1218fd08ab3bb9a5e0687353cc2e28f1a5d67bf725a9f3525e31eca1e3edcb6e739ad3cb16fec5276c614b898b06e80fadc2e8 languageName: node linkType: hard @@ -6878,9 +7554,9 @@ __metadata: languageName: node linkType: hard -"@supabase/supabase-js@npm:^2.38.5": - version: 2.38.5 - resolution: "@supabase/supabase-js@npm:2.38.5" +"@supabase/supabase-js@npm:^2.39.0": + version: 2.39.0 + resolution: "@supabase/supabase-js@npm:2.39.0" dependencies: "@supabase/functions-js": ^2.1.5 "@supabase/gotrue-js": ^2.56.0 @@ -6888,7 +7564,7 @@ __metadata: "@supabase/postgrest-js": ^1.8.6 "@supabase/realtime-js": ^2.8.4 "@supabase/storage-js": ^2.5.4 - checksum: db6b77ee1edcc71971e530caaecc0e3d969736212b07dc3505b3397b8daa46582bc1ea7e4ffdb353096af722640d277ee32a5b357f7dc06b41361c336d6bb0e4 + checksum: 78bc615ddcb686b427d323273afa1d63feca93e0b177a5c41dab51d03d5906a1d8256f6896950604340d25c22b5a354196fffb1d3b841cb695bd7d9f1a904640 languageName: node linkType: hard @@ -7223,13 +7899,6 @@ __metadata: languageName: node linkType: hard -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 3275534ed69a76c68eb1a77d547d75f99fedc80befb75a3d1d03662fb08d697e6f8b1274e12af1a74c6896071b11510631ba891f64d30c78528d0ec45a9c1a18 - languageName: node - linkType: hard - "@types/cordova@npm:latest": version: 11.0.1 resolution: "@types/cordova@npm:11.0.1" @@ -7246,15 +7915,6 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:^2.8.12": - version: 2.8.16 - resolution: "@types/cors@npm:2.8.16" - dependencies: - "@types/node": "*" - checksum: 0c760aa826167a42bfbccff00d67e39c9dd9852e0cd88610f6d3ea1ed17e438df0f8f1f3175c77bfbfdee4c77bf677b12f6b5bd309358c30b5d0e758624b7250 - languageName: node - linkType: hard - "@types/d3-array@npm:^1": version: 1.2.9 resolution: "@types/d3-array@npm:1.2.9" @@ -7741,15 +8401,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:>=10.0.0": - version: 20.9.1 - resolution: "@types/node@npm:20.9.1" - dependencies: - undici-types: ~5.26.4 - checksum: bb893c6790733dac32818c1ca170fa466622dec39a0ade4639463e1358cb811771e242accbd065e7a1bfe59adc989c0ee59be65e462d3a0ab49043426f0b7637 - languageName: node - linkType: hard - "@types/node@npm:^18.14.2, @types/node@npm:^18.17.5": version: 18.17.17 resolution: "@types/node@npm:18.17.17" @@ -7827,6 +8478,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a + languageName: node + linkType: hard + "@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.5 resolution: "@types/semver@npm:7.5.5" @@ -8213,6 +8871,17 @@ __metadata: languageName: node linkType: hard +"@uppy/companion-client@npm:^3.6.0": + version: 3.6.1 + resolution: "@uppy/companion-client@npm:3.6.1" + dependencies: + "@uppy/utils": ^5.6.0 + namespace-emitter: ^2.0.1 + p-retry: ^6.1.0 + checksum: b35a231b52b79cfb2ed5877239cf9bdc37945640a13b06bffae4e8cc3e0d549bd9a8ee6e875af954e673bf7aa26176103d22c2c094275830377ef5eccd49d72e + languageName: node + linkType: hard + "@uppy/core@npm:^3.7.1": version: 3.7.1 resolution: "@uppy/core@npm:3.7.1" @@ -8335,6 +9004,19 @@ __metadata: languageName: node linkType: hard +"@uppy/tus@npm:^3.4.0": + version: 3.4.0 + resolution: "@uppy/tus@npm:3.4.0" + dependencies: + "@uppy/companion-client": ^3.6.0 + "@uppy/utils": ^5.6.0 + tus-js-client: ^3.0.0 + peerDependencies: + "@uppy/core": ^3.7.0 + checksum: 0f6393be525937cba1b624fffc0f0c9cb00f7162efb6fe5a98f2b6a446f0f0b22323950a5ceba4c16c473c9a99bbc161511e04f3e134c06cdea4337428ef2962 + languageName: node + linkType: hard + "@uppy/utils@npm:^5.4.3, @uppy/utils@npm:^5.5.2, @uppy/utils@npm:^5.6.0": version: 5.6.0 resolution: "@uppy/utils@npm:5.6.0" @@ -8368,12 +9050,12 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-basic-ssl@npm:1.0.1": - version: 1.0.1 - resolution: "@vitejs/plugin-basic-ssl@npm:1.0.1" +"@vitejs/plugin-basic-ssl@npm:1.0.2": + version: 1.0.2 + resolution: "@vitejs/plugin-basic-ssl@npm:1.0.2" peerDependencies: - vite: ^3.0.0 || ^4.0.0 - checksum: 9060dd9b02b51f48f9e655d920214879157db5b8bea9681465ab199e1be4f207cc968393410f93935a0443f8c2b302cef2a3ac0a69087af68fb33a8795e1e203 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: aa6df5037c2b4cdfa3d2eb44f1a2402dab112a1ba9de32edf3cbd132894fed46f49a6cdd1006efce4e521decd66777ce18711f44c77129d616042d5539860cc3 languageName: node linkType: hard @@ -9019,14 +9701,7 @@ __metadata: languageName: node linkType: hard -"async-each-series@npm:0.1.1": - version: 0.1.1 - resolution: "async-each-series@npm:0.1.1" - checksum: 674e5aeee2062a81551ca931a78d0488e10adafda7fd8c9e868a73d4bde78e835c5a04d145f566e32d13b61b31851cea0a6c4e9202b63d2cc6171d8e449a4086 - languageName: node - linkType: hard - -"async@npm:^2.6.0, async@npm:^2.6.4": +"async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" dependencies: @@ -9113,15 +9788,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:0.21.4": - version: 0.21.4 - resolution: "axios@npm:0.21.4" - dependencies: - follow-redirects: ^1.14.0 - checksum: 44245f24ac971e7458f3120c92f9d66d1fc695e8b97019139de5b0cc65d9b8104647db01e5f46917728edfc0cfd88eb30fc4c55e6053eef4ace76768ce95ff3c - languageName: node - linkType: hard - "axios@npm:^1.5.1": version: 1.6.2 resolution: "axios@npm:1.6.2" @@ -9357,13 +10023,6 @@ __metadata: languageName: node linkType: hard -"base64id@npm:2.0.0, base64id@npm:~2.0.0": - version: 2.0.0 - resolution: "base64id@npm:2.0.0" - checksum: 581b1d37e6cf3738b7ccdd4d14fe2bfc5c238e696e2720ee6c44c183b838655842e22034e53ffd783f872a539915c51b0d4728a49c7cc678ac5a758e00d62168 - languageName: node - linkType: hard - "basic-auth@npm:^2.0.1": version: 2.0.1 resolution: "basic-auth@npm:2.0.1" @@ -9567,71 +10226,6 @@ __metadata: languageName: node linkType: hard -"browser-sync-client@npm:^2.29.3": - version: 2.29.3 - resolution: "browser-sync-client@npm:2.29.3" - dependencies: - etag: 1.8.1 - fresh: 0.5.2 - mitt: ^1.1.3 - checksum: b73d7ffacd957597a1e7ee0b80133ef05908610e6a6e64c95b2dcb80803b6a35474ef9ae414748188c6c74c5ba56e510563e8f3c8d4f1bc7d8d797a689109e07 - languageName: node - linkType: hard - -"browser-sync-ui@npm:^2.29.3": - version: 2.29.3 - resolution: "browser-sync-ui@npm:2.29.3" - dependencies: - async-each-series: 0.1.1 - chalk: 4.1.2 - connect-history-api-fallback: ^1 - immutable: ^3 - server-destroy: 1.0.1 - socket.io-client: ^4.4.1 - stream-throttle: ^0.1.3 - checksum: 0fa95676df642a82f70e339ed75b76ace0a827b97881b74305f03c0d4eb16fcab316fb1beb4b6abd64d62cc78a379c0cf3d3080a97866bccece1f153e23315d4 - languageName: node - linkType: hard - -"browser-sync@npm:2.29.3": - version: 2.29.3 - resolution: "browser-sync@npm:2.29.3" - dependencies: - browser-sync-client: ^2.29.3 - browser-sync-ui: ^2.29.3 - bs-recipes: 1.3.4 - chalk: 4.1.2 - chokidar: ^3.5.1 - connect: 3.6.6 - connect-history-api-fallback: ^1 - dev-ip: ^1.0.1 - easy-extender: ^2.3.4 - eazy-logger: ^4.0.1 - etag: ^1.8.1 - fresh: ^0.5.2 - fs-extra: 3.0.1 - http-proxy: ^1.18.1 - immutable: ^3 - localtunnel: ^2.0.1 - micromatch: ^4.0.2 - opn: 5.3.0 - portscanner: 2.2.0 - raw-body: ^2.3.2 - resp-modifier: 6.0.2 - rx: 4.1.0 - send: 0.16.2 - serve-index: 1.9.1 - serve-static: 1.13.2 - server-destroy: 1.0.1 - socket.io: ^4.4.1 - ua-parser-js: ^1.0.33 - yargs: ^17.3.1 - bin: - browser-sync: dist/bin.js - checksum: 232392bf4124767d55112ce98508d47838a8d640b81dd55d8adc03d0deff97c35406ef8fa9a0898e0a9a0f104cb329ad2a309b162257803e6f791fe883fcbcc2 - languageName: node - linkType: hard - "browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5, browserslist@npm:^4.21.9": version: 4.21.10 resolution: "browserslist@npm:4.21.10" @@ -9669,13 +10263,6 @@ __metadata: languageName: node linkType: hard -"bs-recipes@npm:1.3.4": - version: 1.3.4 - resolution: "bs-recipes@npm:1.3.4" - checksum: 2cd89e27730463dac8736f08042faae926f21fbc74788704825b727ad08a85fb5b663d57575aeda3fb188be3c0d446fce60d98560e7b0e76736f1e78e547d345 - languageName: node - linkType: hard - "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -9699,7 +10286,7 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0": +"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.2": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb @@ -9913,16 +10500,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - "chalk@npm:5.3.0, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -9941,6 +10518,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -9962,7 +10549,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": +"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -10272,6 +10859,16 @@ __metadata: languageName: node linkType: hard +"combine-errors@npm:^3.0.3": + version: 3.0.3 + resolution: "combine-errors@npm:3.0.3" + dependencies: + custom-error-instance: 2.1.1 + lodash.uniqby: 4.5.0 + checksum: bd0b0d2a4020f9976b8fe8eb7d5aa855b43ecacdcb61ee1fc5664d73ff8c1d7d0bbe4dd948bea7ba1870518bfc5688b89941de7a4967659418b4664cdb02884f + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -10288,7 +10885,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:2, commander@npm:^2.2.0, commander@npm:^2.20.0": +"commander@npm:2, commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e @@ -10423,13 +11020,6 @@ __metadata: languageName: node linkType: hard -"connect-history-api-fallback@npm:^1": - version: 1.6.0 - resolution: "connect-history-api-fallback@npm:1.6.0" - checksum: 804ca2be28c999032ecd37a9f71405e5d7b7a4b3defcebbe41077bb8c5a0a150d7b59f51dcc33b2de30bc7e217a31d10f8cfad27e8e74c2fc7655eeba82d6e7e - languageName: node - linkType: hard - "connect-history-api-fallback@npm:^2.0.0": version: 2.0.0 resolution: "connect-history-api-fallback@npm:2.0.0" @@ -10437,18 +11027,6 @@ __metadata: languageName: node linkType: hard -"connect@npm:3.6.6": - version: 3.6.6 - resolution: "connect@npm:3.6.6" - dependencies: - debug: 2.6.9 - finalhandler: 1.1.0 - parseurl: ~1.3.2 - utils-merge: 1.0.1 - checksum: b8038eee6d3febc7c36a1ef24879d9d7d8f596e0ec9b63189f955f615b40db1d83ae3812c6f122f21ad8ecbad1cee446b0a811457808f0cc136a1c80b8d0862f - languageName: node - linkType: hard - "console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -10500,13 +11078,6 @@ __metadata: languageName: node linkType: hard -"cookie@npm:~0.4.1": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - "copy-anything@npm:^2.0.1": version: 2.0.6 resolution: "copy-anything@npm:2.0.6" @@ -10615,16 +11186,6 @@ __metadata: languageName: node linkType: hard -"cors@npm:~2.8.5": - version: 2.8.5 - resolution: "cors@npm:2.8.5" - dependencies: - object-assign: ^4 - vary: ^1 - checksum: ced838404ccd184f61ab4fdc5847035b681c90db7ac17e428f3d81d69e2989d2b680cc254da0e2554f5ed4f8a341820a1ce3d1c16b499f6e2f47a1b9b07b5006 - languageName: node - linkType: hard - "corser@npm:^2.0.1": version: 2.0.1 resolution: "corser@npm:2.0.1" @@ -11107,6 +11668,13 @@ __metadata: languageName: node linkType: hard +"custom-error-instance@npm:2.1.1": + version: 2.1.1 + resolution: "custom-error-instance@npm:2.1.1" + checksum: db01483864c9f4356b720b443a1f9b374758745a75199187a0ccc12505cf822bc801a0d8e3f96d727559880024f40e09667d5c08e5de0bff243c6b5ae0bd303c + languageName: node + linkType: hard + "custom-idle-queue@npm:3.0.1": version: 3.0.1 resolution: "custom-idle-queue@npm:3.0.1" @@ -11565,18 +12133,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.2": - version: 4.3.2 - resolution: "debug@npm:4.3.2" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 820ea160e267e23c953c9ed87e7ad93494d8cda2f7349af5e7e3bb236d23707ee3022f477d5a7d2ee86ef2bf7d60aa9ab22d1f58080d7deb9dccd073585e1e43 - languageName: node - linkType: hard - "debug@npm:^3.1.0, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -11752,13 +12308,6 @@ __metadata: languageName: node linkType: hard -"destroy@npm:~1.0.4": - version: 1.0.4 - resolution: "destroy@npm:1.0.4" - checksum: da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03 - languageName: node - linkType: hard - "detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": version: 2.0.2 resolution: "detect-libc@npm:2.0.2" @@ -11793,15 +12342,6 @@ __metadata: languageName: node linkType: hard -"dev-ip@npm:^1.0.1": - version: 1.0.1 - resolution: "dev-ip@npm:1.0.1" - bin: - dev-ip: lib/dev-ip.js - checksum: 274a6470c2143e4cdcb2b27e0bea137dbc2b42667eb59c890e703185054cb2bcaf2d8533e7ad2f532fe551a90542abc6b37053e8d73918a4fcfb7ffd76589620 - languageName: node - linkType: hard - "devtools-protocol@npm:0.0.1019158": version: 0.0.1019158 resolution: "devtools-protocol@npm:0.0.1019158" @@ -11983,24 +12523,6 @@ __metadata: languageName: node linkType: hard -"easy-extender@npm:^2.3.4": - version: 2.3.4 - resolution: "easy-extender@npm:2.3.4" - dependencies: - lodash: ^4.17.10 - checksum: beaca0611fbf661ec3b7405d23ee27894ed00225d7a01c02aecf1a40e9ac751f1364f0627c01f2fca66420adc328b21bb6e113c5c9771c89ff5ecb7e050e897e - languageName: node - linkType: hard - -"eazy-logger@npm:^4.0.1": - version: 4.0.1 - resolution: "eazy-logger@npm:4.0.1" - dependencies: - chalk: 4.1.2 - checksum: 2005f4676c29675facfce4143ce56f6560721ea60c770167138d2aa4bb27f3713ef76b0370fe1c093d76f71e4344b916a80d07e6f61ccd8dabf0afae5ad92735 - languageName: node - linkType: hard - "ecc-jsbn@npm:~0.1.1": version: 0.1.2 resolution: "ecc-jsbn@npm:0.1.2" @@ -12080,7 +12602,7 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~1.0.1, encodeurl@npm:~1.0.2": +"encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c @@ -12125,24 +12647,6 @@ __metadata: languageName: node linkType: hard -"engine.io@npm:~6.5.2": - version: 6.5.4 - resolution: "engine.io@npm:6.5.4" - dependencies: - "@types/cookie": ^0.4.1 - "@types/cors": ^2.8.12 - "@types/node": ">=10.0.0" - accepts: ~1.3.4 - base64id: 2.0.0 - cookie: ~0.4.1 - cors: ~2.8.5 - debug: ~4.3.1 - engine.io-parser: ~5.2.1 - ws: ~8.11.0 - checksum: d5b55cbac718c5b1c10800314379923f8c7ef9e3a8a60c6827ed86303d1154b81d354a89fdecf4cbb773515c82c84a98d3c791ff88279393b53625dd67299d30 - languageName: node - linkType: hard - "enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.7.0": version: 5.15.0 resolution: "enhanced-resolve@npm:5.15.0" @@ -12288,12 +12792,12 @@ __metadata: languageName: node linkType: hard -"esbuild-wasm@npm:0.19.5, esbuild-wasm@npm:^0.19.5": - version: 0.19.5 - resolution: "esbuild-wasm@npm:0.19.5" +"esbuild-wasm@npm:0.19.8": + version: 0.19.8 + resolution: "esbuild-wasm@npm:0.19.8" bin: esbuild: bin/esbuild - checksum: 175e9a7c8c62bf1fc2341cadb55a6095d0c49af66539b0a27d4df2b9d9b34edfbe4ae35cb5c0131ee1b8e8e7f2c8a2e8ebcd578c4c9dbd831d79c1d33a28905e + checksum: 160c9f810c07f790b166bc21fbdd01fc1d928987c8902a274c513a1b0772cff684bade64a6e879d8ff167d1c64ad9a211639daabe79291dc598cbd8f9a275761 languageName: node linkType: hard @@ -12306,32 +12810,41 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.19.5": +"esbuild-wasm@npm:^0.19.5": version: 0.19.5 - resolution: "esbuild@npm:0.19.5" - dependencies: - "@esbuild/android-arm": 0.19.5 - "@esbuild/android-arm64": 0.19.5 - "@esbuild/android-x64": 0.19.5 - "@esbuild/darwin-arm64": 0.19.5 - "@esbuild/darwin-x64": 0.19.5 - "@esbuild/freebsd-arm64": 0.19.5 - "@esbuild/freebsd-x64": 0.19.5 - "@esbuild/linux-arm": 0.19.5 - "@esbuild/linux-arm64": 0.19.5 - "@esbuild/linux-ia32": 0.19.5 - "@esbuild/linux-loong64": 0.19.5 - "@esbuild/linux-mips64el": 0.19.5 - "@esbuild/linux-ppc64": 0.19.5 - "@esbuild/linux-riscv64": 0.19.5 - "@esbuild/linux-s390x": 0.19.5 - "@esbuild/linux-x64": 0.19.5 - "@esbuild/netbsd-x64": 0.19.5 - "@esbuild/openbsd-x64": 0.19.5 - "@esbuild/sunos-x64": 0.19.5 - "@esbuild/win32-arm64": 0.19.5 - "@esbuild/win32-ia32": 0.19.5 - "@esbuild/win32-x64": 0.19.5 + resolution: "esbuild-wasm@npm:0.19.5" + bin: + esbuild: bin/esbuild + checksum: 175e9a7c8c62bf1fc2341cadb55a6095d0c49af66539b0a27d4df2b9d9b34edfbe4ae35cb5c0131ee1b8e8e7f2c8a2e8ebcd578c4c9dbd831d79c1d33a28905e + languageName: node + linkType: hard + +"esbuild@npm:0.19.8": + version: 0.19.8 + resolution: "esbuild@npm:0.19.8" + dependencies: + "@esbuild/android-arm": 0.19.8 + "@esbuild/android-arm64": 0.19.8 + "@esbuild/android-x64": 0.19.8 + "@esbuild/darwin-arm64": 0.19.8 + "@esbuild/darwin-x64": 0.19.8 + "@esbuild/freebsd-arm64": 0.19.8 + "@esbuild/freebsd-x64": 0.19.8 + "@esbuild/linux-arm": 0.19.8 + "@esbuild/linux-arm64": 0.19.8 + "@esbuild/linux-ia32": 0.19.8 + "@esbuild/linux-loong64": 0.19.8 + "@esbuild/linux-mips64el": 0.19.8 + "@esbuild/linux-ppc64": 0.19.8 + "@esbuild/linux-riscv64": 0.19.8 + "@esbuild/linux-s390x": 0.19.8 + "@esbuild/linux-x64": 0.19.8 + "@esbuild/netbsd-x64": 0.19.8 + "@esbuild/openbsd-x64": 0.19.8 + "@esbuild/sunos-x64": 0.19.8 + "@esbuild/win32-arm64": 0.19.8 + "@esbuild/win32-ia32": 0.19.8 + "@esbuild/win32-x64": 0.19.8 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -12379,7 +12892,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 5a0227cf6ffffa3076714d88230af1dfdd2fc363d91bd712a81fb91230c315a395e2c9b7588eee62986aeebf4999804b9b1b59eeab8e2457184eb0056bfe20c8 + checksum: 1dff99482ecbfcc642ec66c71e4dc5c73ce6aef68e8158a4937890b570e86a95959ac47e0f14785ba70df5a673ae4289df88a162e9759b02367ed28074cee8ba languageName: node linkType: hard @@ -12460,32 +12973,32 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.10": - version: 0.18.20 - resolution: "esbuild@npm:0.18.20" - dependencies: - "@esbuild/android-arm": 0.18.20 - "@esbuild/android-arm64": 0.18.20 - "@esbuild/android-x64": 0.18.20 - "@esbuild/darwin-arm64": 0.18.20 - "@esbuild/darwin-x64": 0.18.20 - "@esbuild/freebsd-arm64": 0.18.20 - "@esbuild/freebsd-x64": 0.18.20 - "@esbuild/linux-arm": 0.18.20 - "@esbuild/linux-arm64": 0.18.20 - "@esbuild/linux-ia32": 0.18.20 - "@esbuild/linux-loong64": 0.18.20 - "@esbuild/linux-mips64el": 0.18.20 - "@esbuild/linux-ppc64": 0.18.20 - "@esbuild/linux-riscv64": 0.18.20 - "@esbuild/linux-s390x": 0.18.20 - "@esbuild/linux-x64": 0.18.20 - "@esbuild/netbsd-x64": 0.18.20 - "@esbuild/openbsd-x64": 0.18.20 - "@esbuild/sunos-x64": 0.18.20 - "@esbuild/win32-arm64": 0.18.20 - "@esbuild/win32-ia32": 0.18.20 - "@esbuild/win32-x64": 0.18.20 +"esbuild@npm:^0.19.3": + version: 0.19.9 + resolution: "esbuild@npm:0.19.9" + dependencies: + "@esbuild/android-arm": 0.19.9 + "@esbuild/android-arm64": 0.19.9 + "@esbuild/android-x64": 0.19.9 + "@esbuild/darwin-arm64": 0.19.9 + "@esbuild/darwin-x64": 0.19.9 + "@esbuild/freebsd-arm64": 0.19.9 + "@esbuild/freebsd-x64": 0.19.9 + "@esbuild/linux-arm": 0.19.9 + "@esbuild/linux-arm64": 0.19.9 + "@esbuild/linux-ia32": 0.19.9 + "@esbuild/linux-loong64": 0.19.9 + "@esbuild/linux-mips64el": 0.19.9 + "@esbuild/linux-ppc64": 0.19.9 + "@esbuild/linux-riscv64": 0.19.9 + "@esbuild/linux-s390x": 0.19.9 + "@esbuild/linux-x64": 0.19.9 + "@esbuild/netbsd-x64": 0.19.9 + "@esbuild/openbsd-x64": 0.19.9 + "@esbuild/sunos-x64": 0.19.9 + "@esbuild/win32-arm64": 0.19.9 + "@esbuild/win32-ia32": 0.19.9 + "@esbuild/win32-x64": 0.19.9 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -12533,7 +13046,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 5d253614e50cdb6ec22095afd0c414f15688e7278a7eb4f3720a6dd1306b0909cf431e7b9437a90d065a31b1c57be60130f63fe3e8d0083b588571f31ee6ec7b + checksum: 30a510de26068515693f2238d7e9697c68eb7ea3431fb31e6b5797dff576663c79e7c5076a8a227b4011c8050967655af2ab5775c2bffc554a62641bbb742e91 languageName: node linkType: hard @@ -12777,7 +13290,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:1.8.1, etag@npm:^1.8.1, etag@npm:~1.8.1": +"etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -13054,29 +13567,29 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.1, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" +"fast-glob@npm:3.3.2, fast-glob@npm:^3.3.1": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" 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 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 languageName: node linkType: hard -"fast-glob@npm:^3.3.1": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" 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 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 languageName: node linkType: hard @@ -13197,21 +13710,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.1.0": - version: 1.1.0 - resolution: "finalhandler@npm:1.1.0" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.1 - escape-html: ~1.0.3 - on-finished: ~2.3.0 - parseurl: ~1.3.2 - statuses: ~1.3.1 - unpipe: ~1.0.0 - checksum: fb22b420315378b5c5d8a3a96f50c16a3ba3cc56b1ffa0bc65be63de978d08dc255002e4348663a6b2813e3ec6c930b1f1387aa3a0545d9bf4727b0f90a83ff2 - languageName: node - linkType: hard - "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -13349,16 +13847,6 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 - languageName: node - linkType: hard - "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -13471,28 +13959,17 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2, fresh@npm:^0.5.2": +"fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 languageName: node linkType: hard -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d - languageName: node - linkType: hard - -"fs-extra@npm:3.0.1": - version: 3.0.1 - resolution: "fs-extra@npm:3.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^3.0.0 - universalify: ^0.1.0 - checksum: 8957f9ee33a032b12f786158077dbd2a6b3b843449b36ce37bb3922200bbf12f0412aaebe10e3ce3e46e1f0dd37904e4053b4cfa2a717c80eca3af6dc840ba8b +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d languageName: node linkType: hard @@ -13562,7 +14039,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -13572,7 +14049,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -14454,13 +14931,6 @@ __metadata: languageName: node linkType: hard -"immutable@npm:^3": - version: 3.8.2 - resolution: "immutable@npm:3.8.2" - checksum: 41909b386950ff84ca3cfca77c74cfc87d225a914e98e6c57996fa81a328da61a7c32216d6d5abad40f54747ffdc5c4b02b102e6ad1a504c1752efde8041f964 - languageName: node - linkType: hard - "immutable@npm:^4.0.0": version: 4.3.4 resolution: "immutable@npm:4.3.4" @@ -14572,11 +15042,11 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:9.2.11": - version: 9.2.11 - resolution: "inquirer@npm:9.2.11" +"inquirer@npm:9.2.12": + version: 9.2.12 + resolution: "inquirer@npm:9.2.12" dependencies: - "@ljharb/through": ^2.3.9 + "@ljharb/through": ^2.3.11 ansi-escapes: ^4.3.2 chalk: ^5.3.0 cli-cursor: ^3.1.0 @@ -14591,7 +15061,7 @@ __metadata: string-width: ^4.2.3 strip-ansi: ^6.0.1 wrap-ansi: ^6.2.0 - checksum: af59b422eb6005dac90f6c5e8295013d0611ac5471ff4fbf4ad3e228136e0f41db73af2d5a68e36770f9e31ac203ae1589d35c3e970acbc6110bb5df905928f9 + checksum: 8c372832367f5adb4bb08a0c3ee3b8b16e83202c125d1a681ece2c0ef2f00a5d7d6589a501fd58a0249b4ad49a8013584ac58ae12a20d29b1c24a0ec450927a5 languageName: node linkType: hard @@ -14807,12 +15277,10 @@ __metadata: languageName: node linkType: hard -"is-number-like@npm:^1.0.3": - version: 1.0.8 - resolution: "is-number-like@npm:1.0.8" - dependencies: - lodash.isfinite: ^3.3.2 - checksum: cfba928570a4e7d44a9ed9493986091c0d21dfbeb9bbe4cd92785d7a9c8bd4e5f66fc8837b59e793244f0b1bd742b3e4605e85bdcdcc9279a0382163e2174510 +"is-network-error@npm:^1.0.0": + version: 1.0.0 + resolution: "is-network-error@npm:1.0.0" + checksum: 2ca2b4b2d420015e0237abe28ebf316fcd26a82304b07432abf155759a3bee6895609ac91e692a72ad61b7fc902c3283b2dece61e1ddb05a6257777a8573e468 languageName: node linkType: hard @@ -14935,13 +15403,6 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^1.1.0": - version: 1.1.0 - resolution: "is-wsl@npm:1.1.0" - checksum: ea157d232351e68c92bd62fc541771096942fe72f69dff452dd26dcc31466258c570a3b04b8cda2e01cd2968255b02951b8670d08ea4ed76d6b1a646061ac4fe - languageName: node - linkType: hard - "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -15686,7 +16147,7 @@ __metadata: languageName: node linkType: hard -"js-base64@npm:3.7.5": +"js-base64@npm:3.7.5, js-base64@npm:^3.7.2": version: 3.7.5 resolution: "js-base64@npm:3.7.5" checksum: 67a78c8b1c47b73f1c6fba1957e9fe6fd9dc78ac93ac46cc2e43472dcb9cf150d126fb0e593192e88e0497354fa634d17d255add7cc6ee3c7b4d29870faa8e18 @@ -15883,18 +16344,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^3.0.0": - version: 3.0.1 - resolution: "jsonfile@npm:3.0.1" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: f2935da339462fe6489c3b8961b637e4eeebd42bcbbe1c8d88f4e937fe19d2d9bc222167281ada2e2f6ddc0324edb43b18107a9b12c743b350326d83ba4db5ef - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -16145,13 +16594,6 @@ __metadata: languageName: node linkType: hard -"limiter@npm:^1.0.5": - version: 1.1.5 - resolution: "limiter@npm:1.1.5" - checksum: 2d51d3a8bef131aada820b76530f8223380a0079aa0fffdfd3ec47ac2f65763225cb4c62a2f22347f4898c5eeb248edfec991c4a4f5b608dfca0aaa37ac48071 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -16251,20 +16693,6 @@ __metadata: languageName: node linkType: hard -"localtunnel@npm:^2.0.1": - version: 2.0.2 - resolution: "localtunnel@npm:2.0.2" - dependencies: - axios: 0.21.4 - debug: 4.3.2 - openurl: 1.1.1 - yargs: 17.1.1 - bin: - lt: bin/lt.js - checksum: 181452d945a915d68c5c6e6ff5c7375f970dcbbe39d854ac8533c893bd133a3f5afd358ecd63ac84947319073a75e880552441c88380cb14446a67018209f0f1 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -16292,6 +16720,55 @@ __metadata: languageName: node linkType: hard +"lodash._baseiteratee@npm:~4.7.0": + version: 4.7.0 + resolution: "lodash._baseiteratee@npm:4.7.0" + dependencies: + lodash._stringtopath: ~4.8.0 + checksum: 814a7125b9e2fa7e436c4402eae842a200189e2839b56bd6cde7cd0a3628b60842f5d39a9f5dceaf8766669b2e4a17a36ce2a213d1d6a891c1bef8a6bda36ea9 + languageName: node + linkType: hard + +"lodash._basetostring@npm:~4.12.0": + version: 4.12.0 + resolution: "lodash._basetostring@npm:4.12.0" + checksum: ccaf83827f86be5c9daeb7b939f761d6a43f0de0781bc3b6772fcb8568fbcbfa1e1082c66e5e12dd23e00ac40a18349c5a793a6a552e3574cbbcb3e1545fcb4c + languageName: node + linkType: hard + +"lodash._baseuniq@npm:~4.6.0": + version: 4.6.0 + resolution: "lodash._baseuniq@npm:4.6.0" + dependencies: + lodash._createset: ~4.0.0 + lodash._root: ~3.0.0 + checksum: 8c16fe2e80716b18c2f28bbcc902768141d432b0b98e03b30a2fba6a097377fabdc8753da232568375d2aa9502dc6b3a390200aa1467d2f685a582a46a271936 + languageName: node + linkType: hard + +"lodash._createset@npm:~4.0.0": + version: 4.0.3 + resolution: "lodash._createset@npm:4.0.3" + checksum: fb4450fbf4846aa7b420837ee44400b88664e28499388b7e04b4db38adca1305915f68a245fb2a87e031e7f440b997de4f360de6dea2712952520e97c7898de1 + languageName: node + linkType: hard + +"lodash._root@npm:~3.0.0": + version: 3.0.1 + resolution: "lodash._root@npm:3.0.1" + checksum: 3e12c6f409ae13164a8db358f44a691f1e038dad4e25463802980d0ed641ed118c147b65657501c51778c885422b913264dfbe33ec0c5d676443dd630a7e685a + languageName: node + linkType: hard + +"lodash._stringtopath@npm:~4.8.0": + version: 4.8.0 + resolution: "lodash._stringtopath@npm:4.8.0" + dependencies: + lodash._basetostring: ~4.12.0 + checksum: 00663b317796333e6315ebb4e8b590e68845de10d5d25c7585751fd9d28adf3e60e1ce85a6fbb6a0d440447c841465b91877e761239e358231eed2f52f0a5472 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -16327,13 +16804,6 @@ __metadata: languageName: node linkType: hard -"lodash.isfinite@npm:^3.3.2": - version: 3.3.2 - resolution: "lodash.isfinite@npm:3.3.2" - checksum: 5e9f9c27fdcdb940f7d4bd3546f584502448004825ce42dc6c40cbee6a3de73d825f9aced3f5b50ff0f613b8dcb1b985fe6e29d172522d1d7975d3f8d02cef86 - languageName: node - linkType: hard - "lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -16355,6 +16825,13 @@ __metadata: languageName: node linkType: hard +"lodash.throttle@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.throttle@npm:4.1.1" + checksum: 129c0a28cee48b348aef146f638ef8a8b197944d4e9ec26c1890c19d9bf5a5690fe11b655c77a4551268819b32d27f4206343e30c78961f60b561b8608c8c805 + languageName: node + linkType: hard + "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" @@ -16362,7 +16839,17 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.10, lodash@npm:^4.17.14, lodash@npm:^4.17.21": +"lodash.uniqby@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.uniqby@npm:4.5.0" + dependencies: + lodash._baseiteratee: ~4.7.0 + lodash._baseuniq: ~4.6.0 + checksum: 40a4fdd4c31323fcb6db91ec3124020333212ca1f13e75cc9939decdd33e8b176d204fb277be36a51a855c2c90e14d67932b3b130b2f0eedc729e4cb9cdcaed1 + languageName: node + linkType: hard + +"lodash@npm:^4.17.14, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -16704,15 +17191,6 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.4.1": - version: 1.4.1 - resolution: "mime@npm:1.4.1" - bin: - mime: cli.js - checksum: 14c9de5c801ddad82619b66049f3314bbced9667689eed769fab64a323e79b3535ab650e9607670e52371b16436a49af3c0473d965ec743de931cb5d73d3adba - languageName: node - linkType: hard - "mime@npm:1.6.0, mime@npm:^1.4.1, mime@npm:^1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -16797,7 +17275,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -16957,13 +17435,6 @@ __metadata: languageName: node linkType: hard -"mitt@npm:^1.1.3": - version: 1.2.0 - resolution: "mitt@npm:1.2.0" - checksum: 53abb94c6203250e2498e152ae096288c4866c6aab1dc093922084a7414af4aa6cda5a51d480267a8f0bd7908b0e896099bc953317aca8a18672dc67ee7e923d - languageName: node - linkType: hard - "mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -17139,6 +17610,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + languageName: node + linkType: hard + "nanoid@npm:^4.0.0": version: 4.0.2 resolution: "nanoid@npm:4.0.2" @@ -17816,7 +18296,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4, object-assign@npm:^4.0.1": +"object-assign@npm:^4.0.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -17884,15 +18364,6 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: 1.1.1 - checksum: 1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b - languageName: node - linkType: hard - "on-headers@npm:~1.0.2": version: 1.0.2 resolution: "on-headers@npm:1.0.2" @@ -17956,22 +18427,6 @@ __metadata: languageName: node linkType: hard -"openurl@npm:1.1.1": - version: 1.1.1 - resolution: "openurl@npm:1.1.1" - checksum: c90f2f065bc5950f1402aff67a3ce4b5fb0e4475cb07b5ff84247686f7436fbc5bc2d0e38bda4ebc9cf8aea866788424e07f25a68f7e97502d412527964351a9 - languageName: node - linkType: hard - -"opn@npm:5.3.0": - version: 5.3.0 - resolution: "opn@npm:5.3.0" - dependencies: - is-wsl: ^1.1.0 - checksum: 7f8620c47a213c1e0ddea97a238be9cc35df99480bc43f165165e06c03867fdeea352b455af585ba7a7a788c0c5c934d04926d94ae54dddff30e7e4290b488bc - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -18133,6 +18588,17 @@ __metadata: languageName: node linkType: hard +"p-retry@npm:^6.1.0": + version: 6.1.0 + resolution: "p-retry@npm:6.1.0" + dependencies: + "@types/retry": 0.12.2 + is-network-error: ^1.0.0 + retry: ^0.13.1 + checksum: 1083b2b72672205680f8a736583e31dce5d4ae472996cd06f4a33cd7ea11798d7712c202d253eb8afbdc80abf52f049651989c59f2e2ccca529e6b64d722b1f7 + languageName: node + linkType: hard + "p-timeout@npm:^3.2.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" @@ -18156,9 +18622,9 @@ __metadata: languageName: node linkType: hard -"pacote@npm:17.0.4": - version: 17.0.4 - resolution: "pacote@npm:17.0.4" +"pacote@npm:17.0.5": + version: 17.0.5 + resolution: "pacote@npm:17.0.5" dependencies: "@npmcli/git": ^5.0.0 "@npmcli/installed-package-contents": ^2.0.1 @@ -18180,7 +18646,7 @@ __metadata: tar: ^6.1.11 bin: pacote: lib/bin.js - checksum: 931968cfb513d5bb40fcae8b5350c18d9734a50a8e848254ce2723de0fbd0f55a17959240ba53ee8185987c84ba9d3f71af9a5e6106746b867dc1f1e191ee9ce + checksum: 9cc3f4e0bfa1508b61ee301e08165cc137b14da5574b0b235b3072ea79bfbe1cd0ee855a21b4eb4406dd8507eef7563c8450cd74a9616b7661e89391d10a8fb5 languageName: node linkType: hard @@ -18419,22 +18885,22 @@ __metadata: version: 0.0.0-use.local resolution: "picsa-apps@workspace:." dependencies: - "@angular-devkit/build-angular": 17.0.1 - "@angular-devkit/core": 17.0.1 - "@angular-devkit/schematics": 17.0.1 + "@angular-devkit/build-angular": 17.1.0-next.1 + "@angular-devkit/core": 17.1.0-next.1 + "@angular-devkit/schematics": 17.1.0-next.1 "@angular-eslint/eslint-plugin": 17.1.0 "@angular-eslint/eslint-plugin-template": 17.1.0 "@angular-eslint/template-parser": 17.1.0 "@angular/animations": 17.0.3 - "@angular/cdk": 17.0.1 - "@angular/cli": ~17.0.0 + "@angular/cdk": 17.0.3 + "@angular/cli": 17.1.0-next.1 "@angular/common": 17.0.3 "@angular/compiler": 17.0.3 - "@angular/compiler-cli": 17.0.3 + "@angular/compiler-cli": 17.1.0-next.1 "@angular/core": 17.0.3 "@angular/forms": 17.0.3 "@angular/language-service": 17.0.3 - "@angular/material": 17.0.1 + "@angular/material": 17.0.3 "@angular/platform-browser": 17.0.3 "@angular/platform-browser-dynamic": 17.0.3 "@angular/router": 17.0.3 @@ -18469,11 +18935,11 @@ __metadata: "@nx/web": 17.1.2 "@nx/workspace": 17.1.2 "@nxext/stencil": ^17.0.2 - "@schematics/angular": 17.0.1 + "@schematics/angular": 17.0.3 "@stencil/angular-output-target": ^0.7.1 "@stencil/core": 3.2.2 "@stencil/sass": ^3.0.2 - "@supabase/supabase-js": ^2.38.5 + "@supabase/supabase-js": ^2.39.0 "@swc-node/register": ~1.6.7 "@swc/core": ~1.3.85 "@types/c3": ^0.7.8 @@ -18494,6 +18960,7 @@ __metadata: "@uppy/drag-drop": ^3.0.3 "@uppy/progress-bar": ^3.0.4 "@uppy/status-bar": ^3.2.5 + "@uppy/tus": ^3.4.0 "@vendure/ngx-translate-extract": ^8 autoprefixer: ^10.4.0 c3: ^0.7.20 @@ -18558,7 +19025,7 @@ __metadata: save-svg-as-png: ^1.4.17 sharp: ^0.31.3 stacktrace-js: ^2.0.2 - supabase: ^1.113.2 + supabase: 1.115.4 tailwindcss: ^3.0.2 ts-jest: 29.1.1 ts-node: 10.9.1 @@ -18598,7 +19065,21 @@ __metadata: languageName: node linkType: hard -"piscina@npm:4.1.0, piscina@npm:^4.1.0": +"piscina@npm:4.2.0": + version: 4.2.0 + resolution: "piscina@npm:4.2.0" + dependencies: + hdr-histogram-js: ^2.0.1 + hdr-histogram-percentiles-obj: ^3.0.0 + nice-napi: ^1.0.2 + dependenciesMeta: + nice-napi: + optional: true + checksum: ce80db687586efebb89bf3e86b25cd6a0c7ba6bb8f6b773f470c8b924ea52d8569a72d868643be4d674ea46698c6e0e4584608ea6528defa0709b9314c4c864d + languageName: node + linkType: hard + +"piscina@npm:^4.1.0": version: 4.1.0 resolution: "piscina@npm:4.1.0" dependencies: @@ -18660,16 +19141,6 @@ __metadata: languageName: node linkType: hard -"portscanner@npm:2.2.0": - version: 2.2.0 - resolution: "portscanner@npm:2.2.0" - dependencies: - async: ^2.6.0 - is-number-like: ^1.0.3 - checksum: 5ca0b5bab4797327607a2979251057e476b2caf26dd17c7d628d059bd8962c23803a2b12ff2a72fca207dfb10563b158b915f6c38bc8319a4f351323266786c7 - languageName: node - linkType: hard - "postcss-calc@npm:^9.0.0": version: 9.0.1 resolution: "postcss-calc@npm:9.0.1" @@ -19153,14 +19624,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.31, postcss@npm:^8.4.27, postcss@npm:^8.4.31": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" +"postcss@npm:8.4.32, postcss@npm:^8.4.32": + version: 8.4.32 + resolution: "postcss@npm:8.4.32" dependencies: - nanoid: ^3.3.6 + nanoid: ^3.3.7 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea + checksum: 220d9d0bf5d65be7ed31006c523bfb11619461d296245c1231831f90150aeb4a31eab9983ac9c5c89759a3ca8b60b3e0d098574964e1691673c3ce5c494305ae languageName: node linkType: hard @@ -19175,6 +19646,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.31": + version: 8.4.31 + resolution: "postcss@npm:8.4.31" + dependencies: + nanoid: ^3.3.6 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea + languageName: node + linkType: hard + "preact@npm:^10.5.13": version: 10.19.2 resolution: "preact@npm:10.19.2" @@ -19300,6 +19782,17 @@ __metadata: languageName: node linkType: hard +"proper-lockfile@npm:^4.1.2": + version: 4.1.2 + resolution: "proper-lockfile@npm:4.1.2" + dependencies: + graceful-fs: ^4.2.4 + retry: ^0.12.0 + signal-exit: ^3.0.2 + checksum: 00078ee6a61c216a56a6140c7d2a98c6c733b3678503002dc073ab8beca5d50ca271de4c85fca13b9b8ee2ff546c36674d1850509b84a04a5d0363bcb8638939 + languageName: node + linkType: hard + "protobufjs@npm:^6.11.3": version: 6.11.4 resolution: "protobufjs@npm:6.11.4" @@ -19476,7 +19969,7 @@ __metadata: languageName: node linkType: hard -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.0, range-parser@npm:~1.2.1": +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 @@ -19495,18 +19988,6 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.3.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 - languageName: node - linkType: hard - "rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -19852,16 +20333,6 @@ __metadata: languageName: node linkType: hard -"resp-modifier@npm:6.0.2": - version: 6.0.2 - resolution: "resp-modifier@npm:6.0.2" - dependencies: - debug: ^2.2.0 - minimatch: ^3.0.2 - checksum: b8403e16e8489723f87c8ca35288a0c688479b64ec5d1829ec74ccf63fa93ae55e0cb02db2ccd75a3c7c7edb9e024e9b8a3810a30c9f5398bb97f745031d22c0 - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -19980,20 +20451,6 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^3.27.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 8bb20a39c8d91130825159c3823eccf4dc2295c9a0a5c4ed851a5bf2167dbf24d9a29f23461a54c955e5506395e6cc188eafc8ab0e20399d7489fb33793b184e - languageName: node - linkType: hard - "rollup@npm:^4.2.0": version: 4.4.1 resolution: "rollup@npm:4.4.1" @@ -20067,13 +20524,6 @@ __metadata: languageName: node linkType: hard -"rx@npm:4.1.0": - version: 4.1.0 - resolution: "rx@npm:4.1.0" - checksum: 64edd278f2e32361bdbaa44bd503e2d1caf1331cece2db87852925b4f58f407563d879ce9df0ac2a593b4588c552437e18bbd53ea361f0b3f2f274a7a5cc4c21 - languageName: node - linkType: hard - "rxdb@npm:^14.11.1": version: 14.17.0 resolution: "rxdb@npm:14.17.0" @@ -20357,27 +20807,6 @@ __metadata: languageName: node linkType: hard -"send@npm:0.16.2": - version: 0.16.2 - resolution: "send@npm:0.16.2" - 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.6.2 - mime: 1.4.1 - ms: 2.0.0 - on-finished: ~2.3.0 - range-parser: ~1.2.0 - statuses: ~1.4.0 - checksum: 54775ccc7ecc1ab5e7c8dd7576ce186d74c19f3adad70f0b583abb0ec33fbd6c13d59181fe2054bc21425814f23bad36120d78a99e1e86734b1f3694800700cf - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -20408,7 +20837,7 @@ __metadata: languageName: node linkType: hard -"serve-index@npm:1.9.1, serve-index@npm:^1.9.1": +"serve-index@npm:^1.9.1": version: 1.9.1 resolution: "serve-index@npm:1.9.1" dependencies: @@ -20423,18 +20852,6 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.13.2": - version: 1.13.2 - resolution: "serve-static@npm:1.13.2" - dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.2 - send: 0.16.2 - checksum: 19244f8744984205dc0d9c1f6327d4d13dd691401b9619096c71260c9cb0b8173328b5de1558336bf57884864a15f23949e22924f388a4813604fd768de9fd55 - languageName: node - linkType: hard - "serve-static@npm:1.15.0": version: 1.15.0 resolution: "serve-static@npm:1.15.0" @@ -20447,13 +20864,6 @@ __metadata: languageName: node linkType: hard -"server-destroy@npm:1.0.1": - version: 1.0.1 - resolution: "server-destroy@npm:1.0.1" - checksum: cbc19d4f92d25a0a34430c6a09faccbea77d1a69563560eefe883feb67c14c3fb3a1c5af1affae0e82d537886ea0f91d317e39e46b5d6425de3acf57a3ab13e3 - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -20681,16 +21091,7 @@ __metadata: languageName: node linkType: hard -"socket.io-adapter@npm:~2.5.2": - version: 2.5.2 - resolution: "socket.io-adapter@npm:2.5.2" - dependencies: - ws: ~8.11.0 - checksum: 481251c3547221e57eb5cb247d0b1a3cde4d152a4c1c9051cc887345a7770e59f3b47f1011cac4499e833f01fcfc301ed13c4ec6e72f7dbb48a476375a6344cd - languageName: node - linkType: hard - -"socket.io-client@npm:4.7.2, socket.io-client@npm:^4.4.1": +"socket.io-client@npm:4.7.2": version: 4.7.2 resolution: "socket.io-client@npm:4.7.2" dependencies: @@ -20712,21 +21113,6 @@ __metadata: languageName: node linkType: hard -"socket.io@npm:^4.4.1": - version: 4.7.2 - resolution: "socket.io@npm:4.7.2" - dependencies: - accepts: ~1.3.4 - base64id: ~2.0.0 - cors: ~2.8.5 - debug: ~4.3.2 - engine.io: ~6.5.2 - socket.io-adapter: ~2.5.2 - socket.io-parser: ~4.2.4 - checksum: 2dfac8983a75e100e889c3dafc83b21b75a9863d0d1ee79cdc60c4391d5d9dffcf3a86fc8deca7568032bc11c2572676335fd2e469c7982f40d19f1141d4b266 - languageName: node - linkType: hard - "sockjs@npm:^0.3.24": version: 0.3.24 resolution: "sockjs@npm:0.3.24" @@ -21035,32 +21421,6 @@ __metadata: languageName: node linkType: hard -"statuses@npm:~1.3.1": - version: 1.3.1 - resolution: "statuses@npm:1.3.1" - checksum: da573f84ee32303ccb06f51dc1fc2ef592f4837d2d3fde8a9d1440058c6ae05805bca7cd3567c7fb9d6c4455a546ed8582a4ec647c8ceeae1654be8cd77e5a24 - languageName: node - linkType: hard - -"statuses@npm:~1.4.0": - version: 1.4.0 - resolution: "statuses@npm:1.4.0" - checksum: a9e7fbd3bc4859643e183101ed074c877fb70fb2d32379320713e78106360ef0d41d31598e1345390cf4a003d108edecb9607eb466bfbc31ec808c13a527434f - languageName: node - linkType: hard - -"stream-throttle@npm:^0.1.3": - version: 0.1.3 - resolution: "stream-throttle@npm:0.1.3" - dependencies: - commander: ^2.2.0 - limiter: ^1.0.5 - bin: - throttleproxy: ./bin/throttleproxy.js - checksum: 93d870b37266e61753c2d0c1227cf4c7bef3562b0d018291b4ccc1fe7063041a04ec165f2dcfe6f1b9dfb749fecb58abd34377b10cd793277eff3a652695831b - languageName: node - linkType: hard - "string-argv@npm:0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -21265,9 +21625,9 @@ __metadata: languageName: node linkType: hard -"supabase@npm:^1.113.2": - version: 1.115.2 - resolution: "supabase@npm:1.115.2" +"supabase@npm:1.115.4": + version: 1.115.4 + resolution: "supabase@npm:1.115.4" dependencies: bin-links: ^4.0.1 https-proxy-agent: ^7.0.2 @@ -21275,7 +21635,7 @@ __metadata: tar: 6.2.0 bin: supabase: bin/supabase - checksum: 4257a406e5088d67435aea33d8b3e39d7c41b6f3ce4d6f6ef77dd11d6dbd067e19fd9169542d9913753cf6c76b52b9f082259ac375b2415dddb12417ce531f83 + checksum: 1456333e74d15420b2ad7ea0090a4e4687817d11b5ea4f3aaf341e8b7a9ed39b6bc883b0b57aa66e67ef658f06e57c5d8478fa911dcdf77fbbc85954c0c8d49d languageName: node linkType: hard @@ -21464,9 +21824,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:5.24.0": - version: 5.24.0 - resolution: "terser@npm:5.24.0" +"terser@npm:5.25.0": + version: 5.25.0 + resolution: "terser@npm:5.25.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -21474,7 +21834,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c + checksum: ddc5ba020060cea976105ea83f5832385297f5091198f10143c1224e35bbb4ad9dfc40ee95d51a8f1290d0a4c7910d66e0ecc4b596402e94ba829bfc58022151 languageName: node linkType: hard @@ -21821,6 +22181,21 @@ __metadata: languageName: node linkType: hard +"tus-js-client@npm:^3.0.0": + version: 3.1.1 + resolution: "tus-js-client@npm:3.1.1" + dependencies: + buffer-from: ^1.1.2 + combine-errors: ^3.0.3 + is-stream: ^2.0.0 + js-base64: ^3.7.2 + lodash.throttle: ^4.1.1 + proper-lockfile: ^4.1.2 + url-parse: ^1.5.7 + checksum: 7cb227b8d94e1f48a172f52c0cf8f0d58a7866211157788c6a8c9d7512550d21ef5ed13d074b8ffadbecc7e730273eca9f346d0ea4c89d9da60f351162a68d02 + languageName: node + linkType: hard + "tweetnacl@npm:1.0.3": version: 1.0.3 resolution: "tweetnacl@npm:1.0.3" @@ -21959,13 +22334,6 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.33": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: 4d481c720d523366d7762dc8a46a1b58967d979aacf786f9ceceb1cd767de069f64a4bdffb63956294f1c0696eb465ddb950f28ba90571709e33521b4bd75e07 - languageName: node - linkType: hard - "unbzip2-stream@npm:1.4.3": version: 1.4.3 resolution: "unbzip2-stream@npm:1.4.3" @@ -21976,19 +22344,12 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - -"undici@npm:5.27.2": - version: 5.27.2 - resolution: "undici@npm:5.27.2" +"undici@npm:6.0.1": + version: 6.0.1 + resolution: "undici@npm:6.0.1" dependencies: "@fastify/busboy": ^2.0.0 - checksum: 22bbdd763798700979986546d70072b67223189353d2a811efa9c6e44476161a0d1781ffe24115221f69a1b344b95d5926bd39a6eb760a2cd8804781cec0c5eb + checksum: a277fdff09ac9971cfb96912abd5e6f5d70e7373e2f4e6d5eee8e2f1f727eb67852d367a9edf445d20f9b5e721558ac511a6788ff84c81014045c2ef523418ed languageName: node linkType: hard @@ -22059,13 +22420,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff - languageName: node - linkType: hard - "universalify@npm:^0.2.0": version: 0.2.0 resolution: "universalify@npm:0.2.0" @@ -22145,7 +22499,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": +"url-parse@npm:^1.5.3, url-parse@npm:^1.5.7": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -22279,7 +22633,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b @@ -22297,16 +22651,16 @@ __metadata: languageName: node linkType: hard -"vite@npm:4.5.0": - version: 4.5.0 - resolution: "vite@npm:4.5.0" +"vite@npm:5.0.6": + version: 5.0.6 + resolution: "vite@npm:5.0.6" dependencies: - esbuild: ^0.18.10 - fsevents: ~2.3.2 - postcss: ^8.4.27 - rollup: ^3.27.1 + esbuild: ^0.19.3 + fsevents: ~2.3.3 + postcss: ^8.4.32 + rollup: ^4.2.0 peerDependencies: - "@types/node": ">= 14" + "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" @@ -22333,7 +22687,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 06f1a4c858e4dc4c04a10466f4ccacea30c5a9f8574e5ba3deb9d03fa20e80ca6797f02dad97a988da7cdef96238dbc69c3b6a538156585c74722d996223619e + checksum: 06d85f7d838d0cb2063c82c67974044f6b11e2914ac2cb395185509ecea85dcd5a9d3bd380b13f3c3494665b08b0793d1a03008372a10575f7619db003dbfc7e languageName: node linkType: hard @@ -23049,21 +23403,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.1.1": - version: 17.1.1 - resolution: "yargs@npm:17.1.1" - 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 - checksum: b05a9467937172e01a4af7a7ad4361a22ee510cd12d1d5a3ad3b4c2e57eb8c35ca94ee22e4bdfbb40fe693fbf8000771e41824f77f6b224f1496c57f20f192b6 - languageName: node - linkType: hard - "yargs@npm:17.7.2, yargs@npm:^17.2.1, yargs@npm:^17.3.1, yargs@npm:^17.5.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2"