diff --git a/apps/time-tracker/src/app/app-routing.module.ts b/apps/time-tracker/src/app/app-routing.module.ts deleted file mode 100644 index c852292..0000000 --- a/apps/time-tracker/src/app/app-routing.module.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { importProvidersFrom, NgModule } from '@angular/core'; -import { RouterModule, Routes, TitleStrategy } from '@angular/router'; -import { CustomTitleStrategy } from './core/services/custom-title-strategy.service'; -import { OverviewComponent } from './pages/overview/overview.component'; -import { CalendarModule, DateAdapter } from 'angular-calendar'; -import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; - -const routes: Routes = [ - { - path: '', - title: 'Overview', - component: OverviewComponent, - }, - { - path: 'calendar', - title: 'Calendar', - providers: [ - importProvidersFrom( - CalendarModule.forRoot({ - provide: DateAdapter, - useFactory: adapterFactory, - }) - ), - ], - loadComponent: () => - import('./pages/calendar/calendar.component').then( - (mod) => mod.CalendarComponent - ), - }, - { - path: 'backup', - title: 'Import/Export Database', - loadComponent: () => - import('./pages/backup/backup.component').then( - (mod) => mod.BackupComponent - ), - }, - { - path: '**', - component: OverviewComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], - providers: [ - { - provide: TitleStrategy, - useClass: CustomTitleStrategy, - }, - ], -}) -export class AppRoutingModule {} diff --git a/apps/time-tracker/src/app/app.component.ts b/apps/time-tracker/src/app/app.component.ts index b101cda..cfe3c4c 100644 --- a/apps/time-tracker/src/app/app.component.ts +++ b/apps/time-tracker/src/app/app.component.ts @@ -1,12 +1,16 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { NavigationComponent } from './features/components/navigation/navigation.component'; @Component({ selector: 'tt-root', + standalone: true, template: `
`, changeDetection: ChangeDetectionStrategy.OnPush, + imports: [RouterOutlet, NavigationComponent], }) export class AppComponent {} diff --git a/apps/time-tracker/src/app/app.module.ts b/apps/time-tracker/src/app/app.module.ts deleted file mode 100644 index 0e1b665..0000000 --- a/apps/time-tracker/src/app/app.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; - -import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; -import { AppRoutingModule } from './app-routing.module'; -import { ServiceWorkerModule } from '@angular/service-worker'; -import { environment } from '../environments/environment'; -import { NavigationComponent } from './features/components/navigation/navigation.component'; -import { WorkTimeFormModule } from './features/components/work-time-form/work-time-form.module'; -import { initDB } from './core/services/database.service'; -import { MAT_SNACK_BAR_DEFAULT_OPTIONS } from '@angular/material/snack-bar'; - -@NgModule({ - declarations: [AppComponent], - imports: [ - AppRoutingModule, - BrowserAnimationsModule, - BrowserModule, - ServiceWorkerModule.register('ngsw-worker.js', { - enabled: environment.production, - // Register the ServiceWorker as soon as the application is stable - // or after 30 seconds (whichever comes first). - registrationStrategy: 'registerWhenStable:30000', - }), - NavigationComponent, - WorkTimeFormModule, - ], - providers: [ - { - provide: APP_INITIALIZER, - useFactory: () => initDB, - multi: true, - }, - { - provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, - useValue: { appearance: 'outline' }, - }, - { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/apps/time-tracker/src/app/app.routes.ts b/apps/time-tracker/src/app/app.routes.ts new file mode 100644 index 0000000..3fc413c --- /dev/null +++ b/apps/time-tracker/src/app/app.routes.ts @@ -0,0 +1,34 @@ +import { importProvidersFrom } from '@angular/core'; +import { Routes } from '@angular/router'; +import { CalendarModule, DateAdapter } from 'angular-calendar'; +import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; + +export const appRoutes: Routes = [ + { + path: '', + title: 'Overview', + loadComponent: () => import('./pages/overview/overview.component'), + }, + { + path: 'calendar', + title: 'Calendar', + providers: [ + importProvidersFrom( + CalendarModule.forRoot({ + provide: DateAdapter, + useFactory: adapterFactory, + }), + ), + ], + loadComponent: () => import('./pages/calendar/calendar.component'), + }, + { + path: 'backup', + title: 'Import/Export Database', + loadComponent: () => import('./pages/backup/backup.component'), + }, + { + path: '**', + loadComponent: () => import('./pages/overview/overview.component'), + }, +]; diff --git a/apps/time-tracker/src/app/apps/time-tracker/src/app/core/services/paginator.service.spec.ts b/apps/time-tracker/src/app/core/services/paginator.service.spec.ts similarity index 100% rename from apps/time-tracker/src/app/apps/time-tracker/src/app/core/services/paginator.service.spec.ts rename to apps/time-tracker/src/app/core/services/paginator.service.spec.ts diff --git a/apps/time-tracker/src/app/apps/time-tracker/src/app/core/services/paginator.service.ts b/apps/time-tracker/src/app/core/services/paginator.service.ts similarity index 100% rename from apps/time-tracker/src/app/apps/time-tracker/src/app/core/services/paginator.service.ts rename to apps/time-tracker/src/app/core/services/paginator.service.ts diff --git a/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.component.ts b/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.component.ts index 0b6dc40..52f9ea5 100644 --- a/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.component.ts +++ b/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.component.ts @@ -1,6 +1,18 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { + MAT_DIALOG_DATA, + MatDialogActions, + MatDialogClose, + MatDialogContent, + MatDialogRef, + MatDialogTitle, +} from '@angular/material/dialog'; import { WorkTime, WorkTimePartial, @@ -12,10 +24,53 @@ import { WorkTimeService } from '../../../core/services/work-time.service'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { addDays, subDays } from 'date-fns'; import { SettingsService } from '../../../core/services/settings.service'; +import { MatRadioButton, MatRadioGroup } from '@angular/material/radio'; +import { AsyncPipe, TitleCasePipe } from '@angular/common'; +import { + MatError, + MatFormField, + MatHint, + MatLabel, +} from '@angular/material/form-field'; +import { + MatDatepicker, + MatDatepickerInput, + MatDatepickerToggle, +} from '@angular/material/datepicker'; +import { MatIcon } from '@angular/material/icon'; +import { MatInput } from '@angular/material/input'; +import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatTooltip } from '@angular/material/tooltip'; +import { CdkTextareaAutosize } from '@angular/cdk/text-field'; @Component({ templateUrl: './work-time-form.component.html', + standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + AsyncPipe, + CdkTextareaAutosize, + MatButton, + MatDatepicker, + MatDatepickerInput, + MatDatepickerToggle, + MatDialogActions, + MatDialogClose, + MatDialogContent, + MatDialogTitle, + MatError, + MatFormField, + MatHint, + MatIcon, + MatIconButton, + MatInput, + MatLabel, + MatRadioButton, + MatRadioGroup, + MatTooltip, + ReactiveFormsModule, + TitleCasePipe, + ], }) export class WorkTimeFormComponent { private readonly workTimeService = inject(WorkTimeService); diff --git a/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.module.ts b/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.module.ts deleted file mode 100644 index 5e5f745..0000000 --- a/apps/time-tracker/src/app/features/components/work-time-form/work-time-form.module.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { NgModule } from '@angular/core'; -import { AsyncPipe, NgForOf, NgIf, TitleCasePipe } from '@angular/common'; -import { MatDateFnsModule } from '@angular/material-date-fns-adapter'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MAT_DATE_LOCALE } from '@angular/material/core'; -import { de } from 'date-fns/locale'; -import { WorkTimeFormComponent } from './work-time-form.component'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatRadioModule } from '@angular/material/radio'; - -@NgModule({ - imports: [ - ReactiveFormsModule, - MatDateFnsModule, - MatInputModule, - MatSelectModule, - MatDatepickerModule, - MatFormFieldModule, - MatDialogModule, - MatButtonModule, - MatIconModule, - MatTooltipModule, - MatRadioModule, - NgForOf, - TitleCasePipe, - AsyncPipe, - NgIf, - ], - providers: [ - [ - MatDatepickerModule, - { - provide: MAT_DATE_LOCALE, - useValue: de, - }, - ], - ], - exports: [WorkTimeFormComponent], - declarations: [WorkTimeFormComponent], -}) -export class WorkTimeFormModule {} diff --git a/apps/time-tracker/src/app/features/components/work-time-table/work-time-datasource.ts b/apps/time-tracker/src/app/features/components/work-time-table/work-time-datasource.ts index 46bca6c..38c4e1f 100644 --- a/apps/time-tracker/src/app/features/components/work-time-table/work-time-datasource.ts +++ b/apps/time-tracker/src/app/features/components/work-time-table/work-time-datasource.ts @@ -52,10 +52,10 @@ export class WorkTimeDataSource extends DataSource { return { date: workTime.date, effectiveTime: intervalToDuration({ - start: durationToDate( + start: timeToDate(workTime.pause), + end: durationToDate( calculateWorkDuration(workTime.start, workTime.end), ), - end: timeToDate(workTime.pause), }), startTime: workTime.start, endTime: workTime.end, diff --git a/apps/time-tracker/src/app/features/components/work-time-table/work-time-table.component.ts b/apps/time-tracker/src/app/features/components/work-time-table/work-time-table.component.ts index 52f64a6..5764e33 100644 --- a/apps/time-tracker/src/app/features/components/work-time-table/work-time-table.component.ts +++ b/apps/time-tracker/src/app/features/components/work-time-table/work-time-table.component.ts @@ -33,7 +33,7 @@ import { WorkTimeViewModel } from '../../interfaces/work-time.view-model'; import { toSignal } from '@angular/core/rxjs-interop'; import { WorkTimeDialogService } from '../../../core/services/dialog.service'; import { WorkTimeService } from '../../../core/services/work-time.service'; -import { PaginatorService } from '../../../apps/time-tracker/src/app/core/services/paginator.service'; +import { PaginatorService } from '../../../core/services/paginator.service'; @Component({ selector: 'tt-work-time-table', diff --git a/apps/time-tracker/src/app/pages/backup/backup.component.ts b/apps/time-tracker/src/app/pages/backup/backup.component.ts index 8f719a0..907fcbe 100644 --- a/apps/time-tracker/src/app/pages/backup/backup.component.ts +++ b/apps/time-tracker/src/app/pages/backup/backup.component.ts @@ -18,10 +18,7 @@ import exportFromJSON from 'export-from-json'; import { MatInputModule } from '@angular/material/input'; import { MatIconModule } from '@angular/material/icon'; import { WorkTime, WorkTimePartial } from '../../core/interfaces/work-time'; -import { - MatSnackBar, - MatSnackBarModule, -} from '@angular/material/snack-bar'; +import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar'; import { map } from 'rxjs/operators'; import { AsyncPipe } from '@angular/common'; @@ -33,16 +30,16 @@ interface ViewModel { @Component({ standalone: true, imports: [ + AsyncPipe, MatButtonModule, MatInputModule, MatIconModule, MatSnackBarModule, - AsyncPipe -], + ], templateUrl: './backup.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class BackupComponent { +export default class BackupComponent { private readonly snackbarService = inject(MatSnackBar); private readonly workTimeService = inject(WorkTimeService); @@ -54,17 +51,17 @@ export class BackupComponent { private readonly importSubject = new Subject(); private readonly fileName$: Observable = this.fileSubject.pipe( - map((file) => file?.name ?? '') + map((file) => file?.name ?? ''), ); private readonly disableImport$: Observable = this.fileSubject.pipe( map((file) => file == null), - startWith(true) + startWith(true), ); private readonly export$ = this.exportSubject.asObservable().pipe( switchMap(() => this.workTimeService.find()), - map((data) => this.export(data)) + map((data) => this.export(data)), ); private readonly import$ = zip([ @@ -79,20 +76,20 @@ export class BackupComponent { delete workTime.id; workTime.date = new Date(workTime.date); return this.workTimeService.insert(workTime); - }) - ) + }), + ), ), map((entries) => entries.length), tap((count) => { this.snackbarService.open(`Imported ${count} entries successfully`); - }) + }), ); readonly viewModel$: Observable = merge( this.fileName$.pipe(map((fileName) => ({ fileName }))), this.disableImport$.pipe(map((disableImport) => ({ disableImport }))), this.export$.pipe(map(() => ({}))), - this.import$.pipe(map(() => ({ fileName: '', disableImport: true }))) + this.import$.pipe(map(() => ({ fileName: '', disableImport: true }))), ).pipe( scan( (state: ViewModel, command: Partial) => { @@ -104,8 +101,8 @@ export class BackupComponent { { disableImport: true, fileName: '', - } - ) + }, + ), ); exportData() { diff --git a/apps/time-tracker/src/app/pages/calendar/calendar.component.ts b/apps/time-tracker/src/app/pages/calendar/calendar.component.ts index 60c8b3c..2ec9d37 100644 --- a/apps/time-tracker/src/app/pages/calendar/calendar.component.ts +++ b/apps/time-tracker/src/app/pages/calendar/calendar.component.ts @@ -53,33 +53,33 @@ const workTypeColors: Record = { CalendarWeekModule, MatButtonModule, MatButtonToggleModule, - MatIconModule -], + MatIconModule, + ], templateUrl: './calendar.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class CalendarComponent { +export default class CalendarComponent { private workTimeService = inject(WorkTimeService); viewDate: Date = new Date(); events$: Observable = fromPromise( - this.workTimeService.find() + this.workTimeService.find(), ).pipe( map((workTimes) => workTimes.map((workTime) => { return this.convertToEvent(workTime); - }) - ) + }), + ), ); private convertToEvent(workTime: WorkTimePartial): CalendarEvent { return { start: addMinutes( addHours(startOfDay(workTime.date), workTime.start.hours), - workTime.start.minutes + workTime.start.minutes, ), end: addMinutes( addHours(startOfDay(workTime.date), workTime.end.hours), - workTime.end.minutes + workTime.end.minutes, ), title: workTime.type === 'normal' || workTime.type === 'remote' @@ -87,7 +87,7 @@ export class CalendarComponent { calculateWorkDuration(workTime.start, workTime.end), { format: ['hours', 'minutes'], - } + }, ) : workTime.type.toUpperCase(), allDay: workTime.type !== 'normal' && workTime.type !== 'remote', diff --git a/apps/time-tracker/src/app/pages/overview/overview.component.ts b/apps/time-tracker/src/app/pages/overview/overview.component.ts index ac3f1c9..cb7aa1b 100644 --- a/apps/time-tracker/src/app/pages/overview/overview.component.ts +++ b/apps/time-tracker/src/app/pages/overview/overview.component.ts @@ -36,7 +36,7 @@ import { WorkTimeDialogService } from '../../core/services/dialog.service'; `, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class OverviewComponent { +export default class OverviewComponent { private readonly workTimeDialogService = inject(WorkTimeDialogService); private readonly workTimeService = inject(WorkTimeService); diff --git a/apps/time-tracker/src/app/utils/time.util.ts b/apps/time-tracker/src/app/utils/time.util.ts index eb214a4..ec2a520 100644 --- a/apps/time-tracker/src/app/utils/time.util.ts +++ b/apps/time-tracker/src/app/utils/time.util.ts @@ -1,14 +1,16 @@ import { Time } from '@angular/common'; import { Duration, + hoursToMilliseconds, intervalToDuration, lightFormat, minutesToHours, + minutesToMilliseconds, } from 'date-fns'; import { minutesInHour } from 'date-fns/constants'; -export function timeToDate(time: Time) { - return new Date(0, 0, 0, time.hours, time.minutes); +export function timeToDate({ hours, minutes }: Time) { + return new Date(hoursToMilliseconds(hours) + minutesToMilliseconds(minutes)); } export function durationToDate({ @@ -18,7 +20,15 @@ export function durationToDate({ months = 0, years = 0, }: Duration) { - return new Date(years, months, days, hours, minutes); + const date = new Date(0); + date.setFullYear( + date.getFullYear() + years, + date.getMonth() + months, + date.getDate() + days, + ); + date.setHours(date.getHours() + hours); + date.setMinutes(date.getMinutes() + minutes); + return date; } export function timeToString(time: Time) { diff --git a/apps/time-tracker/src/main.ts b/apps/time-tracker/src/main.ts index d9a2e7e..27ade38 100644 --- a/apps/time-tracker/src/main.ts +++ b/apps/time-tracker/src/main.ts @@ -1,13 +1,51 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; +import { APP_INITIALIZER, enableProdMode } from '@angular/core'; import { environment } from './environments/environment'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { provideRouter, TitleStrategy } from '@angular/router'; +import { appRoutes } from './app/app.routes'; +import { CustomTitleStrategy } from './app/core/services/custom-title-strategy.service'; +import { initDB } from './app/core/services/database.service'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; +import { MAT_SNACK_BAR_DEFAULT_OPTIONS } from '@angular/material/snack-bar'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideServiceWorker } from '@angular/service-worker'; +import { provideDateFnsAdapter } from '@angular/material-date-fns-adapter'; +import { MAT_DATE_LOCALE } from '@angular/material/core'; +import { de } from 'date-fns/locale'; if (environment.production) { enableProdMode(); } -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); +void bootstrapApplication(AppComponent, { + providers: [ + provideRouter(appRoutes), + provideAnimations(), + provideDateFnsAdapter(), + provideServiceWorker('ngsw-worker.js', { + enabled: environment.production, + // Register the ServiceWorker as soon as the application is stable + // or after 30 seconds (whichever comes first). + registrationStrategy: 'registerWhenStable:30000', + }), + { + provide: TitleStrategy, + useClass: CustomTitleStrategy, + }, + { + provide: APP_INITIALIZER, + useFactory: () => initDB, + multi: true, + }, + { + provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, + useValue: { appearance: 'outline' }, + }, + { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } }, + { + provide: MAT_DATE_LOCALE, + useValue: de, + }, + ], +}); diff --git a/package.json b/package.json index 12e8801..2500489 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "nx": "18.2.3", "postcss": "^8.4.35", "prettier": "^3.2.5", + "source-map-explorer": "^2.5.3", "tailwindcss": "^3.4.1", "ts-jest": "29.1.2", "ts-node": "10.9.2", @@ -76,4 +77,3 @@ "zx": "^7.1.1" } } - diff --git a/yarn.lock b/yarn.lock index a8ce372..47e2ed6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4816,6 +4816,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" @@ -5051,6 +5056,15 @@ cli-width@^4.1.0: resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" @@ -5779,7 +5793,7 @@ dotenv@~16.3.1: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz" integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -5802,7 +5816,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.7: +ejs@^3.1.5, ejs@^3.1.7: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== @@ -5990,7 +6004,7 @@ escalade@^3.1.1: resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== @@ -6814,6 +6828,13 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" @@ -7308,7 +7329,7 @@ is-what@^3.14.1: resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -8175,7 +8196,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.14, lodash@^4.17.21: +lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8470,7 +8491,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.6: +mkdirp@^0.5.1, mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -8887,6 +8908,14 @@ open@8.4.2, open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +open@^7.3.1: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.1: version "1.5.2" resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" @@ -9900,6 +9929,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rollup@^4.2.0: version "4.11.0" resolved "https://registry.npmjs.org/rollup/-/rollup-4.11.0.tgz" @@ -10247,6 +10283,24 @@ socks@^2.7.1: ip-address "^9.0.5" smart-buffer "^4.2.0" +source-map-explorer@^2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.3.tgz#33551b51e33b70f56d15e79083cdd4c43e583b69" + integrity sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg== + dependencies: + btoa "^1.2.1" + chalk "^4.1.0" + convert-source-map "^1.7.0" + ejs "^3.1.5" + escape-html "^1.0.3" + glob "^7.1.6" + gzip-size "^6.0.0" + lodash "^4.17.20" + open "^7.3.1" + source-map "^0.7.4" + temp "^0.9.4" + yargs "^16.2.0" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" @@ -10648,6 +10702,14 @@ tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" +temp@^0.9.4: + version "0.9.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== + dependencies: + mkdirp "^0.5.1" + rimraf "~2.6.2" + terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.3: version "5.3.10" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" @@ -11451,6 +11513,11 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" @@ -11464,6 +11531,19 @@ yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"