From 73269bd828444009dd80f604842ce3380431d685 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Thu, 15 Aug 2024 10:41:53 -0400 Subject: [PATCH 01/62] Default filing_frequency to 'Q' when retrieving committee details --- front-end/src/app/shared/services/fec-api.service.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/front-end/src/app/shared/services/fec-api.service.ts b/front-end/src/app/shared/services/fec-api.service.ts index cd848919f1..76a15ce9dc 100644 --- a/front-end/src/app/shared/services/fec-api.service.ts +++ b/front-end/src/app/shared/services/fec-api.service.ts @@ -46,9 +46,13 @@ export class FecApiService { throw new Error('Fecfile: No Committee Id provided in getCommitteeDetails()'); } - return this.apiService - .get(`/openfec/${committeeId}/committee/`) - .pipe(map((response) => response.results[0] as CommitteeAccount)); + return this.apiService.get(`/openfec/${committeeId}/committee/`).pipe( + map((response) => { + const ca = response.results[0] as CommitteeAccount; + if (!ca.filing_frequency) ca.filing_frequency = 'Q'; + return ca; + }), + ); } /** From 9a0df26290036ba2448f7ba4ab0e0f80190379c7 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Thu, 15 Aug 2024 11:04:39 -0400 Subject: [PATCH 02/62] Update filing frequency toggle to default based on the filing frequency of the committee --- .../reports/f3x/create-workflow/create-f3x-step1.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts b/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts index efc5d027f7..e856dbe814 100644 --- a/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts +++ b/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts @@ -83,7 +83,7 @@ export class CreateF3XStep1Component extends DestroyerComponent implements OnIni .pipe(takeUntil(this.destroy$)) .subscribe(([committeeAccount, existingCoverage]) => { this.committeeAccount = committeeAccount; - const filingFrequency = this.userCanSetFilingFrequency ? 'Q' : committeeAccount?.filing_frequency; + const filingFrequency = committeeAccount?.filing_frequency ?? 'Q'; this.form.addControl('filing_frequency', new FormControl()); this.form.addControl('report_type_category', new FormControl()); this.form?.patchValue({ filing_frequency: filingFrequency, form_type: 'F3XN' }); From 7f835c87a138b541c759931f5d5a993f5da388c5 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 19 Aug 2024 10:15:24 -0400 Subject: [PATCH 03/62] Setup Switch committee link --- .../app/layout/header/header-links/header-links.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/layout/header/header-links/header-links.component.html b/front-end/src/app/layout/header/header-links/header-links.component.html index 0405169c88..5a1ecdd84f 100644 --- a/front-end/src/app/layout/header/header-links/header-links.component.html +++ b/front-end/src/app/layout/header/header-links/header-links.component.html @@ -71,7 +71,7 @@ Account Users - Switch Committees + Switch Committees User Profile Logout From c7b8e1def5d8b7a43a6b7328b2a071703826fa99 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 19 Aug 2024 11:51:08 -0400 Subject: [PATCH 04/62] Update YE to only use previous year if month is January --- .../src/app/shared/utils/date.utils.spec.ts | 14 +++++++ front-end/src/app/shared/utils/date.utils.ts | 5 +++ .../shared/utils/report-code.utils.spec.ts | 39 ++++++++++++++++++- .../src/app/shared/utils/report-code.utils.ts | 9 +++-- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/front-end/src/app/shared/utils/date.utils.spec.ts b/front-end/src/app/shared/utils/date.utils.spec.ts index ab74cd964b..5e0a04e0e9 100644 --- a/front-end/src/app/shared/utils/date.utils.spec.ts +++ b/front-end/src/app/shared/utils/date.utils.spec.ts @@ -104,4 +104,18 @@ describe('DateUtils', () => { expect(control.valid).toBeTrue(); }); }); + + describe('isCurrentMonthJanuary', () => { + it('should return true if the current month is January', () => { + spyOn(Date.prototype, 'getMonth').and.returnValue(0); // January + const result = DateUtils.isCurrentMonthJanuary(); + expect(result).toBe(true); + }); + + it('should return false if the current month is not January', () => { + spyOn(Date.prototype, 'getMonth').and.returnValue(1); // February + const result = DateUtils.isCurrentMonthJanuary(); + expect(result).toBe(false); + }); + }); }); diff --git a/front-end/src/app/shared/utils/date.utils.ts b/front-end/src/app/shared/utils/date.utils.ts index d5bb4a79b9..52399b6c27 100644 --- a/front-end/src/app/shared/utils/date.utils.ts +++ b/front-end/src/app/shared/utils/date.utils.ts @@ -48,4 +48,9 @@ export class DateUtils { public static isWithin(date?: Date, from?: Date, through?: Date): boolean { return !!(date && from && through) && from <= date && date <= through; } + + public static isCurrentMonthJanuary(): boolean { + const currentMonth = new Date().getMonth(); + return currentMonth === 0; + } } diff --git a/front-end/src/app/shared/utils/report-code.utils.spec.ts b/front-end/src/app/shared/utils/report-code.utils.spec.ts index 25314155ea..b0df512504 100644 --- a/front-end/src/app/shared/utils/report-code.utils.spec.ts +++ b/front-end/src/app/shared/utils/report-code.utils.spec.ts @@ -1,3 +1,4 @@ +import { DateUtils } from './date.utils'; import { getCoverageDatesFunction, F3xReportCodes } from './report-code.utils'; describe('ReportCodeUtils', () => { @@ -38,10 +39,11 @@ describe('ReportCodeUtils', () => { } }); - it('should return correct function for YE', () => { + it('should return correct function for YE when current month is January', () => { const result = getCoverageDatesFunction(F3xReportCodes.YE); if (result) { expect(typeof result).toBe('function'); + spyOn(DateUtils, 'isCurrentMonthJanuary').and.returnValue(true); // Test for election year let [startDate, endDate] = result(2024, true, 'Q'); @@ -72,6 +74,41 @@ describe('ReportCodeUtils', () => { } }); + it('should return correct function for YE when current month is not January', () => { + const result = getCoverageDatesFunction(F3xReportCodes.YE); + if (result) { + expect(typeof result).toBe('function'); + spyOn(DateUtils, 'isCurrentMonthJanuary').and.returnValue(false); + + // Test for election year + let [startDate, endDate] = result(2024, true, 'Q'); + expect(startDate.getFullYear()).toBe(2024); + expect(startDate.getMonth()).toBe(9); + expect(startDate.getDate()).toBe(1); + expect(endDate.getFullYear()).toBe(2024); + expect(endDate.getMonth()).toBe(11); + expect(endDate.getDate()).toBe(31); + + // Test for non-election year with filingFrequency 'Q' + [startDate, endDate] = result(2024, false, 'Q'); + expect(startDate.getFullYear()).toBe(2024); + expect(startDate.getMonth()).toBe(6); + expect(startDate.getDate()).toBe(1); + expect(endDate.getFullYear()).toBe(2024); + expect(endDate.getMonth()).toBe(11); + expect(endDate.getDate()).toBe(31); + + // Test for non-election year with filingFrequency other than 'Q' + [startDate, endDate] = result(2024, false, 'M'); + expect(startDate.getFullYear()).toBe(2024); + expect(startDate.getMonth()).toBe(11); + expect(startDate.getDate()).toBe(1); + expect(endDate.getFullYear()).toBe(2024); + expect(endDate.getMonth()).toBe(11); + expect(endDate.getDate()).toBe(31); + } + }); + it('should return correct function for M2', () => { const result = getCoverageDatesFunction(F3xReportCodes.M2); expect(typeof result).toBe('function'); diff --git a/front-end/src/app/shared/utils/report-code.utils.ts b/front-end/src/app/shared/utils/report-code.utils.ts index 4cd2a35837..f893e4ef97 100644 --- a/front-end/src/app/shared/utils/report-code.utils.ts +++ b/front-end/src/app/shared/utils/report-code.utils.ts @@ -1,3 +1,5 @@ +import { DateUtils } from './date.utils'; + export enum F3xReportCodes { Q1 = 'Q1', Q2 = 'Q2', @@ -95,12 +97,13 @@ function createCoverageFunction( } function getYearEndCoverageDates(year: number, isElectionYear: boolean, filingFrequency: string): [Date, Date] { + year = DateUtils.isCurrentMonthJanuary() ? year - 1 : year; if (isElectionYear) { - return [new Date(year - 1, 9, 1), new Date(year - 1, 11, 31)]; + return [new Date(year, 9, 1), new Date(year, 11, 31)]; } else if (filingFrequency === 'Q') { - return [new Date(year - 1, 6, 1), new Date(year - 1, 11, 31)]; + return [new Date(year, 6, 1), new Date(year, 11, 31)]; } - return [new Date(year - 1, 11, 1), new Date(year - 1, 11, 31)]; + return [new Date(year, 11, 1), new Date(year, 11, 31)]; } export const monthlyElectionYearReportCodes: F3xReportCodes[] = [ From d130a42766bca88de53b5e4f4a71cceee85ed340 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 19 Aug 2024 13:13:28 -0400 Subject: [PATCH 05/62] If candidate state only has 1 district, select it, otherwise clear the candidate district on state change --- .../candidate-office-input/candidate-office-input.component.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts index 23afbade1e..800ad4ac02 100644 --- a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts +++ b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts @@ -90,6 +90,9 @@ export class CandidateOfficeInputComponent extends BaseInputComponent implements } else { this.candidateDistrictOptions = []; } + this.form + .get(this.districtFormControlName) + ?.setValue(this.candidateDistrictOptions.length === 1 ? this.candidateDistrictOptions[0].value : null); }); // Run election_code, office, and state valueChange logic when initializing form elements From ed2d7f599b8af7b5381c8a82fbc4d0042cfeaf70 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Wed, 28 Aug 2024 16:49:58 -0400 Subject: [PATCH 06/62] Resolve 'A' and 'T' to also go to 'Q' filing frequency --- .../reports/f3x/create-workflow/create-f3x-step1.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts b/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts index e856dbe814..8d03814f50 100644 --- a/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts +++ b/front-end/src/app/reports/f3x/create-workflow/create-f3x-step1.component.ts @@ -83,7 +83,7 @@ export class CreateF3XStep1Component extends DestroyerComponent implements OnIni .pipe(takeUntil(this.destroy$)) .subscribe(([committeeAccount, existingCoverage]) => { this.committeeAccount = committeeAccount; - const filingFrequency = committeeAccount?.filing_frequency ?? 'Q'; + const filingFrequency = committeeAccount?.filing_frequency === 'M' ? 'M' : 'Q'; this.form.addControl('filing_frequency', new FormControl()); this.form.addControl('report_type_category', new FormControl()); this.form?.patchValue({ filing_frequency: filingFrequency, form_type: 'F3XN' }); From 6c7a689bbdac8c71bf1aa47f678d73965d2ac94b Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Thu, 29 Aug 2024 14:41:59 -0400 Subject: [PATCH 07/62] 1555 update purpose of receipt for IND reattributions --- front-end/src/app/shared/models/transaction.model.spec.ts | 2 +- front-end/src/app/shared/models/transaction.model.ts | 2 +- .../app/shared/utils/reatt-redes/reattribution-from.utils.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/front-end/src/app/shared/models/transaction.model.spec.ts b/front-end/src/app/shared/models/transaction.model.spec.ts index c3539a1f5a..f072aaf6be 100644 --- a/front-end/src/app/shared/models/transaction.model.spec.ts +++ b/front-end/src/app/shared/models/transaction.model.spec.ts @@ -18,7 +18,7 @@ describe('Transaction', () => { testTransaction.contributor_first_name = 'fname'; testTransaction.entity_type = ContactTypes.INDIVIDUAL; let name = getTransactionName(testTransaction); - expect(name).toBe('lname, fname'); + expect(name).toBe('fname lname'); testTransaction.contributor_organization_name = 'orgname'; testTransaction.entity_type = ContactTypes.ORGANIZATION; diff --git a/front-end/src/app/shared/models/transaction.model.ts b/front-end/src/app/shared/models/transaction.model.ts index 18172883fe..fc0e663319 100644 --- a/front-end/src/app/shared/models/transaction.model.ts +++ b/front-end/src/app/shared/models/transaction.model.ts @@ -145,7 +145,7 @@ export function getTransactionName(transaction: ScheduleTransaction): string { const lastName = transaction[ transaction.transactionType.templateMap.last_name as keyof ScheduleTransaction ] as string; - return `${lastName}, ${firstName}`; + return `${firstName} ${lastName}`; } const orgName = transaction[ diff --git a/front-end/src/app/shared/utils/reatt-redes/reattribution-from.utils.ts b/front-end/src/app/shared/utils/reatt-redes/reattribution-from.utils.ts index ffef90a860..612f659fb2 100644 --- a/front-end/src/app/shared/utils/reatt-redes/reattribution-from.utils.ts +++ b/front-end/src/app/shared/utils/reatt-redes/reattribution-from.utils.ts @@ -80,7 +80,7 @@ export class ReattributionFromUtils { toForm.get(transaction.transactionType.templateMap.last_name)?.valueChanges ?? of(null), ]).subscribe(([orgName, firstName, lastName]) => { if (toForm.get('entity_type')?.value === ContactTypes.INDIVIDUAL) { - purposeDescriptionControl?.setValue(`Reattribution to ${lastName}, ${firstName}`); + purposeDescriptionControl?.setValue(`Reattribution to ${firstName} ${lastName}`); } else { purposeDescriptionControl?.setValue(`Reattribution to ${orgName}`); } From b4306eb535be0ce26021ad9f14e570f0eeddecd2 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 29 Aug 2024 15:16:41 -0400 Subject: [PATCH 08/62] Updates eslint --- front-end/.eslintrc.json | 56 - front-end/package-lock.json | 2016 +++++++++-------------------------- front-end/package.json | 20 +- 3 files changed, 537 insertions(+), 1555 deletions(-) delete mode 100644 front-end/.eslintrc.json diff --git a/front-end/.eslintrc.json b/front-end/.eslintrc.json deleted file mode 100644 index a1d087218d..0000000000 --- a/front-end/.eslintrc.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "root": true, - "ignorePatterns": [ - "src/**/*.png", - "src/**/*.json", - "src/**/*.scss", - "src/**/*.woff", - "src/**/*.svg" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "tsconfig.json" - ], - "createDefaultProgram": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" - ], - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "app", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "app", - "style": "kebab-case" - } - ] - } - }, - { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], - "rules": {} - } - ] -} diff --git a/front-end/package-lock.json b/front-end/package-lock.json index fe8a86c0c4..8efe836db3 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -40,14 +40,16 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.7", - "@angular-eslint/builder": "^17.4.0", - "@angular-eslint/eslint-plugin": "^17.4.0", - "@angular-eslint/eslint-plugin-template": "^17.4.0", - "@angular-eslint/schematics": "^17.4.0", - "@angular-eslint/template-parser": "^17.4.0", + "@angular-eslint/builder": "^18.3.0", + "@angular-eslint/eslint-plugin": "^18.3.0", + "@angular-eslint/eslint-plugin-template": "^18.3.0", + "@angular-eslint/schematics": "^18.3.0", + "@angular-eslint/template-parser": "^18.3.0", "@angular/cli": "^17.3.8", "@angular/compiler-cli": "^17.3.8", "@cypress/schematic": "^2.5.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.9.1", "@faker-js/faker": "^8.4.1", "@types/bootstrap": "^5.2.10", "@types/intl-tel-input": "^18.1.4", @@ -55,11 +57,11 @@ "@types/lodash": "^4.14.202", "@types/luxon": "^3.4.2", "@types/node": "^20.11.19", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.3.0", + "@typescript-eslint/parser": "^8.3.0", "cypress": "^13.6.4", "cypress-mochawesome-reporter": "^3.5.1", - "eslint": "^8.57.0", + "eslint": "^9.9.1", "glob": "^9.3.5", "jasmine-core": "^4.0.0", "karma": "^6.3.0", @@ -101,6 +103,33 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular": { "version": "17.3.8", "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.8.tgz", @@ -230,6 +259,33 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -256,20 +312,21 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", - "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.1.tgz", + "integrity": "sha512-fSuGj6CxiTFR+yjuVcaWqaVb5Wts39CSBYRO1BlsOlbuWFZ2NKC/BAb5bdxpB31heCBJi7e3XbPvcMMJIcnKlA==", "dev": true, + "peer": true, "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -282,120 +339,199 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "peer": true + }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "17.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", - "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.1.tgz", + "integrity": "sha512-2t/q0Jcv7yqhAzEdNgsxoGSCmPgD4qfnVOJ7EJw3LNIA+kX1CmtN4FESUS0i49kN4AyNJFAI5O2pV8iJiliKaw==", "dev": true, + "peer": true, "dependencies": { - "@angular-devkit/core": "17.3.8", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", + "@angular-devkit/core": "18.2.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.11", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/builder": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.5.2.tgz", - "integrity": "sha512-bvegxJuocWeHdvISPfCXeLQPSjrMCEVzxXPg16JJKksKWSeRA1JnbXnfnb7eoLdq1+riMHKqbH6Fs4rORAvUiA==", + "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, + "peer": true + }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "peer": true, "dependencies": { - "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", - "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" - }, + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.0.tgz", + "integrity": "sha512-httEQyqyBw3+0CRtAa7muFxHrauRfkEfk/jmrh5fn2Eiu+I53hAqFPgrwVi1V6AP/kj2zbAiWhd5xM3pMJdoRQ==", + "dev": true, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.5.2.tgz", - "integrity": "sha512-K4hVnMyI98faMJmsA4EOBkD0tapDjWV5gy0j/wJ2uSL46d3JgZPZNJSO1zStf/b3kT4gLOlQ/ulWFiUf1DxgIw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.0.tgz", + "integrity": "sha512-v/59FxUKnMzymVce99gV43huxoqXWMb85aKvzlNvLN+ScDu6ZE4YMiTQNpfapVL2lkxhs0uwB3jH17EYd5TcsA==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.5.2.tgz", - "integrity": "sha512-kzPALKyT5XIEbgoNmY/hEZWdMWKTX56Pap9fVLJSC/b+Nd+MXc7TNly2s0XoC0Ru1/kMiVzbmSGPheu/rw+9aA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.0.tgz", + "integrity": "sha512-Vl7gfPMXxvtHTjYdlzR161aj5xrqW6T57wd8ToQ7Gqzm0qHGfY6kE4SQobUa2LCYckTNSlv+zXe48C4ah/dSjw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.5.2", - "@angular-eslint/utils": "17.5.2", - "@typescript-eslint/utils": "7.11.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.5.2.tgz", - "integrity": "sha512-6sxVwrJ7yElZxcjxHSA0Ujs29bCD/cMubd9n6TDFI9e3v+ktpoMW4Nv/TCHv0OuYatIOZ7bcJxi38cAO8Vhfhw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.0.tgz", + "integrity": "sha512-ddR/qwYbUeq9IpyVKrPbfZyRBTy6V8uc5I0JcBKttQ4CZ4joXhqsVgWFsI+JAMi8E66uNj1VC7NuKCOjDINv2Q==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.5.2", - "@angular-eslint/utils": "17.5.2", - "@typescript-eslint/type-utils": "7.11.0", - "@typescript-eslint/utils": "7.11.0", + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0", "aria-query": "5.3.0", - "axobject-query": "4.0.0" + "axobject-query": "4.1.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/schematics": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.5.2.tgz", - "integrity": "sha512-HcvqrBEJfYMTc+fZ6YdRkb+9YcXsy2XSv59Yhd0bBqZ4ZdM4QuuVFxWlLNvhV6TF1DtO24CzpN4OyE+AO5EWBA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.3.0.tgz", + "integrity": "sha512-rQ4DEWwf3f5n096GAK6JvXD0SRzRJ52WRaIyKg8MMkk6qvUDfZI8seOkcbjDtZoIe6Ds7DfqSfJgNVte75qvPQ==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.5.2", - "@angular-eslint/eslint-plugin-template": "17.5.2", - "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", - "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.3" + "@angular-eslint/eslint-plugin": "18.3.0", + "@angular-eslint/eslint-plugin-template": "18.3.0", + "ignore": "5.3.2", + "semver": "7.6.3", + "strip-json-comments": "3.1.1" }, "peerDependencies": { - "@angular/cli": ">= 17.0.0 < 18.0.0" + "@angular-devkit/core": ">= 18.0.0 < 19.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@angular-eslint/template-parser": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.5.2.tgz", - "integrity": "sha512-46emLElmnIUzW0bpEpSf0u05ofRVUwlfttDOMLedhi700peUKbB9Y6iyz3GzAtQCMklBbJC9nR87LQRH9aSlog==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.0.tgz", + "integrity": "sha512-1mUquqcnugI4qsoxcYZKZ6WMi6RPelDcJZg2YqGyuaIuhWmi3ZqJZLErSSpjP60+TbYZu7wM8Kchqa1bwJtEaQ==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.5.2", - "eslint-scope": "^8.0.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "eslint-scope": "^8.0.2" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/utils": { - "version": "17.5.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.5.2.tgz", - "integrity": "sha512-bTMPFqtoetBJsYR/xqREEOCy/CdsKGf2gZkRdH73gG6pOpskWt8J/PbRcMZsC349paV4HFixByVm89inqA0TNg==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.0.tgz", + "integrity": "sha512-sCrkHkpxBJZLuCikdboZoawCfc2UgbJv+T14tu2uQCv+Vwzeadnu04vkeY2vTkA8GeBdBij/G9/N/nvwmwVw3g==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.5.2", - "@typescript-eslint/utils": "7.11.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, @@ -463,6 +599,51 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@angular/common": { "version": "17.3.12", "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz", @@ -2541,34 +2722,6 @@ "node": ">=10.0.0" } }, - "node_modules/@emnapi/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", - "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", - "dev": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", @@ -2609,16 +2762,52 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2626,7 +2815,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2665,15 +2854,12 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2709,25 +2895,22 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", + "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@faker-js/faker": { @@ -2746,63 +2929,32 @@ "npm": ">=6.14.13" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, "engines": { - "node": ">=10.10.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/config-array/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true, "engines": { - "node": ">=12.22" + "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2924,18 +3076,6 @@ "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -3012,17 +3152,6 @@ "node": ">= 0.4" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", - "dev": true, - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" - } - }, "node_modules/@ngrx/effects": { "version": "17.2.0", "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-17.2.0.tgz", @@ -3276,21 +3405,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@npmcli/package-json/node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", @@ -3385,80 +3499,6 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@nrwl/devkit": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.6.2.tgz", - "integrity": "sha512-1caQTLJBcvOLDZpB3yHY0zczcaaOh044MeegS0oyllPYYbCi6PiJK33HC8qoH1TGiahT6+VxSFN7OYnD3QK4vQ==", - "dev": true, - "dependencies": { - "@nx/devkit": "19.6.2" - } - }, - "node_modules/@nrwl/tao": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.6.2.tgz", - "integrity": "sha512-DcqpaKpkUbF+J2kVRoLtYZOFpr8mu4+fHiKIjrdliKVabSOzekwRAx0DN+VZdpUoaZ2+5W+F8RFhSak1216ZCg==", - "dev": true, - "dependencies": { - "nx": "19.6.2", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@nx/devkit": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.6.2.tgz", - "integrity": "sha512-fyZ+z0CnpXsGbnOTgsxwjOJH/K1cgSkhyHSOW3BcIvncx4Q4o8Y74flRz2mrZLJeURBs+IelYI2REkCPdba2cg==", - "dev": true, - "dependencies": { - "@nrwl/devkit": "19.6.2", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 17 <= 20" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.6.2.tgz", - "integrity": "sha512-O7ao0x7j7mwgPS8DkWmMtewTRyharQSURq2kUgWwyCJgVbr5ggV8RySmt/uLT9Tv/2LUDerWdBnd30oDr70M5g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.6.2.tgz", - "integrity": "sha512-7tVOQoorw8o1n5CAtLTlJx9oI/py+V3NX0PTdX/Pa7tA6gxyrZW51HlpODssRZ5PM9171G8VAZVROP9eDLfntQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3520,6 +3560,51 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@sigstore/bundle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", @@ -3603,12 +3688,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -3637,30 +3716,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -3943,58 +3998,31 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4002,49 +4030,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4053,16 +4059,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4070,62 +4076,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", - "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/utils": "7.11.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4137,45 +4099,13 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4183,22 +4113,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4210,156 +4140,45 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", - "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0" + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", - "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/types": "8.3.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", @@ -4536,37 +4355,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", - "dev": true, - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", - "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@zkochan/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4841,15 +4629,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -4950,44 +4729,13 @@ "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==", "dev": true }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/axios/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "node_modules/axobject-query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-loader": { @@ -5442,21 +5190,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cachedir": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", @@ -6750,15 +6483,6 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6783,18 +6507,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6862,39 +6574,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", - "dev": true, - "dependencies": { - "dotenv": "^16.4.4" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6923,21 +6602,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", @@ -7219,41 +6883,37 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", + "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.9.1", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -7267,10 +6927,18 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { @@ -7332,12 +7000,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7394,17 +7056,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7438,21 +7096,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7462,18 +7105,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7544,35 +7175,35 @@ "dev": true, "dependencies": { "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=8" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7906,6 +7537,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true, + "peer": true + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -7962,36 +7600,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -8090,17 +7707,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -8211,21 +7827,6 @@ "node": ">= 0.6" } }, - "node_modules/front-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", - "dev": true, - "dependencies": { - "js-yaml": "^3.13.1" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8452,26 +8053,6 @@ "node": ">=4" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -8845,9 +8426,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -9365,245 +8946,41 @@ "engines": { "node": ">=0.10.0" } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10401,15 +9778,6 @@ } } }, - "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -10973,9 +10341,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -12091,21 +11459,6 @@ "node": ">=16" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-gyp/node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -12145,12 +11498,6 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -12316,190 +11663,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nx": { - "version": "19.6.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.6.2.tgz", - "integrity": "sha512-uUC9glC/QDsDhfOSzWl1id9rfUVepVwLhwBGRMeO5K6+Tju7qAsRGZ2NGPoUz6J1AZuWtlKZcr+MOSK2U4+2wQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.6.2", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.7.4", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.6.2", - "@nx/nx-darwin-x64": "19.6.2", - "@nx/nx-freebsd-x64": "19.6.2", - "@nx/nx-linux-arm-gnueabihf": "19.6.2", - "@nx/nx-linux-arm64-gnu": "19.6.2", - "@nx/nx-linux-arm64-musl": "19.6.2", - "@nx/nx-linux-x64-gnu": "19.6.2", - "@nx/nx-linux-x64-musl": "19.6.2", - "@nx/nx-win32-arm64-msvc": "19.6.2", - "@nx/nx-win32-x64-msvc": "19.6.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/nx/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nx/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/nx/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/nx/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -13326,32 +12489,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/primeflex": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/primeflex/-/primeflex-3.3.1.tgz", @@ -13577,12 +12714,6 @@ "node": ">= 0.8" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, "node_modules/read-installed-packages": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/read-installed-packages/-/read-installed-packages-2.0.1.tgz", @@ -13643,21 +12774,6 @@ "node": ">=12" } }, - "node_modules/read-installed-packages/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-installed-packages/node_modules/normalize-package-data": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", @@ -13738,21 +12854,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -14580,15 +13681,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -15050,15 +14142,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -15080,23 +14163,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -15156,22 +14222,6 @@ "node": ">=10" } }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -15531,20 +14581,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", diff --git a/front-end/package.json b/front-end/package.json index 4f05a3de6b..d49192d17b 100644 --- a/front-end/package.json +++ b/front-end/package.json @@ -57,14 +57,16 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.7", - "@angular-eslint/builder": "^17.4.0", - "@angular-eslint/eslint-plugin": "^17.4.0", - "@angular-eslint/eslint-plugin-template": "^17.4.0", - "@angular-eslint/schematics": "^17.4.0", - "@angular-eslint/template-parser": "^17.4.0", + "@angular-eslint/builder": "^18.3.0", + "@angular-eslint/eslint-plugin": "^18.3.0", + "@angular-eslint/eslint-plugin-template": "^18.3.0", + "@angular-eslint/schematics": "^18.3.0", + "@angular-eslint/template-parser": "^18.3.0", "@angular/cli": "^17.3.8", "@angular/compiler-cli": "^17.3.8", "@cypress/schematic": "^2.5.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.9.1", "@faker-js/faker": "^8.4.1", "@types/bootstrap": "^5.2.10", "@types/intl-tel-input": "^18.1.4", @@ -72,11 +74,11 @@ "@types/lodash": "^4.14.202", "@types/luxon": "^3.4.2", "@types/node": "^20.11.19", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.3.0", + "@typescript-eslint/parser": "^8.3.0", "cypress": "^13.6.4", "cypress-mochawesome-reporter": "^3.5.1", - "eslint": "^8.57.0", + "eslint": "^9.9.1", "glob": "^9.3.5", "jasmine-core": "^4.0.0", "karma": "^6.3.0", @@ -92,4 +94,4 @@ "browser": { "crypto": false } -} \ No newline at end of file +} From 8cf3bb01c82516b85cdebead7d9b7b0a51743c70 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 29 Aug 2024 15:18:44 -0400 Subject: [PATCH 09/62] Adds new config --- front-end/eslint.config.mjs | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 front-end/eslint.config.mjs diff --git a/front-end/eslint.config.mjs b/front-end/eslint.config.mjs new file mode 100644 index 0000000000..464ec42575 --- /dev/null +++ b/front-end/eslint.config.mjs @@ -0,0 +1,62 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [{ + ignores: [ + "src/**/*.png", + "src/**/*.json", + "src/**/*.scss", + "src/**/*.woff", + "src/**/*.svg", + ], +}, ...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates", +).map(config => ({ + ...config, + files: ["**/*.ts"], +})), { + files: ["**/*.ts"], + + languageOptions: { + ecmaVersion: 5, + sourceType: "script", + + parserOptions: { + project: ["tsconfig.json"], + createDefaultProgram: true, + }, + }, + + rules: { + "@angular-eslint/directive-selector": ["error", { + type: "attribute", + prefix: "app", + style: "camelCase", + }], + + "@angular-eslint/component-selector": ["error", { + type: "element", + prefix: "app", + style: "kebab-case", + }], + }, +}, ...compat.extends("plugin:@angular-eslint/template/recommended").map(config => ({ + ...config, + files: ["**/*.html"], +})), { + files: ["**/*.html"], + rules: {}, +}]; \ No newline at end of file From 2fc2cfdfcd2f5e508c7b755998e96f628347e1ab Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 29 Aug 2024 15:30:00 -0400 Subject: [PATCH 10/62] Fixes small errors --- .../committee/manage-committee/manage-committee.component.ts | 2 ++ .../select-report-dialog.component.spec.ts | 1 + .../components/contact-dialog/contact-dialog.component.ts | 1 + .../contact-lookup/contact-lookup.component.spec.ts | 4 ++-- .../loan-terms-dates-input.component.ts | 2 +- front-end/src/app/shared/utils/route.utils.ts | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/front-end/src/app/committee/manage-committee/manage-committee.component.ts b/front-end/src/app/committee/manage-committee/manage-committee.component.ts index dc7a04a321..3ce935b2e4 100644 --- a/front-end/src/app/committee/manage-committee/manage-committee.component.ts +++ b/front-end/src/app/committee/manage-committee/manage-committee.component.ts @@ -64,6 +64,7 @@ export class ManageCommitteeComponent extends TableListBaseComponent { component.selectedReport = component.availableReports[0]; try { await component.createReattribution(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { console.log("shouldn't go here"); } diff --git a/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts b/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts index 66e90f6e0c..92224941b1 100644 --- a/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts +++ b/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts @@ -171,6 +171,7 @@ export class ContactDialogComponent extends DestroyerComponent implements OnInit this.totalTransactions = transactionsPage.count; this.tableLoading = false; this.emptyMessage = 'No data available in table'; + // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { this.tableLoading = false; this.emptyMessage = 'Error loading transactions for contact'; diff --git a/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts b/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts index 0e0b69d06e..6411f59ee2 100644 --- a/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts +++ b/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts @@ -337,7 +337,7 @@ describe('ContactLookupComponent', () => { }; component.onFecApiCandidateLookupDataSelect(testFecApiCandidateLookupData); tick(500); - expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); // eslint-disable-line @typescript-eslint/no-non-null-assertion + expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); expect(eventEmitterEmitSpy).toHaveBeenCalledOnceWith( Contact.fromJSON({ type: ContactTypes.CANDIDATE, @@ -387,7 +387,7 @@ describe('ContactLookupComponent', () => { }; component.onFecApiCandidateLookupDataSelect(testFecApiCandidateLookupData); tick(500); - expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); // eslint-disable-line @typescript-eslint/no-non-null-assertion + expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); expect(eventEmitterEmitSpy).toHaveBeenCalledOnceWith( Contact.fromJSON({ type: ContactTypes.CANDIDATE, diff --git a/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts b/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts index 28eb9848d3..4d52b51f0a 100644 --- a/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts +++ b/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts @@ -144,7 +144,7 @@ export class LoanTermsDatesInputComponent extends BaseInputComponent implements if (newInterestRate.length > 0) { if (!newInterestRate.endsWith('%')) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + interestField.setValue(newInterestRate + '%'); textInput?.setSelectionRange(newInterestRate.length, newInterestRate.length); diff --git a/front-end/src/app/shared/utils/route.utils.ts b/front-end/src/app/shared/utils/route.utils.ts index 3eb1606823..697a6ba099 100644 --- a/front-end/src/app/shared/utils/route.utils.ts +++ b/front-end/src/app/shared/utils/route.utils.ts @@ -18,7 +18,7 @@ export function collectRouteData(router: Router): RouteData { let data = {} as RouteData; const stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root]; while (stack.length > 0) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const route = stack.pop()!; data = { ...data, ...route.data }; stack.push(...route.children); From 5e3a7a70f9ef37219ecb1b0da8bf2baa94521f57 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 29 Aug 2024 15:42:45 -0400 Subject: [PATCH 11/62] Converts a stranded expression into an if-statement --- .../components/inputs/input-number/input-number.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/front-end/src/app/shared/components/inputs/input-number/input-number.component.ts b/front-end/src/app/shared/components/inputs/input-number/input-number.component.ts index 340ccc3ed0..21eead9830 100644 --- a/front-end/src/app/shared/components/inputs/input-number/input-number.component.ts +++ b/front-end/src/app/shared/components/inputs/input-number/input-number.component.ts @@ -762,7 +762,9 @@ export class InputNumberComponent implements OnInit, ControlValueAccessor { if (this.isValueChanged(currentValue, newValue)) { (this.input as ElementRef).nativeElement.value = this.formatValue(newValue); this.input?.nativeElement.setAttribute('aria-valuenow', newValue?.toString() ?? ''); - !this.isBlurUpdateOnMode && this.updateModel(newValue); + if (!this.isBlurUpdateOnMode) { + this.updateModel(newValue); + } this.inputEvent.emit({ originalEvent: event, value: newValue?.toString() ?? '', From 061ca102508574c913f23a5a66ab1c5bfd4fd6c7 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 29 Aug 2024 15:49:10 -0400 Subject: [PATCH 12/62] Runs prettier --write --- front-end/eslint.config.mjs | 100 ++++++++++-------- .../contact-lookup.component.spec.ts | 4 +- .../loan-terms-dates-input.component.ts | 1 - front-end/src/app/shared/utils/route.utils.ts | 1 - 4 files changed, 56 insertions(+), 50 deletions(-) diff --git a/front-end/eslint.config.mjs b/front-end/eslint.config.mjs index 464ec42575..0c546da074 100644 --- a/front-end/eslint.config.mjs +++ b/front-end/eslint.config.mjs @@ -1,62 +1,70 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import js from '@eslint/js'; +import { FlatCompat } from '@eslint/eslintrc'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, }); -export default [{ - ignores: [ - "src/**/*.png", - "src/**/*.json", - "src/**/*.scss", - "src/**/*.woff", - "src/**/*.svg", - ], -}, ...compat.extends( - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates", -).map(config => ({ - ...config, - files: ["**/*.ts"], -})), { - files: ["**/*.ts"], +export default [ + { + ignores: ['src/**/*.png', 'src/**/*.json', 'src/**/*.scss', 'src/**/*.woff', 'src/**/*.svg'], + }, + ...compat + .extends( + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@angular-eslint/recommended', + 'plugin:@angular-eslint/template/process-inline-templates', + ) + .map((config) => ({ + ...config, + files: ['**/*.ts'], + })), + { + files: ['**/*.ts'], languageOptions: { - ecmaVersion: 5, - sourceType: "script", + ecmaVersion: 5, + sourceType: 'script', - parserOptions: { - project: ["tsconfig.json"], - createDefaultProgram: true, - }, + parserOptions: { + project: ['tsconfig.json'], + createDefaultProgram: true, + }, }, rules: { - "@angular-eslint/directive-selector": ["error", { - type: "attribute", - prefix: "app", - style: "camelCase", - }], + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'app', + style: 'camelCase', + }, + ], - "@angular-eslint/component-selector": ["error", { - type: "element", - prefix: "app", - style: "kebab-case", - }], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'app', + style: 'kebab-case', + }, + ], }, -}, ...compat.extends("plugin:@angular-eslint/template/recommended").map(config => ({ + }, + ...compat.extends('plugin:@angular-eslint/template/recommended').map((config) => ({ ...config, - files: ["**/*.html"], -})), { - files: ["**/*.html"], + files: ['**/*.html'], + })), + { + files: ['**/*.html'], rules: {}, -}]; \ No newline at end of file + }, +]; diff --git a/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts b/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts index 6411f59ee2..5f3c8735d8 100644 --- a/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts +++ b/front-end/src/app/shared/components/contact-lookup/contact-lookup.component.spec.ts @@ -337,7 +337,7 @@ describe('ContactLookupComponent', () => { }; component.onFecApiCandidateLookupDataSelect(testFecApiCandidateLookupData); tick(500); - expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); + expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); expect(eventEmitterEmitSpy).toHaveBeenCalledOnceWith( Contact.fromJSON({ type: ContactTypes.CANDIDATE, @@ -387,7 +387,7 @@ describe('ContactLookupComponent', () => { }; component.onFecApiCandidateLookupDataSelect(testFecApiCandidateLookupData); tick(500); - expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); + expect(getCandidateDetailsSpy).toHaveBeenCalledOnceWith(testFecApiCandidateLookupData.candidate_id!); expect(eventEmitterEmitSpy).toHaveBeenCalledOnceWith( Contact.fromJSON({ type: ContactTypes.CANDIDATE, diff --git a/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts b/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts index 4d52b51f0a..678a1a18cb 100644 --- a/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts +++ b/front-end/src/app/shared/components/inputs/loan-terms-dates-input/loan-terms-dates-input.component.ts @@ -144,7 +144,6 @@ export class LoanTermsDatesInputComponent extends BaseInputComponent implements if (newInterestRate.length > 0) { if (!newInterestRate.endsWith('%')) { - interestField.setValue(newInterestRate + '%'); textInput?.setSelectionRange(newInterestRate.length, newInterestRate.length); diff --git a/front-end/src/app/shared/utils/route.utils.ts b/front-end/src/app/shared/utils/route.utils.ts index 697a6ba099..4161971b4b 100644 --- a/front-end/src/app/shared/utils/route.utils.ts +++ b/front-end/src/app/shared/utils/route.utils.ts @@ -18,7 +18,6 @@ export function collectRouteData(router: Router): RouteData { let data = {} as RouteData; const stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root]; while (stack.length > 0) { - const route = stack.pop()!; data = { ...data, ...route.data }; stack.push(...route.children); From d8d0f3eee75fd9c822240990c0d9e8d1b11d622e Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Fri, 30 Aug 2024 11:02:06 -0400 Subject: [PATCH 13/62] Fix issue with e2e populating Candidate district field --- .../candidate-office-input.component.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts index 800ad4ac02..1c2cf5ec64 100644 --- a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts +++ b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.ts @@ -90,9 +90,12 @@ export class CandidateOfficeInputComponent extends BaseInputComponent implements } else { this.candidateDistrictOptions = []; } - this.form - .get(this.districtFormControlName) - ?.setValue(this.candidateDistrictOptions.length === 1 ? this.candidateDistrictOptions[0].value : null); + const currentDistrictValue = this.form.get(this.districtFormControlName)?.value; + if (!this.candidateDistrictOptions.map((option) => option.value).includes(currentDistrictValue)) { + this.form + .get(this.districtFormControlName) + ?.setValue(this.candidateDistrictOptions.length === 1 ? this.candidateDistrictOptions[0].value : null); + } }); // Run election_code, office, and state valueChange logic when initializing form elements From 70ca2911b6502d47c209bc0fcaad8070dc1efc20 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Thu, 5 Sep 2024 14:47:40 -0400 Subject: [PATCH 14/62] 1585 default user role on add new user --- .../committee-member-dialog.component.spec.ts | 5 +++++ .../committee-member-dialog.component.ts | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts index 6c84d7ebfa..c5391269e8 100644 --- a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts +++ b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts @@ -59,4 +59,9 @@ describe('CommitteeMemberDialogComponent', () => { expect(component.form.valid).toBeFalse(); }); + + it('should default role to first in list', () => { + component.ngOnChanges(); + expect(component.form.get('role')?.value.value).toBe('COMMITTEE_ADMINISTRATOR'); + }); }); diff --git a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.ts b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.ts index 1eb18bd844..e78e63e038 100644 --- a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.ts +++ b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.ts @@ -1,10 +1,10 @@ import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { DestroyerComponent } from '../app-destroyer.component'; -import { ConfirmationService } from 'primeng/api'; import { CommitteeMemberRoles } from 'app/shared/models/committee-member.model'; import { CommitteeMemberService } from 'app/shared/services/committee-member.service'; import { CommitteeMemberEmailValidator, emailValidator } from 'app/shared/utils/validators.utils'; +import { ConfirmationService } from 'primeng/api'; +import { DestroyerComponent } from '../app-destroyer.component'; @Component({ selector: 'app-committee-member-dialog', @@ -58,6 +58,7 @@ export class CommitteeMemberDialogComponent extends DestroyerComponent implement ngOnChanges(): void { if (this.detailVisible) { this.form.reset(); + this.form.get('role')?.setValue(this.roleOptions[0].value); this.formSubmitted = false; this.dialog?.nativeElement.showModal(); } From 8874c248b9a637db2202eaa4216abc236368a244 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Thu, 5 Sep 2024 15:03:14 -0400 Subject: [PATCH 15/62] 1585 add test coverage --- .../committee-member-dialog.component.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts index c5391269e8..5787371157 100644 --- a/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts +++ b/front-end/src/app/shared/components/committee-member-dialog/committee-member-dialog.component.spec.ts @@ -61,7 +61,8 @@ describe('CommitteeMemberDialogComponent', () => { }); it('should default role to first in list', () => { + component.detailVisible = true; component.ngOnChanges(); - expect(component.form.get('role')?.value.value).toBe('COMMITTEE_ADMINISTRATOR'); + expect(component.form.get('role')?.value).toBe('COMMITTEE_ADMINISTRATOR'); }); }); From be255e4235375b2bf092d477905b0e303811679a Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Thu, 5 Sep 2024 15:48:47 -0400 Subject: [PATCH 16/62] WIP, works for single-transactions --- front-end/src/app/app.module.ts | 2 ++ ...redes-transaction-type-detail.component.ts | 7 ++--- .../transaction-container.component.html | 20 ++---------- .../transaction-container.component.ts | 2 -- .../transaction-navigation.component.html | 2 -- .../transaction-navigation.component.ts | 8 +---- .../navigation-control-bar.component.html | 2 -- .../navigation-control-bar.component.ts | 8 +---- .../navigation-control.component.ts | 7 +++-- .../transaction-type-base.component.ts | 31 ++++++++++++------- front-end/src/app/store/app-state.model.ts | 2 ++ .../src/app/store/navigation-event.actions.ts | 6 ++++ .../src/app/store/navigation-event.reducer.ts | 11 +++++++ .../app/store/navigation-event.selectors.ts | 4 +++ 14 files changed, 55 insertions(+), 57 deletions(-) create mode 100644 front-end/src/app/store/navigation-event.actions.ts create mode 100644 front-end/src/app/store/navigation-event.reducer.ts create mode 100644 front-end/src/app/store/navigation-event.selectors.ts diff --git a/front-end/src/app/app.module.ts b/front-end/src/app/app.module.ts index 2a7726b96c..dd7474de6c 100644 --- a/front-end/src/app/app.module.ts +++ b/front-end/src/app/app.module.ts @@ -15,6 +15,7 @@ import { AppState } from './store/app-state.model'; import { committeeAccountReducer } from './store/committee-account.reducer'; import { singleClickReducer } from './store/single-click.reducer'; import { loginReducer } from './store/user-login-data.reducer'; +import { navigationEventReducer } from './store/navigation-event.reducer'; // PrimeNG import { ConfirmationService, MessageService } from 'primeng/api'; @@ -112,6 +113,7 @@ const metaReducers: Array> = [localStorageSyncRedu singleClickDisabled: singleClickReducer, userLoginData: loginReducer, activeReport: activeReportReducer, + navigationEvent: navigationEventReducer, }, { metaReducers }, ), diff --git a/front-end/src/app/reports/transactions/reatt-redes-transaction-type-detail/reatt-redes-transaction-type-detail.component.ts b/front-end/src/app/reports/transactions/reatt-redes-transaction-type-detail/reatt-redes-transaction-type-detail.component.ts index ee0939d1e1..4cc35f139b 100644 --- a/front-end/src/app/reports/transactions/reatt-redes-transaction-type-detail/reatt-redes-transaction-type-detail.component.ts +++ b/front-end/src/app/reports/transactions/reatt-redes-transaction-type-detail/reatt-redes-transaction-type-detail.component.ts @@ -1,4 +1,4 @@ -import { Component, OnChanges, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { ReattRedesTransactionTypeBaseComponent } from '../../../shared/components/transaction-type-base/reatt-redes-transaction-type-base.component'; import { ConfirmationService, MessageService } from 'primeng/api'; import { TransactionService } from '../../../shared/services/transaction.service'; @@ -14,10 +14,7 @@ import { ReportService } from '../../../shared/services/report.service'; templateUrl: './reatt-redes-transaction-type-detail.component.html', styleUrls: ['../transaction.scss', './reatt-redes-transaction-type-detail.component.scss'], }) -export class ReattRedesTransactionTypeDetailComponent - extends ReattRedesTransactionTypeBaseComponent - implements OnInit, OnChanges -{ +export class ReattRedesTransactionTypeDetailComponent extends ReattRedesTransactionTypeBaseComponent implements OnInit { constructor( protected override messageService: MessageService, public override transactionService: TransactionService, diff --git a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html index 49ecf2e1a2..853197dee5 100644 --- a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html +++ b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html @@ -2,25 +2,12 @@
- - - + + + @@ -29,7 +16,6 @@
diff --git a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.ts b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.ts index ae41d60022..e930662847 100644 --- a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.ts +++ b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.ts @@ -8,7 +8,6 @@ import { DestroyerComponent } from 'app/shared/components/app-destroyer.componen import { ReattRedesTypes, ReattRedesUtils } from '../../../shared/utils/reatt-redes/reatt-redes.utils'; import { selectActiveReport } from '../../../store/active-report.selectors'; import { ReportService } from '../../../shared/services/report.service'; -import { NavigationEvent } from '../../../shared/models/transaction-navigation-controls.model'; @Component({ selector: 'app-transaction-container', @@ -19,7 +18,6 @@ export class TransactionContainerComponent extends DestroyerComponent implements transaction: Transaction | undefined; isEditableReport = true; isEditableTransaction = true; - navigationEvent?: NavigationEvent; constructor( private activatedRoute: ActivatedRoute, diff --git a/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.html b/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.html index 01bc22b5df..26d6d18f43 100644 --- a/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.html +++ b/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.html @@ -4,7 +4,6 @@ @@ -15,7 +14,6 @@ diff --git a/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.ts b/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.ts index 9b292deaa4..f8cad5efc5 100644 --- a/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.ts +++ b/front-end/src/app/reports/transactions/transaction-navigation/transaction-navigation.component.ts @@ -1,9 +1,8 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { Transaction } from 'app/shared/models/transaction.model'; import { GO_BACK_CONTROL, NavigationControl, - NavigationEvent, TransactionNavigationControls, } from 'app/shared/models/transaction-navigation-controls.model'; @@ -14,11 +13,6 @@ import { export class TransactionNavigationComponent { @Input() isEditable = true; @Input() transaction?: Transaction; - @Output() navigate: EventEmitter = new EventEmitter(); - - handleNavigate($event: NavigationEvent) { - this.navigate.emit($event); - } getNavigationControls(): TransactionNavigationControls { if (!this.isEditable) return new TransactionNavigationControls([], [GO_BACK_CONTROL], []); diff --git a/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.html b/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.html index 1d1871a7fa..4ae6837c36 100644 --- a/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.html +++ b/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.html @@ -5,7 +5,6 @@ @@ -16,7 +15,6 @@ diff --git a/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.ts b/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.ts index 44f1a663c2..cc1c8224db 100644 --- a/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.ts +++ b/front-end/src/app/shared/components/navigation-control-bar/navigation-control-bar.component.ts @@ -1,8 +1,7 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { Transaction } from 'app/shared/models/transaction.model'; import { NavigationControl, - NavigationEvent, TransactionNavigationControls, } from 'app/shared/models/transaction-navigation-controls.model'; @@ -14,13 +13,8 @@ import { export class NavigationControlBarComponent { @Input() navigationControls: TransactionNavigationControls = new TransactionNavigationControls(); @Input() transaction?: Transaction; - @Output() navigate: EventEmitter = new EventEmitter(); getNavigationControls(section: 'inline' | 'cancel' | 'continue'): NavigationControl[] { return this.navigationControls.getNavigationControls(section, this.transaction); } - - handleNavigate(navigationEvent: NavigationEvent): void { - this.navigate.emit(navigationEvent); - } } diff --git a/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts b/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts index d6baf5e130..336e9bcee2 100644 --- a/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts +++ b/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts @@ -20,6 +20,7 @@ import { ScheduleC2TransactionTypeLabels } from 'app/shared/models/schc2-transac import { ScheduleETransactionTypeLabels } from 'app/shared/models/sche-transaction.model'; import { Store } from '@ngrx/store'; import { clone } from 'lodash'; +import { navigationEventSetAction } from 'app/store/navigation-event.actions'; @Component({ selector: 'app-navigation-control', @@ -93,14 +94,14 @@ export class NavigationControlComponent implements OnInit { this.transaction, destinationTransactionType, ); - this.navigate.emit(navigationEvent); + this.store.dispatch(navigationEventSetAction(navigationEvent)); } onDropdownChange(event: { value: NavigationEvent }): void { // Handle click event for dropdown version of control if (event.value.action) { - const navEvent = clone(event.value); - this.navigate.emit(navEvent); + const navigationEvent = clone(event.value); + this.store.dispatch(navigationEventSetAction(navigationEvent)); } } diff --git a/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts b/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts index beb61016da..7d65fe75e4 100644 --- a/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts +++ b/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { Store } from '@ngrx/store'; @@ -28,13 +28,14 @@ import { TransactionFormUtils } from './transaction-form.utils'; import { ReattRedesUtils } from 'app/shared/utils/reatt-redes/reatt-redes.utils'; import { Report, ReportTypes } from 'app/shared/models/report.model'; import { blurActiveInput } from 'app/shared/utils/form.utils'; +import { selectNavigationEvent } from 'app/store/navigation-event.selectors'; +import { navigationEventClearAction } from 'app/store/navigation-event.actions'; @Component({ template: '', }) -export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, OnChanges { +export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy { @Input() transaction: Transaction | undefined; - @Input() navigationEvent?: NavigationEvent; formProperties: string[] = []; transactionType?: TransactionType; contactTypeOptions: PrimeOptions = LabelUtils.getPrimeOptions(ContactTypeLabels); @@ -48,6 +49,7 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, committeeAccount?: CommitteeAccount; activeReport$: Observable; activeReportId: string; + navigationEvent$: Observable; reportTypes = ReportTypes; saveSuccessMessage: Message = { @@ -71,12 +73,7 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, ) { this.activeReport$ = this.store.select(selectActiveReport).pipe(takeUntil(this.destroy$)); this.activeReportId = this.activatedRoute.snapshot.params['reportId'] ?? ''; - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['navigationEvent'] && this.navigationEvent) { - this.handleNavigate(this.navigationEvent); - } + this.navigationEvent$ = this.store.select(selectNavigationEvent).pipe(takeUntil(this.destroy$)); } ngOnInit(): void { @@ -89,6 +86,7 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, .subscribe((committeeAccount) => { this.committeeAccount = committeeAccount; }); + this.transactionType = this.transaction.transactionType; this.templateMap = this.transactionType.templateMap; this.formProperties = this.transactionType.getFormControlNames(); @@ -124,6 +122,14 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, this.reportService.isEditable(report) && !ReattRedesUtils.isCopyFromPreviousReport(this.transaction); if (!this.isEditable) this.form.disable(); }); + + this.store.dispatch(navigationEventClearAction()); + this.navigationEvent$.subscribe((navEvent) => { + if (navEvent) { + this.handleNavigate(navEvent); + this.store.dispatch(navigationEventClearAction()); + } + }); } ngOnDestroy(): void { @@ -223,19 +229,20 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy, handleNavigate(navigationEvent: NavigationEvent): void { this.formSubmitted = true; + const navEvent = { ...navigationEvent }; - if (navigationEvent.action === NavigationAction.SAVE) { + if (navEvent.action === NavigationAction.SAVE) { if (this.isInvalid()) { this.store.dispatch(singleClickEnableAction()); return; } this.confirmation$.subscribe((confirmed: boolean) => { // if every confirmation was accepted - if (confirmed) this.save(navigationEvent); + if (confirmed) this.save(navEvent); else this.store.dispatch(singleClickEnableAction()); }); } else { - this.navigateTo(navigationEvent); + this.navigateTo(navEvent); } } diff --git a/front-end/src/app/store/app-state.model.ts b/front-end/src/app/store/app-state.model.ts index bd63c05cd7..ee82daa4b4 100644 --- a/front-end/src/app/store/app-state.model.ts +++ b/front-end/src/app/store/app-state.model.ts @@ -1,10 +1,12 @@ import { CommitteeAccount } from 'app/shared/models/committee-account.model'; import { UserLoginData } from 'app/shared/models/user.model'; import { Report } from 'app/shared/models/report.model'; +import { NavigationEvent } from 'app/shared/models/transaction-navigation-controls.model'; export interface AppState { committeeAccount: CommitteeAccount; singleClickDisabled: boolean; userLoginData: UserLoginData; activeReport: Report | undefined; + navigationEvent: NavigationEvent | undefined; } diff --git a/front-end/src/app/store/navigation-event.actions.ts b/front-end/src/app/store/navigation-event.actions.ts new file mode 100644 index 0000000000..5d17e39dcb --- /dev/null +++ b/front-end/src/app/store/navigation-event.actions.ts @@ -0,0 +1,6 @@ +import { createAction, props } from '@ngrx/store'; +import { NavigationEvent } from 'app/shared/models/transaction-navigation-controls.model'; + +export const navigationEventSetAction = createAction('[Navigation Event] Created', props()); + +export const navigationEventClearAction = createAction('[Navigation Event] Queue Cleared'); diff --git a/front-end/src/app/store/navigation-event.reducer.ts b/front-end/src/app/store/navigation-event.reducer.ts new file mode 100644 index 0000000000..342ef19127 --- /dev/null +++ b/front-end/src/app/store/navigation-event.reducer.ts @@ -0,0 +1,11 @@ +import { Action, createReducer, on } from '@ngrx/store'; +import { navigationEventClearAction, navigationEventSetAction } from './navigation-event.actions'; +import { NavigationEvent } from 'app/shared/models/transaction-navigation-controls.model'; + +export const initialState: NavigationEvent | undefined = undefined; + +export const navigationEventReducer = createReducer( + initialState, + on(navigationEventSetAction, (_state, update) => update), + on(navigationEventClearAction, () => undefined), +); diff --git a/front-end/src/app/store/navigation-event.selectors.ts b/front-end/src/app/store/navigation-event.selectors.ts new file mode 100644 index 0000000000..3a3f2222b7 --- /dev/null +++ b/front-end/src/app/store/navigation-event.selectors.ts @@ -0,0 +1,4 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { NavigationEvent } from 'app/shared/models/transaction-navigation-controls.model'; + +export const selectNavigationEvent = createFeatureSelector('navigationEvent'); From 772b2d10957b3bf8f8f679c972c8d35119b72a79 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Fri, 6 Sep 2024 09:55:58 -0400 Subject: [PATCH 17/62] Fixes readonly bug --- .../navigation-control/navigation-control.component.ts | 7 +++---- .../transaction-type-base.component.ts | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts b/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts index 336e9bcee2..3caab1d4be 100644 --- a/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts +++ b/front-end/src/app/shared/components/navigation-control/navigation-control.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { Transaction, TransactionTypes } from 'app/shared/models/transaction.model'; import { ControlType, @@ -19,7 +19,7 @@ import { FormControl } from '@angular/forms'; import { ScheduleC2TransactionTypeLabels } from 'app/shared/models/schc2-transaction.model'; import { ScheduleETransactionTypeLabels } from 'app/shared/models/sche-transaction.model'; import { Store } from '@ngrx/store'; -import { clone } from 'lodash'; +import { clone, cloneDeep } from 'lodash'; import { navigationEventSetAction } from 'app/store/navigation-event.actions'; @Component({ @@ -30,7 +30,6 @@ import { navigationEventSetAction } from 'app/store/navigation-event.actions'; export class NavigationControlComponent implements OnInit { @Input() navigationControl?: NavigationControl; @Input() transaction?: Transaction; - @Output() navigate: EventEmitter = new EventEmitter(); public controlType: 'button' | 'dropdown' = 'button'; public dropdownOptions?: any; // eslint-disable-line @typescript-eslint/no-explicit-any dropdownControl = new FormControl(''); @@ -91,7 +90,7 @@ export class NavigationControlComponent implements OnInit { const navigationEvent = new NavigationEvent( this.navigationControl?.navigationAction, this.navigationControl?.navigationDestination, - this.transaction, + cloneDeep(this.transaction), destinationTransactionType, ); this.store.dispatch(navigationEventSetAction(navigationEvent)); diff --git a/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts b/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts index 7d65fe75e4..4b39306271 100644 --- a/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts +++ b/front-end/src/app/shared/components/transaction-type-base/transaction-type-base.component.ts @@ -126,7 +126,8 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy this.store.dispatch(navigationEventClearAction()); this.navigationEvent$.subscribe((navEvent) => { if (navEvent) { - this.handleNavigate(navEvent); + const navigationEvent = { ...navEvent }; + this.handleNavigate(navigationEvent); this.store.dispatch(navigationEventClearAction()); } }); @@ -229,20 +230,19 @@ export abstract class TransactionTypeBaseComponent implements OnInit, OnDestroy handleNavigate(navigationEvent: NavigationEvent): void { this.formSubmitted = true; - const navEvent = { ...navigationEvent }; - if (navEvent.action === NavigationAction.SAVE) { + if (navigationEvent.action === NavigationAction.SAVE) { if (this.isInvalid()) { this.store.dispatch(singleClickEnableAction()); return; } this.confirmation$.subscribe((confirmed: boolean) => { // if every confirmation was accepted - if (confirmed) this.save(navEvent); + if (confirmed) this.save(navigationEvent); else this.store.dispatch(singleClickEnableAction()); }); } else { - this.navigateTo(navEvent); + this.navigateTo(navigationEvent); } } From 5c78b50b0aa70a53f1d8cf7c8c99a465d1025a63 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Fri, 6 Sep 2024 11:21:53 -0400 Subject: [PATCH 18/62] Fixes broken unit tests --- .../transaction-detail.component.spec.ts | 8 ++++++-- .../navigation-control.component.spec.ts | 9 ++++++--- front-end/src/app/shared/utils/unit-test.utils.ts | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts b/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts index 47edca1c7f..c6cc1569c1 100644 --- a/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts +++ b/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts @@ -85,10 +85,14 @@ describe('TransactionDetailComponent', () => { }); it('#handleNavigate() should not save an invalid record', () => { + const navSpy = spyOn(component, 'navigateTo'); + const saveSpy = spyOn(component, 'save'); + component.form.patchValue({ ...transaction, ...{ contributor_state: 'not-valid' } }); + console.log('HEY LISTEN', component.form); component.handleNavigate(new NavigationEvent(NavigationAction.SAVE, NavigationDestination.LIST, transaction)); expect(component.form.invalid).toBe(true); - httpTestingController.expectNone(`${environment.apiUrl}/transactions/1/?schema=TRIBAL_RECEIPT&fields_to_validate=`); - httpTestingController.verify(); + expect(navSpy).not.toHaveBeenCalled(); + expect(saveSpy).not.toHaveBeenCalled(); }); }); diff --git a/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts b/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts index a3b7e927e7..cbeb559eeb 100644 --- a/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts +++ b/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts @@ -14,10 +14,12 @@ import { Dropdown, DropdownModule } from 'primeng/dropdown'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; import { testMockStore } from '../../utils/unit-test.utils'; import { provideMockStore } from '@ngrx/store/testing'; +import { Store } from '@ngrx/store'; describe('NavigationControlComponent', () => { let component: NavigationControlComponent; let fixture: ComponentFixture; + let store: Store; beforeEach(async () => { await TestBed.configureTestingModule({ @@ -25,6 +27,7 @@ describe('NavigationControlComponent', () => { declarations: [NavigationControlComponent, Dropdown], providers: [FormBuilder, provideMockStore(testMockStore)], }).compileComponents(); + store = TestBed.inject(Store); fixture = TestBed.createComponent(NavigationControlComponent); component = fixture.componentInstance; @@ -35,9 +38,9 @@ describe('NavigationControlComponent', () => { expect(component).toBeTruthy(); }); - it('should emit event', () => { + it('should dispatch a navigationEvent', () => { // spy on event emitter - spyOn(component.navigate, 'emit'); + const storeSpy = spyOn(store, 'dispatch'); // trigger the click const nativeElement = fixture.nativeElement; @@ -46,7 +49,7 @@ describe('NavigationControlComponent', () => { fixture.detectChanges(); - expect(component.navigate.emit).toHaveBeenCalledWith(new NavigationEvent()); + expect(storeSpy).toHaveBeenCalled(); }); describe('with dropdown', () => { diff --git a/front-end/src/app/shared/utils/unit-test.utils.ts b/front-end/src/app/shared/utils/unit-test.utils.ts index b58366a40a..b70d81c54f 100644 --- a/front-end/src/app/shared/utils/unit-test.utils.ts +++ b/front-end/src/app/shared/utils/unit-test.utils.ts @@ -3,6 +3,7 @@ import { selectActiveReport } from 'app/store/active-report.selectors'; import { initialState as initCommitteeAccount } from 'app/store/committee-account.reducer'; import { selectCommitteeAccount } from 'app/store/committee-account.selectors'; import { initialState as initUserLoginData } from 'app/store/user-login-data.reducer'; +import { initialState as initNavigationEvent } from 'app/store/navigation-event.reducer'; import { selectUserLoginData } from 'app/store/user-login-data.selectors'; import { CommitteeAccount } from '../models/committee-account.model'; import { CandidateOfficeTypes, Contact, ContactTypes } from '../models/contact.model'; @@ -15,6 +16,12 @@ import { AggregationGroups, Transaction, TransactionTypes } from '../models/tran import { UploadSubmission } from '../models/upload-submission.model'; import { UserLoginData } from '../models/user.model'; import { TransactionTypeUtils } from './transaction-type.utils'; +import { selectNavigationEvent } from 'app/store/navigation-event.selectors'; +import { + NavigationAction, + NavigationDestination, + NavigationEvent, +} from '../models/transaction-navigation-controls.model'; export const testCommitteeAccount: CommitteeAccount = CommitteeAccount.fromJSON({ affiliated_committee_name: 'NONE', @@ -110,16 +117,23 @@ export const testActiveReport: Form3X = Form3X.fromJSON({ }, }); +export const testNavigationEvent: NavigationEvent = { + action: NavigationAction.SAVE, + destination: NavigationDestination.LIST, +}; + export const testMockStore = { initialState: { fecfile_online_committeeAccount: initCommitteeAccount, fecfile_online_userLoginData: initUserLoginData, fecfile_online_activeReport: initActiveReport, + fecfile_online_navigationEvent: initNavigationEvent, }, selectors: [ { selector: selectCommitteeAccount, value: testCommitteeAccount }, { selector: selectUserLoginData, value: testUserLoginData }, { selector: selectActiveReport, value: testActiveReport }, + { selector: selectNavigationEvent, value: testNavigationEvent }, ], }; From 1df11c47532801e7b8b452a27b82bd74f706723b Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Fri, 6 Sep 2024 11:25:16 -0400 Subject: [PATCH 19/62] Linting fixes --- .../transaction-detail/transaction-detail.component.spec.ts | 5 +---- .../navigation-control/navigation-control.component.spec.ts | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts b/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts index c6cc1569c1..f211333bc6 100644 --- a/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts +++ b/front-end/src/app/reports/transactions/transaction-detail/transaction-detail.component.spec.ts @@ -1,4 +1,4 @@ -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; @@ -13,7 +13,6 @@ import { import { FecDatePipe } from 'app/shared/pipes/fec-date.pipe'; import { ReportService } from 'app/shared/services/report.service'; import { getTestTransactionByType, testMockStore, testTemplateMap } from 'app/shared/utils/unit-test.utils'; -import { environment } from 'environments/environment'; import { ConfirmationService, MessageService } from 'primeng/api'; import { ButtonModule } from 'primeng/button'; import { CalendarModule } from 'primeng/calendar'; @@ -31,7 +30,6 @@ import { AmountInputComponent } from 'app/shared/components/inputs/amount-input/ import { NavigationControlComponent } from 'app/shared/components/navigation-control/navigation-control.component'; describe('TransactionDetailComponent', () => { - let httpTestingController: HttpTestingController; let component: TransactionDetailComponent; let fixture: ComponentFixture; let reportService: ReportService; @@ -69,7 +67,6 @@ describe('TransactionDetailComponent', () => { }); beforeEach(() => { - httpTestingController = TestBed.inject(HttpTestingController); reportService = TestBed.inject(ReportService); spyOn(reportService, 'isEditable').and.returnValue(true); fixture = TestBed.createComponent(TransactionDetailComponent); diff --git a/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts b/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts index cbeb559eeb..3825a5840f 100644 --- a/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts +++ b/front-end/src/app/shared/components/navigation-control/navigation-control.component.spec.ts @@ -4,7 +4,6 @@ import { NavigationAction, NavigationControl, NavigationDestination, - NavigationEvent, } from 'app/shared/models/transaction-navigation-controls.model'; import { JOINT_FUNDRAISING_TRANSFER } from 'app/shared/models/transaction-types/JOINT_FUNDRAISING_TRANSFER.model'; import { TransactionTypeUtils } from 'app/shared/utils/transaction-type.utils'; From 2e844d47ce08ca469a40eb2a45462e863c31af42 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Fri, 6 Sep 2024 11:36:29 -0400 Subject: [PATCH 20/62] Corrects all instances of unused variable exceptions with caught errors --- .../manage-committee/manage-committee.component.ts | 6 ++---- .../select-report-dialog.component.spec.ts | 3 +-- .../components/contact-dialog/contact-dialog.component.ts | 3 +-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/front-end/src/app/committee/manage-committee/manage-committee.component.ts b/front-end/src/app/committee/manage-committee/manage-committee.component.ts index 3ce935b2e4..4de267590b 100644 --- a/front-end/src/app/committee/manage-committee/manage-committee.component.ts +++ b/front-end/src/app/committee/manage-committee/manage-committee.component.ts @@ -64,8 +64,7 @@ export class ManageCommitteeComponent extends TableListBaseComponent { component.selectedReport = component.availableReports[0]; try { await component.createReattribution(); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (error) { + } catch { console.log("shouldn't go here"); } const route = `/reports/transactions/report/${component.selectedReport.id}/create/${testScheduleATransaction.transaction_type_identifier}?reattribution=${testScheduleATransaction.id}`; diff --git a/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts b/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts index 92224941b1..42d94cbc32 100644 --- a/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts +++ b/front-end/src/app/shared/components/contact-dialog/contact-dialog.component.ts @@ -171,8 +171,7 @@ export class ContactDialogComponent extends DestroyerComponent implements OnInit this.totalTransactions = transactionsPage.count; this.tableLoading = false; this.emptyMessage = 'No data available in table'; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (error) { + } catch { this.tableLoading = false; this.emptyMessage = 'Error loading transactions for contact'; } From 98fe52efad25349c39c4e50d6544938e46a19e09 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Fri, 6 Sep 2024 12:25:35 -0400 Subject: [PATCH 21/62] Fixes race condition in checking the values of input fields --- .../reports-f24-independent-expenditures.cy.ts | 8 ++++---- front-end/cypress/e2e/F3X/disbursements.cy.ts | 17 ++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts b/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts index af77c5a270..dc304cd7ee 100644 --- a/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts +++ b/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts @@ -48,13 +48,13 @@ describe('Form 24 Independent Expenditures', () => { PageUtils.clickButton('Save'); PageUtils.clickLink('Independent Expenditure'); - cy.contains(individualContactFormData.first_name).should('exist'); - cy.contains(individualContactFormData.last_name).should('exist'); + cy.get('#first_name').should('have.value', individualContactFormData.first_name); + cy.get('#last_name').should('have.value', individualContactFormData.last_name); ReportListPage.editReport('12-DAY PRE-GENERAL'); PageUtils.clickSidebarItem('Manage your transactions'); PageUtils.clickLink('Independent Expenditure'); - cy.contains(individualContactFormData.first_name).should('exist'); - cy.contains(individualContactFormData.last_name).should('exist'); + cy.get('#first_name').should('have.value', individualContactFormData.first_name); + cy.get('#last_name').should('have.value', individualContactFormData.last_name); }); }); diff --git a/front-end/cypress/e2e/F3X/disbursements.cy.ts b/front-end/cypress/e2e/F3X/disbursements.cy.ts index 7a1c2ef892..9c28594f73 100644 --- a/front-end/cypress/e2e/F3X/disbursements.cy.ts +++ b/front-end/cypress/e2e/F3X/disbursements.cy.ts @@ -48,9 +48,11 @@ describe('Disbursements', () => { TransactionDetailPage.enterScheduleFormData(defaultTransactionFormData); PageUtils.clickButton('Save'); + cy.contains('Transactions in this report').should('exist'); PageUtils.clickLink('100% Federal Election Activity Payment'); - cy.contains(individualContactFormData.first_name).should('exist'); - cy.contains(individualContactFormData.last_name).should('exist'); + cy.contains('Address').should('exist'); + cy.get('#last_name').should('have.value', individualContactFormData.last_name); + cy.get('#first_name').should('have.value', individualContactFormData.first_name); }); it('should test Independent Expenditure - Void Schedule E disbursement', () => { @@ -67,7 +69,8 @@ describe('Disbursements', () => { PageUtils.clickButton('Save'); PageUtils.clickLink('Independent Expenditure - Void'); - cy.contains(organizationFormData.name).should('exist'); + cy.contains('Address').should('exist'); + cy.get('#organization_name').should('have.value', organizationFormData.name); }); it('should be able to link an Independent Expenditure to a Form 24', () => { @@ -85,8 +88,8 @@ describe('Disbursements', () => { PageUtils.clickButton('Save'); PageUtils.clickLink('Independent Expenditure'); - cy.contains(individualContactFormData.first_name).should('exist'); - cy.contains(individualContactFormData.last_name).should('exist'); + cy.get('#first_name').should('have.value', individualContactFormData.first_name); + cy.get('#last_name').should('have.value', individualContactFormData.last_name); PageUtils.clickSidebarItem('Manage your transactions'); PageUtils.getKabob('Independent Expenditure').click(); @@ -98,8 +101,8 @@ describe('Disbursements', () => { ReportListPage.editReport('FORM 24'); PageUtils.clickLink('Independent Expenditure'); - cy.contains(individualContactFormData.first_name).should('exist'); - cy.contains(individualContactFormData.last_name).should('exist'); + cy.get('#first_name').should('have.value', individualContactFormData.first_name); + cy.get('#last_name').should('have.value', individualContactFormData.last_name); }); it('Create an Other Disbursement transaction', () => { From aedb71103ef29c5a52006691ce3304d70906ab53 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Mon, 9 Sep 2024 14:48:54 -0400 Subject: [PATCH 22/62] Adds a test-writing tips section to the Cypress README --- front-end/cypress/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/front-end/cypress/README.md b/front-end/cypress/README.md index 8d9c0afbb8..b75c2e4b02 100644 --- a/front-end/cypress/README.md +++ b/front-end/cypress/README.md @@ -67,3 +67,7 @@ export CYPRESS_COMMITTEE_ID='' export CYPRESS_PASSWORD='' sudo circleci local execute -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e E2E_DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} -e E2E_DATABASE_URL=${E2E_DATABASE_URL} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} --job e2e-test ``` + +## Tips for Writing E2E Tests +- Assertions made immediately after a page load will sometimes check the previous page before the new page loads. Add checks to ensure that the new page has loaded where possible. +- The `.contains()` Cypress method cannot find the value of a text input field. For assertions, you can instead use the `.should('have.value', VALUE)` method. From 351ff5c38f9ab940292937b722fc8e41d001e865 Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Mon, 9 Sep 2024 15:50:55 -0400 Subject: [PATCH 23/62] Adds checks that ensure that new pages have loaded --- .../cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts | 2 ++ front-end/cypress/e2e/F3X/disbursements.cy.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts b/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts index dc304cd7ee..e3fcde422c 100644 --- a/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts +++ b/front-end/cypress/e2e/F24/reports-f24-independent-expenditures.cy.ts @@ -48,12 +48,14 @@ describe('Form 24 Independent Expenditures', () => { PageUtils.clickButton('Save'); PageUtils.clickLink('Independent Expenditure'); + cy.contains('Address').should('exist'); cy.get('#first_name').should('have.value', individualContactFormData.first_name); cy.get('#last_name').should('have.value', individualContactFormData.last_name); ReportListPage.editReport('12-DAY PRE-GENERAL'); PageUtils.clickSidebarItem('Manage your transactions'); PageUtils.clickLink('Independent Expenditure'); + cy.contains('Address').should('exist'); cy.get('#first_name').should('have.value', individualContactFormData.first_name); cy.get('#last_name').should('have.value', individualContactFormData.last_name); }); diff --git a/front-end/cypress/e2e/F3X/disbursements.cy.ts b/front-end/cypress/e2e/F3X/disbursements.cy.ts index 9c28594f73..821ec956ec 100644 --- a/front-end/cypress/e2e/F3X/disbursements.cy.ts +++ b/front-end/cypress/e2e/F3X/disbursements.cy.ts @@ -88,6 +88,7 @@ describe('Disbursements', () => { PageUtils.clickButton('Save'); PageUtils.clickLink('Independent Expenditure'); + cy.contains('Address').should('exist'); cy.get('#first_name').should('have.value', individualContactFormData.first_name); cy.get('#last_name').should('have.value', individualContactFormData.last_name); PageUtils.clickSidebarItem('Manage your transactions'); @@ -101,6 +102,7 @@ describe('Disbursements', () => { ReportListPage.editReport('FORM 24'); PageUtils.clickLink('Independent Expenditure'); + cy.contains('Address').should('exist'); cy.get('#first_name').should('have.value', individualContactFormData.first_name); cy.get('#last_name').should('have.value', individualContactFormData.last_name); }); From 33e3dcdb91b41681bcb3f3a0459fcf4c5cf40d0b Mon Sep 17 00:00:00 2001 From: Elaine Krauss Date: Mon, 9 Sep 2024 16:06:59 -0400 Subject: [PATCH 24/62] Updates README with tips on writing tests --- front-end/cypress/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/front-end/cypress/README.md b/front-end/cypress/README.md index 8d9c0afbb8..b75c2e4b02 100644 --- a/front-end/cypress/README.md +++ b/front-end/cypress/README.md @@ -67,3 +67,7 @@ export CYPRESS_COMMITTEE_ID='' export CYPRESS_PASSWORD='' sudo circleci local execute -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e E2E_DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} -e E2E_DATABASE_URL=${E2E_DATABASE_URL} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} --job e2e-test ``` + +## Tips for Writing E2E Tests +- Assertions made immediately after a page load will sometimes check the previous page before the new page loads. Add checks to ensure that the new page has loaded where possible. +- The `.contains()` Cypress method cannot find the value of a text input field. For assertions, you can instead use the `.should('have.value', VALUE)` method. From e3db8026c90adba24049adc2b843dd4e80a0b3ad Mon Sep 17 00:00:00 2001 From: toddlees Date: Tue, 10 Sep 2024 16:34:20 -0400 Subject: [PATCH 25/62] lint --- front-end/cypress/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/front-end/cypress/README.md b/front-end/cypress/README.md index b75c2e4b02..35315a9593 100644 --- a/front-end/cypress/README.md +++ b/front-end/cypress/README.md @@ -69,5 +69,6 @@ sudo circleci local execute -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e E2E_DJANGO_SECR ``` ## Tips for Writing E2E Tests -- Assertions made immediately after a page load will sometimes check the previous page before the new page loads. Add checks to ensure that the new page has loaded where possible. -- The `.contains()` Cypress method cannot find the value of a text input field. For assertions, you can instead use the `.should('have.value', VALUE)` method. + +- Assertions made immediately after a page load will sometimes check the previous page before the new page loads. Add checks to ensure that the new page has loaded where possible. +- The `.contains()` Cypress method cannot find the value of a text input field. For assertions, you can instead use the `.should('have.value', VALUE)` method. From 5fe20b92c92f9696b59d0976e72ad3ce9408cba3 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Wed, 11 Sep 2024 10:14:05 -0400 Subject: [PATCH 26/62] If only one district, default to district 0 --- front-end/src/app/shared/utils/label.utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/shared/utils/label.utils.ts b/front-end/src/app/shared/utils/label.utils.ts index dcb6789578..5571ca8809 100644 --- a/front-end/src/app/shared/utils/label.utils.ts +++ b/front-end/src/app/shared/utils/label.utils.ts @@ -60,7 +60,7 @@ export class LabelUtils { */ public static getCongressionalDistrictLabels(state: string): LabelList { const numberOfDistricts: number = CongressionalDistricts[state]; - if (numberOfDistricts === 0) { + if (numberOfDistricts < 2) { return [['00', '00']]; } From 3b3e92d5ea7bd641e5f34cfe06e574432df06408 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Thu, 29 Aug 2024 11:50:52 -0400 Subject: [PATCH 27/62] Add delete option for transactions --- .../transaction-list-table-base.component.ts | 6 ++++++ front-end/src/app/shared/models/transaction.model.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts index d12e5ca7a3..b37b20b5b6 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts @@ -42,6 +42,12 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom () => this.reportIsEditable, () => true, ), + new TableAction( + 'Delete', + this.deleteItem.bind(this), + (transaction: Transaction) => this.reportIsEditable && !!transaction.can_delete, + () => true, + ), new TableAction( 'Aggregate', this.forceAggregate.bind(this), diff --git a/front-end/src/app/shared/models/transaction.model.ts b/front-end/src/app/shared/models/transaction.model.ts index fc0e663319..45ccb30fba 100644 --- a/front-end/src/app/shared/models/transaction.model.ts +++ b/front-end/src/app/shared/models/transaction.model.ts @@ -88,6 +88,7 @@ export abstract class Transaction extends BaseModel { schema_name: string | undefined; line_label?: string; + can_delete?: boolean; /** * Some fields, such as ones in the spec but calculated by the backend, are listed From 0b96ddca2334beee2ac7390955bd2718ce9f6b2b Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Wed, 11 Sep 2024 10:06:00 -0400 Subject: [PATCH 28/62] Add transaction deletion --- front-end/src/app/app.component.html | 1 + front-end/src/app/app.module.ts | 2 + .../register-committee.component.html | 1 - .../cash-on-hand.component.html | 2 - .../submit-report-step1.component.html | 1 - .../submit-report-step2.component.html | 2 - .../transaction-container.component.html | 2 - .../transaction-list-table-base.component.ts | 2 +- .../transaction-list.component.html | 3 + .../transaction-list.component.spec.ts | 16 +++++ .../transaction-list.component.ts | 15 +++- .../transaction-receipts.component.spec.ts | 72 ++++++++++++------- .../table-list-base.component.ts | 14 ++-- .../components/table/table.component.html | 2 - 14 files changed, 93 insertions(+), 42 deletions(-) diff --git a/front-end/src/app/app.component.html b/front-end/src/app/app.component.html index d60e1e2f6c..8f3ce2fb75 100644 --- a/front-end/src/app/app.component.html +++ b/front-end/src/app/app.component.html @@ -1,5 +1,6 @@
+
diff --git a/front-end/src/app/app.module.ts b/front-end/src/app/app.module.ts index 2a7726b96c..7e63f7f8cc 100644 --- a/front-end/src/app/app.module.ts +++ b/front-end/src/app/app.module.ts @@ -57,6 +57,7 @@ import { UsersModule } from './users/users.module'; import { SchedulerAction, asyncScheduler } from 'rxjs'; import { ReportsModule } from './reports/reports.module'; import { ConfirmDialogModule } from 'primeng/confirmdialog'; +import { ToastModule } from 'primeng/toast'; // Save ngrx store to localStorage dynamically function localStorageSyncReducer(reducer: ActionReducer): ActionReducer { @@ -129,6 +130,7 @@ const metaReducers: Array> = [localStorageSyncRedu SharedModule, ReportsModule, ConfirmDialogModule, + ToastModule, ], providers: [ CookieService, diff --git a/front-end/src/app/committee/register-committee/register-committee.component.html b/front-end/src/app/committee/register-committee/register-committee.component.html index 303443e90a..7b01cc40be 100644 --- a/front-end/src/app/committee/register-committee/register-committee.component.html +++ b/front-end/src/app/committee/register-committee/register-committee.component.html @@ -77,7 +77,6 @@
{{ selectedCommittee.committee_id }}
- -

Cash on hand

diff --git a/front-end/src/app/reports/submission-workflow/submit-report-step1.component.html b/front-end/src/app/reports/submission-workflow/submit-report-step1.component.html index dbe11359bf..5b84b59342 100644 --- a/front-end/src/app/reports/submission-workflow/submit-report-step1.component.html +++ b/front-end/src/app/reports/submission-workflow/submit-report-step1.component.html @@ -1,4 +1,3 @@ -

Confirm information

diff --git a/front-end/src/app/reports/submission-workflow/submit-report-step2.component.html b/front-end/src/app/reports/submission-workflow/submit-report-step2.component.html index 9029c93eec..e6dfba786d 100644 --- a/front-end/src/app/reports/submission-workflow/submit-report-step2.component.html +++ b/front-end/src/app/reports/submission-workflow/submit-report-step2.component.html @@ -1,5 +1,3 @@ - -

Submit report

{{ report?.formLabel }}: {{ report?.formSubLabel }} diff --git a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html index 49ecf2e1a2..2b72fd6190 100644 --- a/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html +++ b/front-end/src/app/reports/transactions/transaction-container/transaction-container.component.html @@ -1,5 +1,3 @@ - -
this.reportIsEditable && !!transaction.can_delete, + (transaction: Transaction) => this.reportIsEditable && !!transaction?.can_delete, () => true, ), new TableAction( diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html index 32140c1ea9..40d0876ec8 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html @@ -25,15 +25,18 @@

Transactions in this report

diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.spec.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.spec.ts index db68c61052..a7b0d48819 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.spec.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.spec.ts @@ -16,6 +16,8 @@ import { ToolbarModule } from 'primeng/toolbar'; import { ConfirmDialogModule } from 'primeng/confirmdialog'; import { TransactionLoansAndDebtsComponent } from './transaction-loans-and-debts/transaction-loans-and-debts.component'; import { ReportStatus, ReportTypes } from 'app/shared/models/report.model'; +import { TransactionReceiptsComponent } from './transaction-receipts/transaction-receipts.component'; +import { TransactionDisbursementsComponent } from './transaction-disbursements/transaction-disbursements.component'; describe('TransactionListComponent', () => { let component: TransactionListComponent; @@ -131,4 +133,18 @@ describe('TransactionListComponent', () => { expect(component.tableActions[2].isEnabled({})).toEqual(true); expect(component.tableActions[3].isEnabled({})).toEqual(false); }); + + it('should call refreshTable on receipts, disbursements, and loans', () => { + component.receipts = { refreshTable: jasmine.createSpy('refreshTable') } as unknown as TransactionReceiptsComponent; + component.disbursements = { + refreshTable: jasmine.createSpy('refreshTable'), + } as unknown as TransactionDisbursementsComponent; + component.loans = { + refreshTable: jasmine.createSpy('refreshTable'), + } as unknown as TransactionLoansAndDebtsComponent; + component.refreshTables(); + expect(component.receipts.refreshTable).toHaveBeenCalled(); + expect(component.disbursements.refreshTable).toHaveBeenCalled(); + expect(component.loans.refreshTable).toHaveBeenCalled(); + }); }); diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.ts index 4289217822..79564108d2 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.ts @@ -6,8 +6,10 @@ import { selectActiveReport } from 'app/store/active-report.selectors'; import { TableAction } from 'app/shared/components/table-list-base/table-list-base.component'; import { DestroyerComponent } from 'app/shared/components/app-destroyer.component'; import { Report, ReportStatus, ReportTypes } from 'app/shared/models/report.model'; -import { ReportService } from '../../../shared/services/report.service'; import { Transaction } from '../../../shared/models/transaction.model'; +import { TransactionReceiptsComponent } from './transaction-receipts/transaction-receipts.component'; +import { TransactionDisbursementsComponent } from './transaction-disbursements/transaction-disbursements.component'; +import { TransactionLoansAndDebtsComponent } from './transaction-loans-and-debts/transaction-loans-and-debts.component'; @Component({ selector: 'app-transaction-list', @@ -73,10 +75,13 @@ export class TransactionListComponent extends DestroyerComponent implements OnIn ]; transaction?: Transaction; + @ViewChild(TransactionReceiptsComponent) receipts!: TransactionReceiptsComponent; + @ViewChild(TransactionDisbursementsComponent) disbursements!: TransactionDisbursementsComponent; + @ViewChild(TransactionLoansAndDebtsComponent) loans!: TransactionLoansAndDebtsComponent; + constructor( private router: Router, private store: Store, - private reportService: ReportService, ) { super(); } @@ -106,6 +111,12 @@ export class TransactionListComponent extends DestroyerComponent implements OnIn public onTableActionClick(action: TableAction, report?: Report) { action.action(report); } + + refreshTables() { + this.receipts.refreshTable(); + this.disbursements.refreshTable(); + this.loans.refreshTable(); + } } @Pipe({ name: 'memoCode' }) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts index da23b838e0..3e4ce32ad3 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts @@ -53,6 +53,7 @@ describe('TransactionReceiptsComponent', () => { SchATransaction.fromJSON({ id: transactionId, transaction_type_identifier: 'OFFSET_TO_OPERATING_EXPENDITURES', + can_delete: true, }), ), getTableData: () => of([]), @@ -78,47 +79,68 @@ describe('TransactionReceiptsComponent', () => { }); it('should show the correct row actions', () => { - expect(component.rowActions[0].isAvailable()).toEqual(true); - expect(component.rowActions[1].isAvailable()).toEqual(false); + const viewAction = component.rowActions.find((ra) => ra.label === 'View'); + const editAction = component.rowActions.find((ra) => ra.label === 'Edit'); + const aggregateAction = component.rowActions.find((ra) => ra.label === 'Aggregate'); + const unaggregateAction = component.rowActions.find((ra) => ra.label === 'Unaggregate'); + const itemizeAction = component.rowActions.find((ra) => ra.label === 'Itemize'); + const unitemizeAction = component.rowActions.find((ra) => ra.label === 'Unitemize'); + const reattributeAction = component.rowActions.find((ra) => ra.label === 'Reattribute'); + const deleteAction = component.rowActions.find((ra) => ra.label === 'Delete'); + expect(viewAction?.isAvailable()).toEqual(true); expect( - component.rowActions[2].isAvailable({ force_unaggregated: true, transactionType: { scheduleId: ScheduleIds.A } }), + deleteAction?.isAvailable({ + can_delete: true, + transactionType: { scheduleId: ScheduleIds.A }, + }), + ).toEqual(false); + expect(editAction?.isAvailable()).toEqual(false); + expect( + aggregateAction?.isAvailable({ force_unaggregated: true, transactionType: { scheduleId: ScheduleIds.A } }), ).toEqual(false); expect( - component.rowActions[3].isAvailable({ + unaggregateAction?.isAvailable({ force_unaggregated: false, transactionType: { scheduleId: ScheduleIds.A }, }), ).toEqual(false); - expect(component.rowActions[4].isAvailable({ itemized: false })).toEqual(false); - expect(component.rowActions[5].isAvailable({ itemized: true })).toEqual(false); + expect(itemizeAction?.isAvailable({ itemized: false })).toEqual(false); + expect(unitemizeAction?.isAvailable({ itemized: true })).toEqual(false); component.reportIsEditable = true; - expect(component.rowActions[0].isAvailable()).toEqual(false); - expect(component.rowActions[1].isAvailable()).toEqual(true); - expect( - component.rowActions[2].isAvailable({ force_unaggregated: true, transactionType: { scheduleId: ScheduleIds.A } }), - ).toEqual(true); + expect(viewAction?.isAvailable()).toEqual(false); + expect(editAction?.isAvailable()).toEqual(true); expect( - component.rowActions[3].isAvailable({ - force_unaggregated: false, + deleteAction?.isAvailable({ + can_delete: true, transactionType: { scheduleId: ScheduleIds.A }, }), ).toEqual(true); expect( - component.rowActions[4].isAvailable({ itemized: false, transactionType: { scheduleId: ScheduleIds.A } }), - ).toEqual(true); - expect( - component.rowActions[5].isAvailable({ itemized: true, transactionType: { scheduleId: ScheduleIds.A } }), + aggregateAction?.isAvailable({ force_unaggregated: true, transactionType: { scheduleId: ScheduleIds.A } }), ).toEqual(true); expect( - component.rowActions[12].isAvailable({ itemized: false, transactionType: { scheduleId: ScheduleIds.A } }), + unaggregateAction?.isAvailable({ + force_unaggregated: false, + transactionType: { scheduleId: ScheduleIds.A }, + }), ).toEqual(true); - expect(component.rowActions[0].isEnabled({})).toEqual(true); - expect(component.rowActions[1].isEnabled({})).toEqual(true); - expect(component.rowActions[2].isEnabled({})).toEqual(true); - expect(component.rowActions[3].isEnabled({})).toEqual(true); - expect(component.rowActions[4].isEnabled({})).toEqual(true); - expect(component.rowActions[5].isEnabled({})).toEqual(true); - expect(component.rowActions[12].isEnabled({})).toEqual(true); + expect(itemizeAction?.isAvailable({ itemized: false, transactionType: { scheduleId: ScheduleIds.A } })).toEqual( + true, + ); + expect(unitemizeAction?.isAvailable({ itemized: true, transactionType: { scheduleId: ScheduleIds.A } })).toEqual( + true, + ); + expect(reattributeAction?.isAvailable({ itemized: false, transactionType: { scheduleId: ScheduleIds.A } })).toEqual( + true, + ); + expect(viewAction?.isEnabled({})).toEqual(true); + expect(editAction?.isEnabled({})).toEqual(true); + expect(deleteAction?.isEnabled({})).toEqual(true); + expect(aggregateAction?.isEnabled({})).toEqual(true); + expect(unaggregateAction?.isEnabled({})).toEqual(true); + expect(itemizeAction?.isEnabled({})).toEqual(true); + expect(unitemizeAction?.isEnabled({})).toEqual(true); + expect(reattributeAction?.isEnabled({})).toEqual(true); }); it('test forceAggregate', fakeAsync(() => { diff --git a/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts b/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts index 631bd81d33..0591f5ab50 100644 --- a/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts +++ b/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, OnInit } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, EventEmitter, OnInit, Output } from '@angular/core'; import { ConfirmationService, MessageService } from 'primeng/api'; import { ListRestResponse } from '../../models/rest-api.model'; import { TableListService } from '../../interfaces/table-list-service.interface'; @@ -25,6 +25,8 @@ export abstract class TableListBaseComponent extends DestroyerComponent imple protected caption?: string; + @Output() reloadTables = new EventEmitter(); + constructor( protected messageService: MessageService, protected confirmationService: ConfirmationService, @@ -156,7 +158,7 @@ export abstract class TableListBaseComponent extends DestroyerComponent imple accept: () => { this.itemService.delete(item).subscribe(() => { this.item = this.getEmptyItem(); - this.refreshTable(); + this.refreshTable(true); this.messageService.add({ severity: 'success', summary: 'Successful', detail: 'Item Deleted', life: 3000 }); }); }, @@ -185,8 +187,12 @@ export abstract class TableListBaseComponent extends DestroyerComponent imple }); } - public refreshTable() { - this.loadTableItems({} as TableLazyLoadEvent); + public refreshTable(allTables = false) { + if (allTables) { + this.reloadTables.emit(); + } else { + this.loadTableItems({} as TableLazyLoadEvent); + } } /** diff --git a/front-end/src/app/shared/components/table/table.component.html b/front-end/src/app/shared/components/table/table.component.html index e073e58cdd..27a55b6658 100644 --- a/front-end/src/app/shared/components/table/table.component.html +++ b/front-end/src/app/shared/components/table/table.component.html @@ -128,5 +128,3 @@

{{ title }}

- - From 25ed3028682b4fef8707115e975eed890cbabdad Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 16 Sep 2024 09:15:06 -0400 Subject: [PATCH 29/62] Switch select report dialog from 'contributor' to 'election' --- .../select-report-dialog/select-report-dialog.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html index aae1e177f3..ec172b7ef5 100644 --- a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html +++ b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html @@ -8,7 +8,7 @@

Select a report

Pick the open report on which you would like to {{ reattRedes }} a contribution or a portion of it to a - different contributor. + different election.

diff --git a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.ts b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.ts index a16f8f09ee..ee2bb60b49 100644 --- a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.ts @@ -56,4 +56,8 @@ export class SelectReportDialogComponent implements OnInit { this.transaction = undefined; this.selectReportDialog?.nativeElement.close(); } + + get electContrib(): string { + return ReattRedesUtils.isReattribute(this.type) ? 'contributor' : 'election'; + } } From c09c7b7a441b96a1bffc0e27affd6b2ee4efbd83 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Tue, 17 Sep 2024 11:52:10 -0400 Subject: [PATCH 34/62] Cleanup getter names for better readability --- .../select-report-dialog.component.html | 4 ++-- .../select-report-dialog.component.spec.ts | 9 ++++++-- .../select-report-dialog.component.ts | 23 +++++++++++-------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html index 5f71deb88c..c0df6d6bac 100644 --- a/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html +++ b/front-end/src/app/reports/transactions/transaction-list/select-report-dialog/select-report-dialog.component.html @@ -7,8 +7,8 @@

Select a report

- Pick the open report on which you would like to {{ reattRedes }} a contribution or a portion of it to a - different {{ electContrib }}. + Pick the open report on which you would like to {{ actionLabel }} a contribution or a portion of it to a + different {{ actionTargetLabel }}.

+ + + + Date: Fri, 20 Sep 2024 17:24:35 -0400 Subject: [PATCH 40/62] format --- .../candidate-office-input/candidate-office-input.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss index 39ebae2687..8e87c3378d 100644 --- a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss +++ b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss @@ -1,4 +1,3 @@ - .p-disabled, .p-component:disabled, .p-dropdown:disabled { From ad7c1a76be7d1adc0ed50971143cb89681e6e95f Mon Sep 17 00:00:00 2001 From: toddlees Date: Fri, 20 Sep 2024 17:53:56 -0400 Subject: [PATCH 41/62] update confirmation dialog --- .../transaction-list-table-base.component.ts | 21 +++++++++++++++++++ .../transaction-list.component.html | 8 +++++++ .../app/reports/transactions/transaction.scss | 3 ++- .../table-list-base.component.ts | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts index a0599f9418..08378bf73e 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts @@ -334,4 +334,25 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom } return ''; } + + public override deleteItem(item: Transaction): void | Promise { + this.confirmationService.confirm({ + key: 'transaction-deletion-dialog', + message: + 'Deleting this transaction will also delete any linked transactions ' + + '(such as memos, in-kinds, and transfers). Please note that you cannot undo this action.', + accept: () => { + this.itemService.delete(item).subscribe(() => { + this.item = this.getEmptyItem(); + this.refreshTable(true); + this.messageService.add({ + severity: 'success', + summary: 'Successful', + detail: 'Transaction Deleted', + life: 3000, + }); + }); + }, + }); + } } diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html index 40d0876ec8..8d31735e1f 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html @@ -48,6 +48,14 @@

Transactions in this report

+ + + + + + + + diff --git a/front-end/src/app/reports/transactions/transaction.scss b/front-end/src/app/reports/transactions/transaction.scss index d1f7fb118f..f0ca6661ec 100644 --- a/front-end/src/app/reports/transactions/transaction.scss +++ b/front-end/src/app/reports/transactions/transaction.scss @@ -49,7 +49,8 @@ .confirm-footer { display: flex; - justify-content: space-between; + justify-content: space-around; + width: 100%; } .float-right { diff --git a/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts b/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts index 0591f5ab50..e03fff016a 100644 --- a/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts +++ b/front-end/src/app/shared/components/table-list-base/table-list-base.component.ts @@ -158,7 +158,7 @@ export abstract class TableListBaseComponent extends DestroyerComponent imple accept: () => { this.itemService.delete(item).subscribe(() => { this.item = this.getEmptyItem(); - this.refreshTable(true); + this.refreshTable(); this.messageService.add({ severity: 'success', summary: 'Successful', detail: 'Item Deleted', life: 3000 }); }); }, From a94c7cdea98b865f55e1c54fcefe6e369064f322 Mon Sep 17 00:00:00 2001 From: toddlees Date: Fri, 20 Sep 2024 17:54:33 -0400 Subject: [PATCH 42/62] format --- .../candidate-office-input.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss index 8e87c3378d..a1c6ed0456 100644 --- a/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss +++ b/front-end/src/app/shared/components/inputs/candidate-office-input/candidate-office-input.component.scss @@ -5,4 +5,4 @@ background: #f1f1f1; border: 2px solid gray; color: black; -} \ No newline at end of file +} From 29a61d9117475c457a90640da358c5524740197a Mon Sep 17 00:00:00 2001 From: toddlees Date: Mon, 23 Sep 2024 00:42:15 -0400 Subject: [PATCH 43/62] fixes dialog variables --- .../transaction-list/transaction-list.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html index 8d31735e1f..34b3f98670 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list.component.html @@ -48,11 +48,11 @@

Transactions in this report

- + - - + + From 857b5223d9ff3ba10700a5b8b9bec216024fe6be Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 23 Sep 2024 11:41:03 -0400 Subject: [PATCH 44/62] Update delete check for transaction so if the transaction is a carry forward loan or debt it isn't deletable from the UI --- .../transaction-list-table-base.component.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts index 08378bf73e..7853066545 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts @@ -9,6 +9,7 @@ import { ScheduleBTransactionTypes } from 'app/shared/models/schb-transaction.mo import { ScheduleCTransactionTypes } from 'app/shared/models/schc-transaction.model'; import { ScheduleC1TransactionTypes } from 'app/shared/models/schc1-transaction.model'; import { ScheduleDTransactionTypes } from 'app/shared/models/schd-transaction.model'; +import { TransactionType } from 'app/shared/models/transaction-type.model'; import { isPulledForwardLoan, ScheduleIds, Transaction } from 'app/shared/models/transaction.model'; import { QueryParams } from 'app/shared/services/api.service'; import { ReportService } from 'app/shared/services/report.service'; @@ -45,7 +46,7 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom new TableAction( 'Delete', this.deleteItem.bind(this), - (transaction: Transaction) => this.reportIsEditable && !!transaction?.can_delete, + (transaction: Transaction) => this.reportIsEditable && this.canDelete(transaction), () => true, ), new TableAction( @@ -335,6 +336,17 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom return ''; } + private canDelete(transaction: Transaction): boolean { + if ( + transaction.transaction_type_identifier !== 'LOAN_REPAYMENT_MADE' && + (transaction.loan_id || transaction.debt_id) + ) { + return false; + } + + return !!transaction?.can_delete; + } + public override deleteItem(item: Transaction): void | Promise { this.confirmationService.confirm({ key: 'transaction-deletion-dialog', From e733fc98cacf37524ffda522bc1743123a170956 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 23 Sep 2024 13:27:36 -0400 Subject: [PATCH 45/62] Fix issue where reattributed transaction was defaulting to can_delete false --- .../reatt-redes-transaction-type-base.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/app/shared/components/transaction-type-base/reatt-redes-transaction-type-base.component.ts b/front-end/src/app/shared/components/transaction-type-base/reatt-redes-transaction-type-base.component.ts index 9ec88a43de..9e0108e395 100644 --- a/front-end/src/app/shared/components/transaction-type-base/reatt-redes-transaction-type-base.component.ts +++ b/front-end/src/app/shared/components/transaction-type-base/reatt-redes-transaction-type-base.component.ts @@ -112,7 +112,7 @@ export abstract class ReattRedesTransactionTypeBaseComponent this.reattributedData.form, reatRedes.transactionType, ); - + reatRedes.can_delete = true; this.reattributedData.form.patchValue({ ...reatRedes }); this.reattributedData.form.get(reatRedes.transactionType.templateMap['memo_code'])?.setValue(true); TransactionFormUtils.patchMemoText(reatRedes, this.reattributedData.form); From 46234aa0c9486a841142a46320aab4285d9174fc Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 23 Sep 2024 13:41:36 -0400 Subject: [PATCH 46/62] Make canDelete check all three loan types --- .../transaction-list-table-base.component.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts index 7853066545..c9ef216f7a 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts @@ -9,7 +9,6 @@ import { ScheduleBTransactionTypes } from 'app/shared/models/schb-transaction.mo import { ScheduleCTransactionTypes } from 'app/shared/models/schc-transaction.model'; import { ScheduleC1TransactionTypes } from 'app/shared/models/schc1-transaction.model'; import { ScheduleDTransactionTypes } from 'app/shared/models/schd-transaction.model'; -import { TransactionType } from 'app/shared/models/transaction-type.model'; import { isPulledForwardLoan, ScheduleIds, Transaction } from 'app/shared/models/transaction.model'; import { QueryParams } from 'app/shared/services/api.service'; import { ReportService } from 'app/shared/services/report.service'; @@ -338,8 +337,18 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom private canDelete(transaction: Transaction): boolean { if ( - transaction.transaction_type_identifier !== 'LOAN_REPAYMENT_MADE' && - (transaction.loan_id || transaction.debt_id) + transaction.transaction_type_identifier === undefined || + (!( + transaction.transaction_type_identifier in + [ + 'LOAN_RECEIVED_FROM_INDIVIDUAL', + 'LOAN_RECEIVED_FROM_BANK', + 'LOAN_BY_COMMITTEE', + 'DEBT_OWED_BY_COMMITTEE', + 'DEBT_OWED_TO_COMMITTEE', + ] + ) && + (transaction.loan_id || transaction.debt_id)) ) { return false; } From 2091ca7a1db4827f341d51d09acdf5ef5266e6b9 Mon Sep 17 00:00:00 2001 From: Sasha Dresden Date: Mon, 23 Sep 2024 15:24:39 -0400 Subject: [PATCH 47/62] Add some tests and fix canDelete loan exception list --- .../transaction-list-table-base.component.ts | 9 +++----- .../transaction-receipts.component.spec.ts | 23 +++++++++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts index c9ef216f7a..455dbd0093 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-list-table-base.component.ts @@ -338,17 +338,14 @@ export abstract class TransactionListTableBaseComponent extends TableListBaseCom private canDelete(transaction: Transaction): boolean { if ( transaction.transaction_type_identifier === undefined || - (!( - transaction.transaction_type_identifier in - [ + ((transaction.loan_id || transaction.debt_id) && + ![ 'LOAN_RECEIVED_FROM_INDIVIDUAL', 'LOAN_RECEIVED_FROM_BANK', 'LOAN_BY_COMMITTEE', 'DEBT_OWED_BY_COMMITTEE', 'DEBT_OWED_TO_COMMITTEE', - ] - ) && - (transaction.loan_id || transaction.debt_id)) + ].includes(transaction.transaction_type_identifier || '')) ) { return false; } diff --git a/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts b/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts index 3e4ce32ad3..489b053154 100644 --- a/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts +++ b/front-end/src/app/reports/transactions/transaction-list/transaction-receipts/transaction-receipts.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { ActivatedRoute, Router } from '@angular/router'; import { FormsModule } from '@angular/forms'; -import { of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { provideMockStore } from '@ngrx/store/testing'; import { testMockStore } from 'app/shared/utils/unit-test.utils'; import { Form3X } from 'app/shared/models/form-3x.model'; @@ -65,6 +65,9 @@ describe('TransactionReceiptsComponent', () => { fixture = TestBed.createComponent(TransactionReceiptsComponent); router = TestBed.inject(Router); testItemService = TestBed.inject(TransactionSchAService); + testItemService.delete = (): Observable => { + return of(null); + }; testConfirmationService = TestBed.inject(ConfirmationService); component = fixture.componentInstance; confirmSpy = spyOn(testConfirmationService, 'confirm'); @@ -112,9 +115,18 @@ describe('TransactionReceiptsComponent', () => { expect( deleteAction?.isAvailable({ can_delete: true, + transaction_type_identifier: '', transactionType: { scheduleId: ScheduleIds.A }, }), - ).toEqual(true); + ).toBeTrue(); + expect( + deleteAction?.isAvailable({ + can_delete: true, + transaction_type_identifier: 'LOAN_REPAYMENT_MADE', + loan_id: 'test', + transactionType: { scheduleId: ScheduleIds.A }, + }), + ).toBeFalse(); expect( aggregateAction?.isAvailable({ force_unaggregated: true, transactionType: { scheduleId: ScheduleIds.A } }), ).toEqual(true); @@ -182,6 +194,13 @@ describe('TransactionReceiptsComponent', () => { expect(navigateSpy).toHaveBeenCalled(); }); + it('test deleteItem', () => { + const deleteSpy = spyOn(testItemService, 'delete').and.callThrough(); + const testTransaction: Transaction = { id: 'testId', report_ids: ['test'] } as unknown as Transaction; + component.deleteItem(testTransaction); + expect(deleteSpy).toHaveBeenCalled(); + }); + describe('format id', () => { it('should return empty string if null id', () => { const str = component.formatId(null); From 5956b291dbea7bab52d583e617eb87272fb6548d Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Thu, 12 Sep 2024 23:39:53 -0400 Subject: [PATCH 48/62] 220 e2e login --- .circleci/config.yml | 2 +- front-end/cypress/e2e/pages/loginPage.ts | 20 +++++-------------- .../src/app/login/login/login.component.html | 2 +- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b729c1d11e..aaf5e59bfe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ jobs: command: | git checkout ${CIRCLE_BRANCH} docker-compose down - DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" docker-compose up --build -d + DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ diff --git a/front-end/cypress/e2e/pages/loginPage.ts b/front-end/cypress/e2e/pages/loginPage.ts index a18ebe11e7..f2c4535425 100644 --- a/front-end/cypress/e2e/pages/loginPage.ts +++ b/front-end/cypress/e2e/pages/loginPage.ts @@ -9,7 +9,8 @@ export class LoginPage { `Login Through ${intervalString}`, () => { //apiLogin(); - legacyLogin(); + //legacyLogin(); + loginDotGovLogin(); }, { cacheAcrossSpecs: true, @@ -54,18 +55,10 @@ function getLoginIntervalString(sessionDur: number): string { } } -function legacyLogin() { - //Dummy login information - const email = Cypress.env('EMAIL'); +function loginDotGovLogin() { const committeeID = Cypress.env('COMMITTEE_ID'); - const testPassword = Cypress.env('PASSWORD'); - //login page form-fields' id's (or classes where elements have no id's) - const fieldEmail = '#emailId'; - const fieldCommittee = '#committeeId'; - const fieldPassword = '#loginPassword'; - - cy.intercept('POST', 'http://localhost:8080/api/v1/user/login/authenticate').as('GetLoggedIn'); + cy.intercept('GET', 'http://localhost:8080/api/v1/oidc/login-redirect').as('GetLoggedIn'); cy.intercept('GET', `http://localhost:8080/api/v1/openfec/${committeeID}/committee`, { fixture: 'FEC_Get_Committee_Account', }).as('GetCommitteeAccounts'); @@ -73,10 +66,7 @@ function legacyLogin() { cy.visit('/'); cy.get('#dropdownMenuButton').click(); - cy.get('[data-test="debug-login-button"]').click(); - cy.get(fieldEmail).type(email); - cy.get(fieldCommittee).type(committeeID); - cy.get(fieldPassword).type(testPassword).type('{enter}'); + cy.get('[data-test="login-dot-gov-login-button"]').click(); cy.wait('@GetLoggedIn'); cy.visit('/login/security-notice'); cy.get('.p-checkbox-box').click(); diff --git a/front-end/src/app/login/login/login.component.html b/front-end/src/app/login/login/login.component.html index 36b6673032..856133e24d 100644 --- a/front-end/src/app/login/login/login.component.html +++ b/front-end/src/app/login/login/login.component.html @@ -33,7 +33,7 @@

Built to work anywhere.

class="dropdown-menu" aria-labelledby="dropdownMenuButton" > - + From c23fe16162acc7423d42240bc39d42c75d23255d Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Thu, 12 Sep 2024 23:43:03 -0400 Subject: [PATCH 49/62] 220 prettier --- front-end/src/app/login/login/login.component.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/front-end/src/app/login/login/login.component.html b/front-end/src/app/login/login/login.component.html index 856133e24d..1a355ed5f4 100644 --- a/front-end/src/app/login/login/login.component.html +++ b/front-end/src/app/login/login/login.component.html @@ -33,7 +33,14 @@

Built to work anywhere.

class="dropdown-menu" aria-labelledby="dropdownMenuButton" > - + From 5da60e7514da0113fa99be93bdfa219ea6ff44a5 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 00:00:14 -0400 Subject: [PATCH 50/62] 220 bring back cypress videos (if present) --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index aaf5e59bfe..9db9741e81 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -147,10 +147,14 @@ jobs: rm -rf /tmp/cypress mkdir -p /tmp/cypress/results docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/results/. /tmp/cypress/results + docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/videos/. /tmp/cypress/videos docker rm fecfile-web-app-e2e - store_artifacts: path: /tmp/cypress/results destination: cypress/results + - store_artifacts: + path: /tmp/cypress/videos + destination: cypress/videos deploy-job: docker: - image: cimg/node:20.4.0-browsers From 644b34d8870a7889339496785fd2cdf4d9709c0a Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 00:00:28 -0400 Subject: [PATCH 51/62] 220 debuggin cypress --- front-end/cypress.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/front-end/cypress.config.ts b/front-end/cypress.config.ts index bcaa3edbda..36bbcc41ce 100644 --- a/front-end/cypress.config.ts +++ b/front-end/cypress.config.ts @@ -3,10 +3,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ defaultCommandTimeout: 10000, projectId: 'x5egpz', - video: false, + video: true, videosFolder: 'cypress/videos', screenshotsFolder: 'cypress/screenshots', - screenshotOnRunFailure: false, + screenshotOnRunFailure: true, fixturesFolder: 'cypress/fixtures', trashAssetsBeforeRuns: false, viewportHeight: 768, From 09f3bd011dda07ad0867d6b598462bfcb39edc67 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 00:02:27 -0400 Subject: [PATCH 52/62] 220 cypress screenshots --- front-end/package-lock.json | 536 +++++++++++++++++++----------------- 1 file changed, 283 insertions(+), 253 deletions(-) diff --git a/front-end/package-lock.json b/front-end/package-lock.json index 769d2e06b3..b6120929a1 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -89,12 +89,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", + "version": "0.1802.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.6.tgz", + "integrity": "sha512-oF7cPFdTLxeuvXkK/opSdIxZ1E4LrBbmuytQ/nCoAGOaKBWdqvwagRZ6jVhaI0Gwu48rkcV7Zhesg/ESNnROdw==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.6", "rxjs": "7.8.1" }, "engines": { @@ -104,16 +104,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.5.tgz", - "integrity": "sha512-dIvb0AHoRIMM6tLuG4t6lDDslSAYP77wqytodsN317UzFOuuCPernXbO8NJs+QHxj09nPsem1T5vnvpO2E/PVQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.6.tgz", + "integrity": "sha512-u12cJZttgs5j7gICHWSmcaTCu0EFXEzKqI8nkYCwq2MtuJlAXiMQSXYuEP9OU3Go4vMAPtQh2kShyOWCX5b4EQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/build-webpack": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular/build": "18.2.5", + "@angular-devkit/architect": "0.1802.6", + "@angular-devkit/build-webpack": "0.1802.6", + "@angular-devkit/core": "18.2.6", + "@angular/build": "18.2.6", "@babel/core": "7.25.2", "@babel/generator": "7.25.0", "@babel/helper-annotate-as-pure": "7.24.7", @@ -124,7 +124,7 @@ "@babel/preset-env": "7.25.3", "@babel/runtime": "7.25.0", "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.5", + "@ngtools/webpack": "18.2.6", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -238,12 +238,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.5.tgz", - "integrity": "sha512-6qkcrWBdkxojCVHGWcdJaz4G+7QTjFvmc+3g8xvLc9sYvJq1I059gfXhDnC0FxiA0MT4cY/26ECYWUHTD5CJLQ==", + "version": "0.1802.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.6.tgz", + "integrity": "sha512-JMLcXFaitJplwZMKkqhbYirINCRD6eOPZuIGaIOVynXYGWgvJkLT9t5C2wm9HqSLtp1K7NcYG2Y7PtTVR4krnQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.6", "rxjs": "7.8.1" }, "engines": { @@ -257,9 +257,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", - "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.6.tgz", + "integrity": "sha512-la4CFvs5PcRWSkQ/H7TB5cPZirFVA9GoWk5LzIk8si6VjWBJRm8b3keKJoC9LlNeABRUIR5z0ocYkyQQUhdMfg==", "dev": true, "dependencies": { "ajv": "8.17.1", @@ -284,12 +284,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.5.tgz", - "integrity": "sha512-NUmz2UQ1Xl4cf4j1AgkwIfsCjBzAPgfeC3IBrD29hSOBE1Y3j6auqjBkvw50v6mbSPxESND995Xy13HpK1Xflw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.6.tgz", + "integrity": "sha512-uIttrQ2cQ2PWAFFVPeCoNR8xvs7tPJ2i8gzqsIwYdge107xDC6u9CqfgmBqPDSFpWj+IiC2Jwcm8Z4HYKU4+7A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.6", "jsonc-parser": "3.3.1", "magic-string": "0.30.11", "ora": "5.4.1", @@ -395,9 +395,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.5.tgz", - "integrity": "sha512-IlXtW/Nj48ZzjHUzH1TykZcSR64ScJx39T3IHnjV2z/bVATzZ36JGoadQHdqpJNKBodYJNgtJCGLCbgAvGWY2g==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.6.tgz", + "integrity": "sha512-vy9wy+Q9beiRxkEO8wNxFQ63AqAujGvk8AUHepxxIT7QNNc512TNKz8uH+feWDPO38Dm2obwYQHMGzs3WO7pUA==", "dependencies": { "tslib": "^2.3.0" }, @@ -405,17 +405,17 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.6" } }, "node_modules/@angular/build": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.5.tgz", - "integrity": "sha512-XWkmjzgeUga0SJ0lYSYcTuYOWTyqcln2mNfBp7Ae/GZ+/7+APbedsIZEiZGZwveOIyOpTM5wguNSoe9khDl5Ig==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.6.tgz", + "integrity": "sha512-TQzX6Mi7uXFvmz7+OVl4Za7WawYPcx+B5Ewm6IY/DdMyB9P/Z4tbKb1LO+ynWUXYwm7avXo6XQQ4m5ArDY5F/A==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.6", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", @@ -434,7 +434,7 @@ "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.6.1", - "rollup": "4.20.0", + "rollup": "4.22.4", "sass": "1.77.6", "semver": "7.6.3", "vite": "5.4.6", @@ -477,9 +477,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.5.tgz", - "integrity": "sha512-HLg5cfrIrgNIJJ+0v3kLieHeLPJLFNOBO359holXOrKUPRG+XQ3CT8EzSvREFm1XkaSEsDC0+dnG0ouNhOPFpQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.6.tgz", + "integrity": "sha512-Gfq/iv4zhlKYpdQkDaBRwxI71NHNUHM1Cs1XhnZ0/oFct5HXvSv1RHRGTKqBJLLACaAPzZKXJ/UglLoyO5CNiQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -493,17 +493,17 @@ } }, "node_modules/@angular/cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.5.tgz", - "integrity": "sha512-97uNs0HsOdnMaTlNJKFjIBUXw0wz43uYvSSKmIpBt7eq1LaPLju1G/qpDIHx2YwhMClPrXXrW2H/xdvqZiIw+w==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.6.tgz", + "integrity": "sha512-tdXsnV/w+Rgu8q0zFsLU5L9ImTVqrTol1vppHaQkJ/vuoHy+s8ZEbBqhVrO/ffosNb2xseUybGYvqMS4zkNQjg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/architect": "0.1802.6", + "@angular-devkit/core": "18.2.6", + "@angular-devkit/schematics": "18.2.6", "@inquirer/prompts": "5.3.8", "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.5", + "@schematics/angular": "18.2.6", "@yarnpkg/lockfile": "1.1.0", "ini": "4.1.3", "jsonc-parser": "3.3.1", @@ -526,9 +526,9 @@ } }, "node_modules/@angular/common": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.5.tgz", - "integrity": "sha512-m+KJrtbFXTE36jP/po6UAMeUR/enQxRHpVGLCRcIcE7VWVH1ZcOvoW1yqh2A6k+KxWXeajlq/Z04nnMhcoxMRw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.6.tgz", + "integrity": "sha512-89793ow+wrI1c7C6kyMbnweLNIZHzXthosxAEjipRZGBrqBYjvTtkE45Fl+5yBa3JO7bAhyGkUnEoyvWtZIAEA==", "dependencies": { "tslib": "^2.3.0" }, @@ -536,14 +536,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5", + "@angular/core": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.5.tgz", - "integrity": "sha512-vcqe9x4dGGAnMfPhEpcZyiSVgAiqJeK80LqP1vWoAmBR+HeOqAilSv6SflcLAtuTzwgzMMAvD2T+SMCgUvaqww==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.6.tgz", + "integrity": "sha512-3tX2/Qw+bZ8XzKitviH8jzNGyY0uohhehhBB57OJOCc+yr4ojy/7SYFnun1lSsRnDztdCE461641X4iQLCQ94w==", "dependencies": { "tslib": "^2.3.0" }, @@ -551,7 +551,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -560,9 +560,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.5.tgz", - "integrity": "sha512-CCCtZobUTUfId/RTYtuDCw5R1oK0w65hdAUMRP1MdGmd8bb8DKJA86u1QCWwozL3rbXlIIX4ognQ6urQ43k/Gw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.6.tgz", + "integrity": "sha512-b5x9STfjNiNM/S0D+CnqRP9UOxPtSz1+RlCH5WdOMiW/p8j5p6dBix8YYgTe6Wg3OD7eItD2pnFQKgF/dWiopA==", "dev": true, "dependencies": { "@babel/core": "7.25.2", @@ -583,14 +583,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.5", + "@angular/compiler": "18.2.6", "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.5.tgz", - "integrity": "sha512-5BLVc5gXxzanQkADNS9WPsor3vNF5nQcyIHBi5VScErwM5vVZ7ATH1iZwaOg1ykDEVTFVhKDwD0X1aaqGDbhmQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.6.tgz", + "integrity": "sha512-PjFad2j4YBwLVTw+0Te8CJCa/tV0W8caTHG8aOjj3ObdL6ihGI+FKnwerLc9RVzDFd14BOO4C6/+LbOQAh3Ltw==", "dependencies": { "tslib": "^2.3.0" }, @@ -603,9 +603,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.5.tgz", - "integrity": "sha512-ohKeH+EZCCIyGSiFYlraWLzssGAZc13P92cuYpXB62322PkcA5u0IT72mML9JWGKRqF2zteVsw4koWHVxXM5mA==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.6.tgz", + "integrity": "sha512-quGkUqTxlBaLB8C/RnpfFG57fdmNF5RQ+368N89Ma++2lpIsVAHaGZZn4yOyo3wNYaM2jBxNqaYxOzZNUl5Tig==", "dependencies": { "tslib": "^2.3.0" }, @@ -613,16 +613,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.5.tgz", - "integrity": "sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.6.tgz", + "integrity": "sha512-RA8UMiYNLga+QMwpKcDw1357gYPfPyY/rmLeezMak//BbsENFYQOJ4Z6DBOBNiPlHxmBsUJMGaKdlpQhfCROyQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -630,9 +630,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.5", - "@angular/common": "18.2.5", - "@angular/core": "18.2.5" + "@angular/animations": "18.2.6", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -641,9 +641,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.5.tgz", - "integrity": "sha512-5u0IuAt1r5e2u2vSKhp3phnaf6hH89B/q7GErfPse1sdDfNI6wHVppxai28PAfAj9gwooJun6MjFWhJFLzS44A==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.6.tgz", + "integrity": "sha512-kGBU3FNc+DF9r33hwHZqiWoZgQbCDdEIucU0NCLCIg0Hw6/Q9Hr2ndjxQI+WynCPg0JeBn34jpouvpeJer3YDQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -651,16 +651,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5" + "@angular/common": "18.2.6", + "@angular/compiler": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6" } }, "node_modules/@angular/router": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.5.tgz", - "integrity": "sha512-OjZV1PTiSwT0ytmR0ykveLYzs4uQWf0EuIclZmWqM/bb8Q4P+gJl7/sya05nGnZsj6nHGOL0e/LhSZ3N+5p6qg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.6.tgz", + "integrity": "sha512-t57Sqja8unHhZlPr+4CWnQacuox2M4p2pMHps+31wt337qH6mKf4jqDmK0dE/MFdRyKjT2a2E/2NwtxXxcWNuw==", "dependencies": { "tslib": "^2.3.0" }, @@ -668,9 +668,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2958,6 +2958,15 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -3016,9 +3025,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", - "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3034,9 +3043,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", - "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", "dev": true, "dependencies": { "levn": "^0.4.1" @@ -3152,9 +3161,9 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "22.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.2.tgz", + "integrity": "sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -3747,9 +3756,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.5.tgz", - "integrity": "sha512-L0n4eHObeqEOYRfSP+e4SeF/dmwxOIFy9xYvYCOUwOLrW4b3+a1+kkT30pqyfL72LFtpf0cmUwaWEFIcWl5PCg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.6.tgz", + "integrity": "sha512-7HwOPE1EOgcHnpt4brSiT8G2CcXB50G0+CbCBaKGy4LYCG3Y3mrlzF5Fup9HvMJ6Tzqd62RqzpKKYBiGUT7hxg==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -4083,9 +4092,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -4096,9 +4105,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -4109,9 +4118,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -4122,9 +4131,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -4135,9 +4144,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -4148,9 +4157,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -4161,9 +4170,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -4174,9 +4183,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -4187,9 +4196,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -4200,9 +4209,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -4213,9 +4222,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -4226,9 +4235,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -4239,9 +4248,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -4252,9 +4261,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -4265,9 +4274,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -4278,9 +4287,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -4291,13 +4300,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.5.tgz", - "integrity": "sha512-tBXhk9OGT4U6VsBNbuCNl2ITDOF3NYdGrEieIHU+lHSkpJNGZUIGxCgXCETXkmXDq1pe4wFZSKelWjeqYDfX0g==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.6.tgz", + "integrity": "sha512-Y988EoOEQDLEyHu3414T6AeVUyx21AexBHQNbUNQkK8cxlxyB6m1eH1cx6vFgLRFUTsLVv+C6Ln/ICNTfLcG4A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/core": "18.2.6", + "@angular-devkit/schematics": "18.2.6", "jsonc-parser": "3.3.1" }, "engines": { @@ -4507,9 +4516,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/express": { @@ -4525,9 +4534,21 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", + "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, "dependencies": { "@types/node": "*", @@ -4567,9 +4588,9 @@ "dev": true }, "node_modules/@types/jquery": { - "version": "3.5.30", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", - "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", + "version": "3.5.31", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.31.tgz", + "integrity": "sha512-rf/iB+cPJ/YZfMwr+FVuQbm7IaWC4y3FVYfVDxRGqmUCFjjPII0HWaP0vTPJGp6m4o13AXySCcMbWfrWtBFAKw==", "dev": true, "dependencies": { "@types/sizzle": "*" @@ -4582,9 +4603,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", "dev": true }, "node_modules/@types/luxon": { @@ -4609,9 +4630,9 @@ } }, "node_modules/@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "version": "20.16.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.9.tgz", + "integrity": "sha512-rkvIVJxsOfBejxK7I0FO5sa2WxFmJCzoDwcd88+fq/CUfynNywTo/1/T6hyFz22CyztsnLS9nVlHOnTI36RH5w==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -4721,16 +4742,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", - "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", + "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/type-utils": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/type-utils": "8.7.0", + "@typescript-eslint/utils": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4754,15 +4775,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", - "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", + "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4" }, "engines": { @@ -4782,13 +4803,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", - "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", + "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0" + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4799,13 +4820,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", - "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", + "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/utils": "8.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4823,9 +4844,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", - "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", + "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4836,13 +4857,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", - "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", + "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4888,15 +4909,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", - "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", + "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0" + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4910,12 +4931,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", - "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", + "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/types": "8.7.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5753,9 +5774,9 @@ "peer": true }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -5772,8 +5793,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -5980,9 +6001,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001662", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", - "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "version": "1.0.30001663", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", + "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", "dev": true, "funding": [ { @@ -6806,13 +6827,13 @@ "dev": true }, "node_modules/cypress": { - "version": "13.14.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.14.2.tgz", - "integrity": "sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz", + "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^3.0.1", + "@cypress/request": "^3.0.4", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", @@ -7499,9 +7520,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.26", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.26.tgz", - "integrity": "sha512-Z+OMe9M/V6Ep9n/52+b7lkvYEps26z4Yz3vjWL1V61W0q+VLF1pOHhMY17sa4roz4AWmULSI8E6SAojZA5L0YQ==", + "version": "1.5.28", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", + "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", "dev": true }, "node_modules/emoji-regex": { @@ -7561,9 +7582,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.1.tgz", + "integrity": "sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -7792,20 +7813,23 @@ } }, "node_modules/eslint": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", - "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.10.0", - "@eslint/plugin-kit": "^0.1.0", + "@eslint/js": "9.11.1", + "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -12848,9 +12872,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz", + "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", "dev": true }, "node_modules/os-tmpdir": { @@ -14146,9 +14170,9 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -14161,25 +14185,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -14720,16 +14750,16 @@ } }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", + "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, From e28240aeaf12f8b5099e49e2acdde1df4d0b7b9d Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 00:05:24 -0400 Subject: [PATCH 53/62] 220 cypress testing --- .circleci/config.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9db9741e81..54f701dc42 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -139,7 +139,7 @@ jobs: cd fecfile-web-app/front-end; \ git checkout ${CIRCLE_BRANCH}; \ npm install; \ - node --max_old_space_size=4000 ./node_modules/@angular/cli/bin/ng e2e --spec "cypress/e2e/**/*.cy.ts" --headless --watch=false --browser chrome;'\ + node --max_old_space_size=4000 ./node_modules/@angular/cli/bin/ng e2e --spec "cypress/e2e/**/contacts.cy.ts" --headless --watch=false --browser chrome;'\ - run: name: stage test result artifacts when: always @@ -148,6 +148,7 @@ jobs: mkdir -p /tmp/cypress/results docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/results/. /tmp/cypress/results docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/videos/. /tmp/cypress/videos + docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/screenshots/. /tmp/cypress/screenshots docker rm fecfile-web-app-e2e - store_artifacts: path: /tmp/cypress/results @@ -155,6 +156,9 @@ jobs: - store_artifacts: path: /tmp/cypress/videos destination: cypress/videos + - store_artifacts: + path: /tmp/cypress/screenshots + destination: cypress/screenshots deploy-job: docker: - image: cimg/node:20.4.0-browsers From 3bf5d278ce41f65c08ca27f40fdd16f1ae5dc890 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 01:41:02 -0400 Subject: [PATCH 54/62] 220 testing --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54f701dc42..53557486fd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,7 +106,6 @@ jobs: steps: - setup_remote_docker: docker_layer_caching: false - version: docker24 - run: name: clone fecfile-web-api command: | @@ -124,7 +123,7 @@ jobs: git checkout ${CIRCLE_BRANCH} docker-compose down DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d - docker container run --network container:fecfile-api \ + docker container run --network container:fecfile-api-proxy \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ -wait-retry-interval 2s \ @@ -133,7 +132,7 @@ jobs: - run: name: execute e2e tests command: | - docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:node-20.5.0-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1 /bin/bash -c '\ + docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api-proxy cypress/browsers:latest /bin/bash -c '\ cd ~; \ git clone https://github.com/fecgov/fecfile-web-app.git; \ cd fecfile-web-app/front-end; \ From 51b69fb2204d2a4ef574ad849583e86f6f936423 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 18:07:04 -0400 Subject: [PATCH 55/62] 220 testing --- .circleci/config.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 53557486fd..54f701dc42 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,6 +106,7 @@ jobs: steps: - setup_remote_docker: docker_layer_caching: false + version: docker24 - run: name: clone fecfile-web-api command: | @@ -123,7 +124,7 @@ jobs: git checkout ${CIRCLE_BRANCH} docker-compose down DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d - docker container run --network container:fecfile-api-proxy \ + docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ -wait-retry-interval 2s \ @@ -132,7 +133,7 @@ jobs: - run: name: execute e2e tests command: | - docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api-proxy cypress/browsers:latest /bin/bash -c '\ + docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:node-20.5.0-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1 /bin/bash -c '\ cd ~; \ git clone https://github.com/fecgov/fecfile-web-app.git; \ cd fecfile-web-app/front-end; \ From 9ca831dfebf53a4f24e0a39f31df81f1a0a0ff3c Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 19:10:56 -0400 Subject: [PATCH 56/62] 220 testing --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54f701dc42..a7d9141840 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ jobs: command: | git checkout ${CIRCLE_BRANCH} docker-compose down - DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d + DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} OIDC_RP_CLIENT_SECRET={E2E_OIDC_RP_CLIENT_SECRET} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ From 78f5c0ab1a0a7bcd3f275db31aca132fd211557d Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 19:56:55 -0400 Subject: [PATCH 57/62] 220 print api logs --- .circleci/config.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a7d9141840..f22465dcd0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -140,6 +140,11 @@ jobs: git checkout ${CIRCLE_BRANCH}; \ npm install; \ node --max_old_space_size=4000 ./node_modules/@angular/cli/bin/ng e2e --spec "cypress/e2e/**/contacts.cy.ts" --headless --watch=false --browser chrome;'\ + - run: + name: print api logs + when: always + command: | + docker logs --tail 100 fecfile-api - run: name: stage test result artifacts when: always From cda13a5bb7b0b53eadd7475f19d394a61d248cb2 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 20:20:29 -0400 Subject: [PATCH 58/62] 220 testing --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f22465dcd0..2afac205aa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ jobs: command: | git checkout ${CIRCLE_BRANCH} docker-compose down - DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} OIDC_RP_CLIENT_SECRET={E2E_OIDC_RP_CLIENT_SECRET} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d + DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} OIDC_RP_CLIENT_SECRET=${E2E_OIDC_RP_CLIENT_SECRET} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ From ebe42c365ad36141b952916c73da318f379f032f Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 21:09:14 -0400 Subject: [PATCH 59/62] 220 testing --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2afac205aa..87019f16ec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ jobs: command: | git checkout ${CIRCLE_BRANCH} docker-compose down - DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} OIDC_RP_CLIENT_SECRET=${E2E_OIDC_RP_CLIENT_SECRET} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d + DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \ From 6925bf443fb1c0b13e9e1a79cecf728315477514 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 21:26:11 -0400 Subject: [PATCH 60/62] 220 post-testing cleanup --- .circleci/config.yml | 13 ++----------- front-end/cypress.config.ts | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 87019f16ec..8c3a6fefb0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,7 +106,6 @@ jobs: steps: - setup_remote_docker: docker_layer_caching: false - version: docker24 - run: name: clone fecfile-web-api command: | @@ -133,13 +132,13 @@ jobs: - run: name: execute e2e tests command: | - docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:node-20.5.0-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1 /bin/bash -c '\ + docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:latest /bin/bash -c '\ cd ~; \ git clone https://github.com/fecgov/fecfile-web-app.git; \ cd fecfile-web-app/front-end; \ git checkout ${CIRCLE_BRANCH}; \ npm install; \ - node --max_old_space_size=4000 ./node_modules/@angular/cli/bin/ng e2e --spec "cypress/e2e/**/contacts.cy.ts" --headless --watch=false --browser chrome;'\ + node --max_old_space_size=4000 ./node_modules/@angular/cli/bin/ng e2e --spec "cypress/e2e/**/*.cy.ts" --headless --watch=false --browser chrome;'\ - run: name: print api logs when: always @@ -152,18 +151,10 @@ jobs: rm -rf /tmp/cypress mkdir -p /tmp/cypress/results docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/results/. /tmp/cypress/results - docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/videos/. /tmp/cypress/videos - docker cp fecfile-web-app-e2e:/root/fecfile-web-app/front-end/cypress/screenshots/. /tmp/cypress/screenshots docker rm fecfile-web-app-e2e - store_artifacts: path: /tmp/cypress/results destination: cypress/results - - store_artifacts: - path: /tmp/cypress/videos - destination: cypress/videos - - store_artifacts: - path: /tmp/cypress/screenshots - destination: cypress/screenshots deploy-job: docker: - image: cimg/node:20.4.0-browsers diff --git a/front-end/cypress.config.ts b/front-end/cypress.config.ts index 36bbcc41ce..d5abeb1394 100644 --- a/front-end/cypress.config.ts +++ b/front-end/cypress.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'cypress'; export default defineConfig({ defaultCommandTimeout: 10000, projectId: 'x5egpz', - video: true, + video: false, videosFolder: 'cypress/videos', screenshotsFolder: 'cypress/screenshots', screenshotOnRunFailure: true, From 84a2cb933b283299ea3e68c3624a0f4edc2e84bf Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Fri, 13 Sep 2024 21:42:14 -0400 Subject: [PATCH 61/62] 220 --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8c3a6fefb0..5cb2302336 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,6 +106,7 @@ jobs: steps: - setup_remote_docker: docker_layer_caching: false + version: docker24 - run: name: clone fecfile-web-api command: | @@ -132,7 +133,7 @@ jobs: - run: name: execute e2e tests command: | - docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:latest /bin/bash -c '\ + docker container run --name fecfile-web-app-e2e -e CIRCLE_BRANCH=${CIRCLE_BRANCH} -e CYPRESS_EMAIL=${CYPRESS_EMAIL} -e CYPRESS_COMMITTEE_ID=${CYPRESS_COMMITTEE_ID} -e CYPRESS_PASSWORD=${CYPRESS_PASSWORD} -e CYPRESS_FILING_PASSWORD=${CYPRESS_FILING_PASSWORD} --network container:fecfile-api cypress/browsers:node-20.5.0-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1 /bin/bash -c '\ cd ~; \ git clone https://github.com/fecgov/fecfile-web-app.git; \ cd fecfile-web-app/front-end; \ From ee55600d3f95b9d034c33d1c68d9b2eed6a379a8 Mon Sep 17 00:00:00 2001 From: David Heitzer Date: Wed, 25 Sep 2024 14:55:43 -0400 Subject: [PATCH 62/62] 220 cr fixes --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5cb2302336..457e084fb7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ jobs: command: | git checkout ${CIRCLE_BRANCH} docker-compose down - DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" OIDC_OP_AUTODISCOVER_ENDPOINT="http://localhost:8080/api/v1/mock_oidc_provider/.well-known/openid-configuration" docker-compose up --build -d + DB_DOCKERFILE="Dockerfile-e2e" WORKER_DOCKERFILE="Worker_Dockerfile-e2e" API_DOCKERFILE="Dockerfile-e2e" FECFILE_TEST_DB_NAME="postgres" DJANGO_SECRET_KEY=${E2E_DJANGO_SECRET_KEY} DATABASE_URL=${E2E_DATABASE_URL} FEC_API=${E2E_FEC_API} FEC_API_KEY=${E2E_FEC_API_KEY} MOCK_EFO="True" docker-compose up --build -d docker container run --network container:fecfile-api \ docker.io/jwilder/dockerize \ -wait http://localhost:8080/api/v1/user/login/authenticate \