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"