diff --git a/.eslintrc.json b/.eslintrc.json index 763d2dc..e35b85a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,7 @@ { "root": true, "ignorePatterns": ["**/*"], - "plugins": ["@nx"], + "plugins": ["import", "@nx"], "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], @@ -24,6 +24,24 @@ { "argsIgnorePattern": "^_" } + ], + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index" + ], + "newlines-between": "always", + "alphabetize": { + "order": "asc", + "caseInsensitive": true + } + } ] } }, diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/build.yaml similarity index 97% rename from .github/workflows/pipeline.yaml rename to .github/workflows/build.yaml index 74804dc..d2c0a06 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/build.yaml @@ -9,7 +9,7 @@ on: - main jobs: - lint_and_test: + build_job: runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index e62ac84..61c19d2 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ In case users have used multiple names, as appearing in the `git log`, use the ` { [...] "aliases": { - "jdoe": "John Doe", + "jdoe": "John Doe", "janedoe": "Jane Doe" } [...] diff --git a/apps/backend/src/express.ts b/apps/backend/src/express.ts index fc3d42c..7b6be8c 100644 --- a/apps/backend/src/express.ts +++ b/apps/backend/src/express.ts @@ -1,22 +1,24 @@ -import express from 'express'; -import path from 'path'; import fs from 'fs'; -import { calcCoupling } from './services/coupling'; +import path from 'path'; import { cwd } from 'process'; + +import express from 'express'; + +import { getCommitCount } from './infrastructure/git'; +import { Limits } from './model/limits'; +import { Options } from './options/options'; +import { calcChangeCoupling } from './services/change-coupling'; +import { calcCoupling } from './services/coupling'; import { inferFolders } from './services/folders'; -import { calcModuleInfo } from './services/module-info'; -import { calcTeamAlignment } from './services/team-alignment'; import { aggregateHotspots, ComplexityMetric, findHotspotFiles, HotspotCriteria, } from './services/hotspot'; -import { calcChangeCoupling } from './services/change-coupling'; -import { Options } from './options/options'; -import { Limits } from './model/limits'; import { isStale, updateLogCache } from './services/log-cache'; -import { getCommitCount } from './infrastructure/git'; +import { calcModuleInfo } from './services/module-info'; +import { calcTeamAlignment } from './services/team-alignment'; export function setupExpress(options: Options) { const app = express(); diff --git a/apps/backend/src/infrastructure/config.ts b/apps/backend/src/infrastructure/config.ts index 943cf52..f7724b9 100644 --- a/apps/backend/src/infrastructure/config.ts +++ b/apps/backend/src/infrastructure/config.ts @@ -1,8 +1,10 @@ +import fs from 'fs'; import path from 'path'; import { cwd } from 'process'; + import { Config } from '../model/config'; import { Options } from '../options/options'; -import fs from 'fs'; + import { DETECTIVE_DIR } from './paths'; const initConfig: Config = { diff --git a/apps/backend/src/infrastructure/deps.ts b/apps/backend/src/infrastructure/deps.ts index 11921e5..5cc2bf6 100644 --- a/apps/backend/src/infrastructure/deps.ts +++ b/apps/backend/src/infrastructure/deps.ts @@ -1,10 +1,13 @@ -import { Options } from '../options/options'; -import { Deps } from '../model/deps'; import fs from 'fs'; +import { cwd } from 'process'; + import { getProjectData } from '@softarc/sheriff-core'; import { globSync } from 'fast-glob'; + +import { Deps } from '../model/deps'; +import { Options } from '../options/options'; + import { loadConfig } from './config'; -import { cwd } from 'process'; const DEFAULT_ENTRIES = [ 'src/main.ts', diff --git a/apps/backend/src/infrastructure/git.ts b/apps/backend/src/infrastructure/git.ts index cb62114..3b92b0d 100644 --- a/apps/backend/src/infrastructure/git.ts +++ b/apps/backend/src/infrastructure/git.ts @@ -1,6 +1,7 @@ +import { spawn, spawnSync } from 'child_process'; import * as fs from 'fs'; + import { noLimits } from '../model/limits'; -import { spawn, spawnSync } from 'child_process'; export function isRepo(): boolean { return fs.existsSync('.git'); diff --git a/apps/backend/src/infrastructure/log.ts b/apps/backend/src/infrastructure/log.ts index 067854a..6d60a55 100644 --- a/apps/backend/src/infrastructure/log.ts +++ b/apps/backend/src/infrastructure/log.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; + import { DETECTIVE_DIR, LOG_FILE } from './paths'; const logFile = path.join(DETECTIVE_DIR, LOG_FILE); diff --git a/apps/backend/src/infrastructure/tree-hash.ts b/apps/backend/src/infrastructure/tree-hash.ts index 7118195..dd40f99 100644 --- a/apps/backend/src/infrastructure/tree-hash.ts +++ b/apps/backend/src/infrastructure/tree-hash.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; + import { DETECTIVE_DIR, HASH_FILE } from './paths'; const hashFile = path.join(DETECTIVE_DIR, HASH_FILE); diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 1bbda59..4780166 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -1,12 +1,12 @@ #!/usr/bin/env node -import { parseOptions } from './options/parse-options'; +import { setupExpress } from './express'; import { ensureConfig } from './infrastructure/config'; import { getEntryGlobs, inferDeps } from './infrastructure/deps'; import { isRepo } from './infrastructure/git'; -import { openSync } from './utils/open'; -import { setupExpress } from './express'; import { DETECTIVE_VERSION } from './infrastructure/version'; +import { parseOptions } from './options/parse-options'; +import { openSync } from './utils/open'; const options = parseOptions(process.argv.slice(2)); diff --git a/apps/backend/src/options/validate-options.ts b/apps/backend/src/options/validate-options.ts index 9daf376..7a375d0 100644 --- a/apps/backend/src/options/validate-options.ts +++ b/apps/backend/src/options/validate-options.ts @@ -1,6 +1,7 @@ -import { Options } from './options'; import fs from 'fs'; +import { Options } from './options'; + export function validateOptions(options: Options) { try { if (!fs.existsSync(options.sheriffDump)) { diff --git a/apps/backend/src/services/change-coupling.spec.ts b/apps/backend/src/services/change-coupling.spec.ts index 3e37d89..7164629 100644 --- a/apps/backend/src/services/change-coupling.spec.ts +++ b/apps/backend/src/services/change-coupling.spec.ts @@ -1,6 +1,7 @@ import { emptyConfig } from '../model/config'; import { Limits } from '../model/limits'; import { defaultOptions } from '../options/options'; + import { calcChangeCoupling } from './change-coupling'; const now = new Date(); diff --git a/apps/backend/src/services/coupling.spec.ts b/apps/backend/src/services/coupling.spec.ts index 6c17e63..373d30c 100644 --- a/apps/backend/src/services/coupling.spec.ts +++ b/apps/backend/src/services/coupling.spec.ts @@ -1,7 +1,8 @@ import { emptyConfig } from '../model/config'; +import { Deps } from '../model/deps'; import { defaultOptions } from '../options/options'; + import { calcCoupling } from './coupling'; -import { Deps } from '../model/deps'; const scopes = ['/booking', '/checkin', '/shared']; diff --git a/apps/backend/src/services/coupling.ts b/apps/backend/src/services/coupling.ts index b113bf1..28aebc9 100644 --- a/apps/backend/src/services/coupling.ts +++ b/apps/backend/src/services/coupling.ts @@ -1,11 +1,12 @@ -import { Deps } from '../model/deps'; -import { Options } from '../options/options'; import { loadConfig } from '../infrastructure/config'; import { loadDeps } from '../infrastructure/deps'; -import { calcModuleInfo, ModuleInfo } from './module-info'; -import { toPercent } from '../utils/to-percent'; +import { Deps } from '../model/deps'; +import { Options } from '../options/options'; import { getEmptyMatrix } from '../utils/matrix'; import { normalizeFolder } from '../utils/normalize-folder'; +import { toPercent } from '../utils/to-percent'; + +import { calcModuleInfo, ModuleInfo } from './module-info'; export type CouplingResult = { groups: string[]; diff --git a/apps/backend/src/services/folders.spec.ts b/apps/backend/src/services/folders.spec.ts index a1030c8..47786f9 100644 --- a/apps/backend/src/services/folders.spec.ts +++ b/apps/backend/src/services/folders.spec.ts @@ -1,7 +1,8 @@ import { emptyConfig } from '../model/config'; +import { Deps } from '../model/deps'; import { defaultOptions } from '../options/options'; + import { inferFolders } from './folders'; -import { Deps } from '../model/deps'; const scopes = ['/booking', '/checkin', '/shared']; diff --git a/apps/backend/src/services/folders.ts b/apps/backend/src/services/folders.ts index 20ca1e2..53eb7f0 100644 --- a/apps/backend/src/services/folders.ts +++ b/apps/backend/src/services/folders.ts @@ -1,5 +1,5 @@ -import { Options } from '../options/options'; import { loadDeps } from '../infrastructure/deps'; +import { Options } from '../options/options'; export type Folder = { name: string; diff --git a/apps/backend/src/services/hotspot.spec.ts b/apps/backend/src/services/hotspot.spec.ts index 061de72..743a5f5 100644 --- a/apps/backend/src/services/hotspot.spec.ts +++ b/apps/backend/src/services/hotspot.spec.ts @@ -1,6 +1,7 @@ import { emptyConfig } from '../model/config'; import { Limits } from '../model/limits'; import { defaultOptions } from '../options/options'; + import { aggregateHotspots, findHotspotFiles, diff --git a/apps/backend/src/services/hotspot.ts b/apps/backend/src/services/hotspot.ts index c5ae64c..212517f 100644 --- a/apps/backend/src/services/hotspot.ts +++ b/apps/backend/src/services/hotspot.ts @@ -1,15 +1,14 @@ -import path from 'path'; import * as fs from 'fs'; +import path from 'path'; -import { Options } from '../options/options'; -import { LogBodyEntry, parseGitLog, ParseOptions } from '../utils/git-parser'; import { loadConfig } from '../infrastructure/config'; -import { normalizeFolder, toDisplayFolder } from '../utils/normalize-folder'; +import { Filter } from '../model/config'; import { Limits } from '../model/limits'; - +import { Options } from '../options/options'; import { calcCyclomaticComplexity } from '../utils/complexity'; import { countLinesInFile } from '../utils/count-lines'; -import { Filter } from '../model/config'; +import { LogBodyEntry, parseGitLog, ParseOptions } from '../utils/git-parser'; +import { normalizeFolder, toDisplayFolder } from '../utils/normalize-folder'; export type ComplexityMetric = 'McCabe' | 'Length'; diff --git a/apps/backend/src/services/log-cache.ts b/apps/backend/src/services/log-cache.ts index fd49640..342d20d 100644 --- a/apps/backend/src/services/log-cache.ts +++ b/apps/backend/src/services/log-cache.ts @@ -1,6 +1,6 @@ -import { loadTreeHash, saveTreeHash } from '../infrastructure/tree-hash'; import { calcTreeHash, getGitLog } from '../infrastructure/git'; import { saveCachedLog } from '../infrastructure/log'; +import { loadTreeHash, saveTreeHash } from '../infrastructure/tree-hash'; import { DETECTIVE_VERSION } from '../infrastructure/version'; export function isStale(): boolean { diff --git a/apps/backend/src/services/team-alignment.spec.ts b/apps/backend/src/services/team-alignment.spec.ts index 8f7984f..1eb9224 100644 --- a/apps/backend/src/services/team-alignment.spec.ts +++ b/apps/backend/src/services/team-alignment.spec.ts @@ -1,6 +1,7 @@ import { emptyConfig } from '../model/config'; import { Limits } from '../model/limits'; import { defaultOptions, Options } from '../options/options'; + import { calcTeamAlignment } from './team-alignment'; const now = new Date(); diff --git a/apps/backend/src/utils/complexity.ts b/apps/backend/src/utils/complexity.ts index eb0307e..bd34ad9 100644 --- a/apps/backend/src/utils/complexity.ts +++ b/apps/backend/src/utils/complexity.ts @@ -1,6 +1,7 @@ -import * as ts from 'typescript'; import * as fs from 'fs'; +import * as ts from 'typescript'; + export function calcCyclomaticComplexity(fileName: string): number { const code = fs.readFileSync(fileName, 'utf-8'); return calcComplexityForCode(code); diff --git a/apps/backend/src/utils/git-parser.spec.ts b/apps/backend/src/utils/git-parser.spec.ts index 6e43698..002294a 100644 --- a/apps/backend/src/utils/git-parser.spec.ts +++ b/apps/backend/src/utils/git-parser.spec.ts @@ -1,7 +1,8 @@ +import { loadCachedLog } from '../infrastructure/log'; import { emptyConfig } from '../model/config'; -import { LogEntry, parseGitLog, ParseOptions } from './git-parser'; import { getToday, subtractMonths, subtractSeconds } from '../utils/date-utils'; -import { loadCachedLog } from '../infrastructure/log'; + +import { LogEntry, parseGitLog, ParseOptions } from './git-parser'; const today = getToday(); const past = subtractSeconds(subtractMonths(today, 1), 1); diff --git a/apps/backend/src/utils/git-parser.ts b/apps/backend/src/utils/git-parser.ts index 81bc2a1..29045ad 100644 --- a/apps/backend/src/utils/git-parser.ts +++ b/apps/backend/src/utils/git-parser.ts @@ -1,9 +1,11 @@ import * as path from 'path'; -import { Limits, noLimits } from '../model/limits'; + +import microMatch from 'micromatch'; + import { loadCachedLog } from '../infrastructure/log'; -import { getToday, subtractMonths } from '../utils/date-utils'; import { Filter } from '../model/config'; -import microMatch from 'micromatch'; +import { Limits, noLimits } from '../model/limits'; +import { getToday, subtractMonths } from '../utils/date-utils'; type State = 'header' | 'body' | 'skip'; diff --git a/apps/frontend/src/app/app.component.spec.ts b/apps/frontend/src/app/app.component.spec.ts deleted file mode 100644 index 0b49b7e..0000000 --- a/apps/frontend/src/app/app.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AppComponent], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have the 'frontend' title`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('frontend'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Hello, frontend' - ); - }); -}); diff --git a/apps/frontend/src/app/app.component.ts b/apps/frontend/src/app/app.component.ts index dad3731..2faacf0 100644 --- a/apps/frontend/src/app/app.component.ts +++ b/apps/frontend/src/app/app.component.ts @@ -1,7 +1,8 @@ import { Component, inject, OnInit } from '@angular/core'; import { RouterOutlet } from '@angular/router'; -import { NavComponent } from './shell/nav/nav.component'; + import { StatusStore } from './data/status.store'; +import { NavComponent } from './shell/nav/nav.component'; @Component({ selector: 'app-root', diff --git a/apps/frontend/src/app/app.config.ts b/apps/frontend/src/app/app.config.ts index 2df7036..96ca378 100644 --- a/apps/frontend/src/app/app.config.ts +++ b/apps/frontend/src/app/app.config.ts @@ -1,15 +1,14 @@ +import { provideHttpClient } from '@angular/common/http'; import { ApplicationConfig, importProvidersFrom, provideZoneChangeDetection, } from '@angular/core'; -import { provideRouter, withComponentInputBinding } from '@angular/router'; - import { MatDialogModule } from '@angular/material/dialog'; +import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; +import { provideRouter, withComponentInputBinding } from '@angular/router'; import { routes } from './app.routes'; -import { provideHttpClient } from '@angular/common/http'; -import { provideAnimationsAsync } from '@angular/platform-browser/animations/async'; import { AppErrorHandler, provideErrorHandler } from './utils/error-handler'; export const appConfig: ApplicationConfig = { diff --git a/apps/frontend/src/app/app.routes.ts b/apps/frontend/src/app/app.routes.ts index 0f4f430..51f15e9 100644 --- a/apps/frontend/src/app/app.routes.ts +++ b/apps/frontend/src/app/app.routes.ts @@ -1,10 +1,11 @@ -import { Routes, ActivatedRoute } from '@angular/router'; +import { Routes } from '@angular/router'; + import { CouplingComponent } from './features/coupling/coupling.component'; -import { GraphTypeData } from './model/graph-type'; -import { ensureCache } from './shell/cache.guard'; import { HotspotComponent } from './features/hotspot/hotspot.component'; import { TeamAlignmentComponent } from './features/team-alignment/team-alignment.component'; +import { GraphTypeData } from './model/graph-type'; import { AboutComponent } from './shell/about/about.component'; +import { ensureCache } from './shell/cache.guard'; export const routes: Routes = [ { diff --git a/apps/frontend/src/app/data/cache.service.ts b/apps/frontend/src/app/data/cache.service.ts index dd87c2f..58647c0 100644 --- a/apps/frontend/src/app/data/cache.service.ts +++ b/apps/frontend/src/app/data/cache.service.ts @@ -1,8 +1,9 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; -import { CacheStatus } from '../model/cache-status'; import { Observable } from 'rxjs'; +import { CacheStatus } from '../model/cache-status'; + @Injectable({ providedIn: 'root' }) export class CacheService { private http = inject(HttpClient); diff --git a/apps/frontend/src/app/data/config.service.ts b/apps/frontend/src/app/data/config.service.ts index 73f1ff9..c652ca3 100644 --- a/apps/frontend/src/app/data/config.service.ts +++ b/apps/frontend/src/app/data/config.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { Config } from '../model/config'; @Injectable({ providedIn: 'root' }) diff --git a/apps/frontend/src/app/data/coupling.service.ts b/apps/frontend/src/app/data/coupling.service.ts index b79dff8..15e40cb 100644 --- a/apps/frontend/src/app/data/coupling.service.ts +++ b/apps/frontend/src/app/data/coupling.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { CouplingResult } from '../model/coupling-result'; import { GraphType } from '../model/graph-type'; import { initLimits } from '../model/limits'; diff --git a/apps/frontend/src/app/data/folder.service.ts b/apps/frontend/src/app/data/folder.service.ts index 5e48d74..184ef70 100644 --- a/apps/frontend/src/app/data/folder.service.ts +++ b/apps/frontend/src/app/data/folder.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { Folder } from '../model/folder'; @Injectable({ providedIn: 'root' }) diff --git a/apps/frontend/src/app/data/hotspot.service.ts b/apps/frontend/src/app/data/hotspot.service.ts index 175e250..674380b 100644 --- a/apps/frontend/src/app/data/hotspot.service.ts +++ b/apps/frontend/src/app/data/hotspot.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { AggregatedHotspotsResult, HotspotCriteria, diff --git a/apps/frontend/src/app/data/module.service.ts b/apps/frontend/src/app/data/module.service.ts index fd9112b..770fb7f 100644 --- a/apps/frontend/src/app/data/module.service.ts +++ b/apps/frontend/src/app/data/module.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { ModuleInfo } from '../model/module-info'; @Injectable({ providedIn: 'root' }) diff --git a/apps/frontend/src/app/data/status.service.ts b/apps/frontend/src/app/data/status.service.ts index 602dfca..b4f9a38 100644 --- a/apps/frontend/src/app/data/status.service.ts +++ b/apps/frontend/src/app/data/status.service.ts @@ -1,6 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; + import { Status } from '../model/status'; @Injectable({ providedIn: 'root' }) diff --git a/apps/frontend/src/app/data/status.store.ts b/apps/frontend/src/app/data/status.store.ts index f3de998..7511f58 100644 --- a/apps/frontend/src/app/data/status.store.ts +++ b/apps/frontend/src/app/data/status.store.ts @@ -1,7 +1,9 @@ import { computed, inject, Injectable, signal } from '@angular/core'; -import { StatusService } from './status.service'; + import { initStatus } from '../model/status'; +import { StatusService } from './status.service'; + @Injectable({ providedIn: 'root' }) export class StatusStore { private statusService = inject(StatusService); diff --git a/apps/frontend/src/app/data/team-alignment.service.ts b/apps/frontend/src/app/data/team-alignment.service.ts index 869e963..62cfc99 100644 --- a/apps/frontend/src/app/data/team-alignment.service.ts +++ b/apps/frontend/src/app/data/team-alignment.service.ts @@ -1,8 +1,9 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; -import { TeamAlignmentResult } from '../model/team-alignment-result'; + import { Limits } from '../model/limits'; +import { TeamAlignmentResult } from '../model/team-alignment-result'; @Injectable({ providedIn: 'root' }) export class TeamAlignmentService { diff --git a/apps/frontend/src/app/features/coupling/coupling.component.spec.ts b/apps/frontend/src/app/features/coupling/coupling.component.spec.ts deleted file mode 100644 index 8fe5eab..0000000 --- a/apps/frontend/src/app/features/coupling/coupling.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { CouplingComponent } from './coupling.component'; - -describe('GraphComponent', () => { - let component: CouplingComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [CouplingComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(CouplingComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/features/coupling/coupling.component.ts b/apps/frontend/src/app/features/coupling/coupling.component.ts index 5424f7d..1bc334d 100644 --- a/apps/frontend/src/app/features/coupling/coupling.component.ts +++ b/apps/frontend/src/app/features/coupling/coupling.component.ts @@ -1,13 +1,11 @@ import { Component, computed, inject, input, signal } from '@angular/core'; -import { CouplingService } from '../../data/coupling.service'; -import { EventService } from '../../utils/event.service'; import { toObservable, toSignal } from '@angular/core/rxjs-interop'; - -import { MatCheckboxModule } from '@angular/material/checkbox'; import { FormsModule } from '@angular/forms'; -import { GraphType } from '../../model/graph-type'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { catchError, combineLatest, @@ -16,20 +14,23 @@ import { startWith, switchMap, } from 'rxjs'; -import { initLimits, Limits } from '../../model/limits'; -import { LimitsComponent } from '../../ui/limits/limits.component'; + +import { CouplingService } from '../../data/coupling.service'; import { StatusStore } from '../../data/status.store'; import { CouplingResult, initCouplingResult, } from '../../model/coupling-result'; +import { GraphType } from '../../model/graph-type'; +import { initLimits, Limits } from '../../model/limits'; import { Graph, CouplingNodeDefinition } from '../../ui/graph/graph'; -import { createGroups, createNodes, createEdges } from './graph.adapter'; +import { GraphComponent } from '../../ui/graph/graph.component'; +import { LimitsComponent } from '../../ui/limits/limits.component'; import { debounceTimeSkipFirst } from '../../utils/debounce'; import { injectShowError } from '../../utils/error-handler'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { GraphComponent } from '../../ui/graph/graph.component'; +import { EventService } from '../../utils/event.service'; + +import { createGroups, createNodes, createEdges } from './graph.adapter'; const STRUCTURE_TIP = 'Select the modules in the tree on the left to visualize them and the depencencies of their files.'; diff --git a/apps/frontend/src/app/features/coupling/graph.adapter.ts b/apps/frontend/src/app/features/coupling/graph.adapter.ts index 91984ab..2546e7b 100644 --- a/apps/frontend/src/app/features/coupling/graph.adapter.ts +++ b/apps/frontend/src/app/features/coupling/graph.adapter.ts @@ -1,7 +1,8 @@ import { EdgeDefinition } from 'cytoscape'; + import { CouplingResult } from '../../model/coupling-result'; -import { CouplingNodeDefinition } from '../../ui/graph/graph'; import { GraphType } from '../../model/graph-type'; +import { CouplingNodeDefinition } from '../../ui/graph/graph'; export function createEdges( result: CouplingResult, diff --git a/apps/frontend/src/app/features/hotspot/hotspot.component.spec.ts b/apps/frontend/src/app/features/hotspot/hotspot.component.spec.ts deleted file mode 100644 index ddac406..0000000 --- a/apps/frontend/src/app/features/hotspot/hotspot.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { HotspotComponent } from './hotspot.component'; - -describe('HotspotComponent', () => { - let component: HotspotComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [HotspotComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(HotspotComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/features/hotspot/hotspot.component.ts b/apps/frontend/src/app/features/hotspot/hotspot.component.ts index de9d8a2..38bdbeb 100644 --- a/apps/frontend/src/app/features/hotspot/hotspot.component.ts +++ b/apps/frontend/src/app/features/hotspot/hotspot.component.ts @@ -6,23 +6,17 @@ import { signal, viewChild, } from '@angular/core'; -import { HotspotService } from '../../data/hotspot.service'; -import { - AggregatedHotspot, - AggregatedHotspotsResult, - ComplexityMetric, - FlatHotspot, - HotspotCriteria, - HotspotResult, - initAggregatedHotspotsResult, - initHotspotResult, -} from '../../model/hotspot-result'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { lastSegments } from '../../utils/segments'; +import { toObservable, toSignal } from '@angular/core/rxjs-interop'; +import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; -import { FormsModule } from '@angular/forms'; +import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { catchError, combineLatest, @@ -33,18 +27,25 @@ import { switchMap, tap, } from 'rxjs'; -import { EventService } from '../../utils/event.service'; -import { toObservable, toSignal } from '@angular/core/rxjs-interop'; -import { LimitsComponent } from '../../ui/limits/limits.component'; -import { initLimits, Limits } from '../../model/limits'; -import { MatSelectModule } from '@angular/material/select'; + +import { HotspotService } from '../../data/hotspot.service'; import { StatusStore } from '../../data/status.store'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; +import { + AggregatedHotspot, + AggregatedHotspotsResult, + ComplexityMetric, + FlatHotspot, + HotspotCriteria, + HotspotResult, + initAggregatedHotspotsResult, + initHotspotResult, +} from '../../model/hotspot-result'; +import { initLimits, Limits } from '../../model/limits'; +import { LimitsComponent } from '../../ui/limits/limits.component'; import { debounceTimeSkipFirst } from '../../utils/debounce'; import { injectShowError } from '../../utils/error-handler'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { EventService } from '../../utils/event.service'; +import { lastSegments } from '../../utils/segments'; interface Option { id: ComplexityMetric; diff --git a/apps/frontend/src/app/features/team-alignment/team-alignment-chart-adapter.ts b/apps/frontend/src/app/features/team-alignment/team-alignment-chart-adapter.ts index 224f780..65e4fda 100644 --- a/apps/frontend/src/app/features/team-alignment/team-alignment-chart-adapter.ts +++ b/apps/frontend/src/app/features/team-alignment/team-alignment-chart-adapter.ts @@ -1,6 +1,6 @@ import { TeamAlignmentResult } from '../../model/team-alignment-result'; -import { lastSegments } from '../../utils/segments'; import { DoughnutChartConfig } from '../../ui/doughnut/doughnut.component'; +import { lastSegments } from '../../utils/segments'; export function toAlignmentChartConfigs( result: TeamAlignmentResult, diff --git a/apps/frontend/src/app/features/team-alignment/team-alignment.component.spec.ts b/apps/frontend/src/app/features/team-alignment/team-alignment.component.spec.ts deleted file mode 100644 index 82869b1..0000000 --- a/apps/frontend/src/app/features/team-alignment/team-alignment.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TeamAlignmentComponent } from './team-alignment.component'; - -describe('TeamAlignmentComponent', () => { - let component: TeamAlignmentComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [TeamAlignmentComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(TeamAlignmentComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/features/team-alignment/team-alignment.component.ts b/apps/frontend/src/app/features/team-alignment/team-alignment.component.ts index 7207ad7..5cd1979 100644 --- a/apps/frontend/src/app/features/team-alignment/team-alignment.component.ts +++ b/apps/frontend/src/app/features/team-alignment/team-alignment.component.ts @@ -1,7 +1,10 @@ import { Component, inject, signal, computed } from '@angular/core'; import { toObservable, toSignal } from '@angular/core/rxjs-interop'; import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { quantize, interpolateRainbow } from 'd3'; import { combineLatest, @@ -11,6 +14,7 @@ import { catchError, of, } from 'rxjs'; + import { StatusStore } from '../../data/status.store'; import { TeamAlignmentService } from '../../data/team-alignment.service'; import { initLimits, Limits } from '../../model/limits'; @@ -18,15 +22,13 @@ import { initTeamAlignmentResult, TeamAlignmentResult, } from '../../model/team-alignment-result'; +import { DoughnutComponent } from '../../ui/doughnut/doughnut.component'; import { LimitsComponent } from '../../ui/limits/limits.component'; import { debounceTimeSkipFirst } from '../../utils/debounce'; +import { injectShowError } from '../../utils/error-handler'; import { EventService } from '../../utils/event.service'; + import { toAlignmentChartConfigs } from './team-alignment-chart-adapter'; -import { injectShowError } from '../../utils/error-handler'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { DoughnutComponent } from '../../ui/doughnut/doughnut.component'; -import { MatButtonModule } from '@angular/material/button'; type LoadTeamAlignmentOptions = { limits: Limits; diff --git a/apps/frontend/src/app/shell/about/about.component.spec.ts b/apps/frontend/src/app/shell/about/about.component.spec.ts deleted file mode 100644 index 79f40f9..0000000 --- a/apps/frontend/src/app/shell/about/about.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AboutComponent } from './about.component'; - -describe('AboutComponent', () => { - let component: AboutComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AboutComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(AboutComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/shell/about/about.component.ts b/apps/frontend/src/app/shell/about/about.component.ts index 035bb43..65bf93d 100644 --- a/apps/frontend/src/app/shell/about/about.component.ts +++ b/apps/frontend/src/app/shell/about/about.component.ts @@ -1,5 +1,5 @@ -import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; @Component({ selector: 'app-about', diff --git a/apps/frontend/src/app/shell/cache.guard.ts b/apps/frontend/src/app/shell/cache.guard.ts index 7c00078..7707efe 100644 --- a/apps/frontend/src/app/shell/cache.guard.ts +++ b/apps/frontend/src/app/shell/cache.guard.ts @@ -1,7 +1,8 @@ import { inject } from '@angular/core'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { Observable, of, switchMap, tap } from 'rxjs'; + import { CacheService } from '../data/cache.service'; -import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { LoadingComponent } from '../ui/loading/loading.component'; export function ensureCache(): Observable { diff --git a/apps/frontend/src/app/shell/filter-tree/filter-tree.component.spec.ts b/apps/frontend/src/app/shell/filter-tree/filter-tree.component.spec.ts deleted file mode 100644 index 6d4a1cd..0000000 --- a/apps/frontend/src/app/shell/filter-tree/filter-tree.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FilterTreeComponent } from './filter-tree.component'; - -describe('FilterTreeComponent', () => { - let component: FilterTreeComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [FilterTreeComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(FilterTreeComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/shell/filter-tree/filter-tree.component.ts b/apps/frontend/src/app/shell/filter-tree/filter-tree.component.ts index 111e788..121c5d5 100644 --- a/apps/frontend/src/app/shell/filter-tree/filter-tree.component.ts +++ b/apps/frontend/src/app/shell/filter-tree/filter-tree.component.ts @@ -1,17 +1,18 @@ -import { Component, inject, OnInit, viewChild } from '@angular/core'; -import { Folder } from '../../model/folder'; import { CdkTree } from '@angular/cdk/tree'; -import { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree'; -import { FolderService } from '../../data/folder.service'; -import { combineLatest, of } from 'rxjs'; -import { MatIconModule } from '@angular/material/icon'; +import { Component, inject, OnInit, viewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxChange, MatCheckboxModule, } from '@angular/material/checkbox'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree'; +import { combineLatest, of } from 'rxjs'; + import { ConfigService } from '../../data/config.service'; +import { FolderService } from '../../data/folder.service'; import { initConfig } from '../../model/config'; +import { Folder } from '../../model/folder'; import { EventService } from '../../utils/event.service'; const MIN_OPEN_LEVEL = 2; diff --git a/apps/frontend/src/app/shell/nav/nav.component.spec.ts b/apps/frontend/src/app/shell/nav/nav.component.spec.ts deleted file mode 100644 index f98a904..0000000 --- a/apps/frontend/src/app/shell/nav/nav.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -import { NavComponent } from './nav.component'; - -describe('NavComponent', () => { - let component: NavComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [NoopAnimationsModule], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(NavComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/shell/nav/nav.component.ts b/apps/frontend/src/app/shell/nav/nav.component.ts index b40c59b..c66ea66 100644 --- a/apps/frontend/src/app/shell/nav/nav.component.ts +++ b/apps/frontend/src/app/shell/nav/nav.component.ts @@ -1,16 +1,17 @@ -import { Component, inject } from '@angular/core'; import { BreakpointObserver } from '@angular/cdk/layout'; import { AsyncPipe } from '@angular/common'; -import { MatToolbarModule } from '@angular/material/toolbar'; +import { Component, inject } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatListModule } from '@angular/material/list'; import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { RouterModule } from '@angular/router'; import { Observable } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; -import { FilterTreeComponent } from '../filter-tree/filter-tree.component'; + import { CouplingComponent } from '../../features/coupling/coupling.component'; -import { RouterModule } from '@angular/router'; +import { FilterTreeComponent } from '../filter-tree/filter-tree.component'; @Component({ selector: 'app-nav', diff --git a/apps/frontend/src/app/ui/doughnut/doughnut.component.spec.ts b/apps/frontend/src/app/ui/doughnut/doughnut.component.spec.ts deleted file mode 100644 index 40323e8..0000000 --- a/apps/frontend/src/app/ui/doughnut/doughnut.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { DoughnutComponent } from './doughnut.component'; - -describe('DoughnutComponent', () => { - let component: DoughnutComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [DoughnutComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(DoughnutComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/ui/doughnut/doughnut.component.ts b/apps/frontend/src/app/ui/doughnut/doughnut.component.ts index 4660052..7c4d058 100644 --- a/apps/frontend/src/app/ui/doughnut/doughnut.component.ts +++ b/apps/frontend/src/app/ui/doughnut/doughnut.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, ElementRef, @@ -7,7 +8,6 @@ import { SimpleChanges, viewChild, } from '@angular/core'; -import { CommonModule } from '@angular/common'; import { ArcElement, Chart, diff --git a/apps/frontend/src/app/ui/graph/graph.component.spec.ts b/apps/frontend/src/app/ui/graph/graph.component.spec.ts deleted file mode 100644 index 63ead46..0000000 --- a/apps/frontend/src/app/ui/graph/graph.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { GraphComponent } from './graph.component'; - -describe('GraphComponent', () => { - let component: GraphComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [GraphComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(GraphComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/ui/graph/graph.component.ts b/apps/frontend/src/app/ui/graph/graph.component.ts index 43bb962..4d09e7b 100644 --- a/apps/frontend/src/app/ui/graph/graph.component.ts +++ b/apps/frontend/src/app/ui/graph/graph.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, ElementRef, @@ -6,7 +7,7 @@ import { SimpleChanges, viewChild, } from '@angular/core'; -import { CommonModule } from '@angular/common'; + import { drawGraph, Graph } from './graph'; @Component({ diff --git a/apps/frontend/src/app/ui/graph/graph.ts b/apps/frontend/src/app/ui/graph/graph.ts index c3d7fd8..5343ebe 100644 --- a/apps/frontend/src/app/ui/graph/graph.ts +++ b/apps/frontend/src/app/ui/graph/graph.ts @@ -6,10 +6,9 @@ import cytoscape, { NodeDefinition, NodeSingular, } from 'cytoscape'; - import cola from 'cytoscape-cola'; -import qtip from 'cytoscape-qtip'; import dagre from 'cytoscape-dagre'; +import qtip from 'cytoscape-qtip'; cytoscape.use(dagre); cytoscape.use(cola); diff --git a/apps/frontend/src/app/ui/limits/limits.component.spec.ts b/apps/frontend/src/app/ui/limits/limits.component.spec.ts deleted file mode 100644 index 7b89c3d..0000000 --- a/apps/frontend/src/app/ui/limits/limits.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LimitsComponent } from './limits.component'; - -describe('LimitsComponent', () => { - let component: LimitsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LimitsComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(LimitsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/app/ui/limits/limits.component.ts b/apps/frontend/src/app/ui/limits/limits.component.ts index a762f87..4197554 100644 --- a/apps/frontend/src/app/ui/limits/limits.component.ts +++ b/apps/frontend/src/app/ui/limits/limits.component.ts @@ -1,3 +1,4 @@ +import { DecimalPipe } from '@angular/common'; import { Component, computed, @@ -6,13 +7,13 @@ import { model, signal, } from '@angular/core'; -import { Limits } from '../../model/limits'; +import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { FormsModule } from '@angular/forms'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { DecimalPipe } from '@angular/common'; + +import { Limits } from '../../model/limits'; type OptionId = 'COMMITS' | 'MONTHS'; diff --git a/apps/frontend/src/app/ui/loading/loading.component.spec.ts b/apps/frontend/src/app/ui/loading/loading.component.spec.ts deleted file mode 100644 index 3660663..0000000 --- a/apps/frontend/src/app/ui/loading/loading.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoadingComponent } from './loading.component'; - -describe('LoadingComponent', () => { - let component: LoadingComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoadingComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(LoadingComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/apps/frontend/src/main.ts b/apps/frontend/src/main.ts index 514c89a..0b27bbb 100644 --- a/apps/frontend/src/main.ts +++ b/apps/frontend/src/main.ts @@ -1,6 +1,7 @@ import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; + import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err) diff --git a/package-lock.json b/package-lock.json index b2d53ba..1101eec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,6 +76,7 @@ "@typescript-eslint/utils": "^7.16.0", "eslint": "~8.57.0", "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.30.0", "husky": "^9.1.5", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -7973,6 +7974,13 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@schematics/angular": { "version": "18.2.2", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.2.tgz", @@ -9435,6 +9443,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/micromatch": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.9.tgz", @@ -10416,6 +10431,23 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -10429,6 +10461,27 @@ "dev": true, "license": "MIT" }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -10439,6 +10492,88 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -10500,6 +10635,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", @@ -12945,6 +13096,60 @@ "node": ">=12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -13102,6 +13307,24 @@ "node": ">=8" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", @@ -13627,6 +13850,67 @@ "stackframe": "^1.3.4" } }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -13655,6 +13939,62 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", @@ -13836,55 +14176,221 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" @@ -14658,6 +15164,16 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -14945,6 +15461,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -15020,6 +15565,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/git-raw-commits": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", @@ -15172,6 +15735,23 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -15242,6 +15822,16 @@ "dev": true, "license": "(Apache-2.0 OR MPL-1.1)" }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -15894,6 +16484,21 @@ "dev": true, "license": "ISC" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -15943,6 +16548,23 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -15950,6 +16572,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -15963,6 +16598,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -15979,6 +16644,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -16104,6 +16801,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -16126,6 +16836,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -16179,6 +16905,39 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -16192,17 +16951,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { - "text-extensions": "^2.0.0" + "which-typed-array": "^1.1.14" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-unicode-supported": { @@ -16218,6 +17025,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -19544,6 +20364,87 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -20117,6 +21018,16 @@ "ms": "^2.1.1" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.44", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", @@ -21113,6 +22024,25 @@ "dev": true, "license": "MIT" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -21476,6 +22406,32 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -21496,6 +22452,24 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -21832,6 +22806,22 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -22375,6 +23365,58 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -23319,6 +24361,83 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-assert": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", @@ -23339,6 +24458,22 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -24740,6 +25875,43 @@ "which": "bin/which" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index a528815..2c1d8b3 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "@typescript-eslint/utils": "^7.16.0", "eslint": "~8.57.0", "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.30.0", "husky": "^9.1.5", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0",