TD-925: Bump Angular to 18 (#369)

This commit is contained in:
Rinat Arsaev 2024-06-21 13:45:05 +05:00 committed by GitHub
parent ba1e7c266b
commit 87a9feddea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 3562 additions and 3197 deletions

View File

@ -1,7 +1,7 @@
module.exports = { module.exports = {
extends: '@vality/eslint-config', extends: '@vality/eslint-config-ng',
overrides: [ overrides: [
...require('@vality/eslint-config/configs').angular('cc').overrides, ...require('@vality/eslint-config-ng/configs').angular('cc').overrides,
...require('@vality/eslint-config/configs').importOrder(['@cc/**']).overrides, ...require('@vality/eslint-config-ng/configs').importOrder(['@cc/**']).overrides,
], ],
}; };

6596
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
"build": "ng build", "build": "ng build",
"test": "ng test", "test": "ng test",
"lint": "ng lint --max-warnings=0", "lint": "ng lint --max-warnings=0",
"lint:fix": "ng lint --fix", "lint:fix": "npm run lint -- --fix",
"format": "prettier ** --list-different", "format": "prettier ** --list-different",
"format:fix": "prettier ** --write --log-level=warn", "format:fix": "prettier ** --write --log-level=warn",
"spell": "cspell --no-progress **", "spell": "cspell --no-progress **",
@ -16,63 +16,63 @@
"fix": "npm run lint:fix && npm run format:fix && npm run spell:fix" "fix": "npm run lint:fix && npm run format:fix && npm run spell:fix"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "17.2.1", "@angular/animations": "18.0.3",
"@angular/cdk": "17.2.0", "@angular/cdk": "18.0.3",
"@angular/common": "17.2.1", "@angular/common": "18.0.3",
"@angular/compiler": "17.2.1", "@angular/compiler": "18.0.3",
"@angular/core": "17.2.1", "@angular/core": "18.0.3",
"@angular/forms": "17.2.1", "@angular/forms": "18.0.3",
"@angular/material": "17.2.0", "@angular/material": "18.0.3",
"@angular/platform-browser": "17.2.1", "@angular/platform-browser": "18.0.3",
"@angular/platform-browser-dynamic": "17.2.1", "@angular/platform-browser-dynamic": "18.0.3",
"@angular/platform-server": "17.2.1", "@angular/platform-server": "18.0.3",
"@angular/router": "17.2.1", "@angular/router": "18.0.3",
"@ngneat/input-mask": "6.0.0", "@ngneat/input-mask": "6.0.0",
"@vality/deanonimus-proto": "2.0.1-2a02d87.0", "@vality/deanonimus-proto": "2.0.1-2a02d87.0",
"@vality/domain-proto": "2.0.1-b04aba8.0", "@vality/domain-proto": "2.0.1-b04aba8.0",
"@vality/dominator-proto": "1.0.1-b9788c2.0", "@vality/dominator-proto": "1.0.1-41bee97.0",
"@vality/fistful-proto": "2.0.1-6600be9.0", "@vality/fistful-proto": "2.0.1-6600be9.0",
"@vality/machinegun-proto": "1.0.0", "@vality/machinegun-proto": "1.0.0",
"@vality/magista-proto": "2.0.2-28d11b9.0", "@vality/magista-proto": "2.0.2-28d11b9.0",
"@vality/ng-core": "17.2.1-pr-64-0a6dad2.0", "@vality/ng-core": "18.0.1-pr-63-9e315a6.0",
"@vality/ng-thrift": "17.0.1-pr-5-2ce0f11.0", "@vality/ng-thrift": "18.0.1-pr-12-d099f93.0",
"@vality/payout-manager-proto": "2.0.1-eb4091a.0", "@vality/payout-manager-proto": "2.0.1-eb4091a.0",
"@vality/repairer-proto": "2.0.2-07b73e9.0", "@vality/repairer-proto": "2.0.2-07b73e9.0",
"@vality/scrooge-proto": "0.1.1-9ce7fc6.0", "@vality/scrooge-proto": "0.1.1-9ce7fc6.0",
"@vality/thrift-ts": "2.4.1-8ad5123.0", "@vality/thrift-ts": "2.4.1-8ad5123.0",
"@vality/woody": "0.1.3", "@vality/woody": "0.1.3",
"date-fns": "^3.3.1", "date-fns": "^3.6.0",
"inputmask": "5.0.7", "inputmask": "5.0.7",
"keycloak-angular": "^15.0.0", "keycloak-angular": "^16.0.1",
"keycloak-js": "^20.0.5", "keycloak-js": "^20.0.5",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"monaco-editor": "^0.44.0", "monaco-editor": "^0.49.0",
"ngx-monaco-editor-v2": "^17.0.1", "ngx-monaco-editor-v2": "^18.0.1",
"papaparse": "^5.4.1", "papaparse": "^5.4.1",
"rxjs": "7.8.1", "rxjs": "7.8.1",
"short-uuid": "4.2.2", "short-uuid": "4.2.2",
"tslib": "2.3.1", "tslib": "2.3.1",
"utility-types": "3.10.0", "utility-types": "3.10.0",
"yaml": "2.3.1", "yaml": "2.4.5",
"zone.js": "0.14.2" "zone.js": "0.14.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "17.2.0", "@angular-devkit/build-angular": "18.0.4",
"@angular-eslint/builder": "17.2.1", "@angular-eslint/builder": "18.0.1",
"@angular-eslint/schematics": "17.2.1", "@angular-eslint/schematics": "18.0.1",
"@angular/cli": "17.2.0", "@angular/cli": "18.0.4",
"@angular/compiler-cli": "17.2.1", "@angular/compiler-cli": "18.0.3",
"@types/inputmask": "5.0.3", "@types/inputmask": "5.0.3",
"@types/jasmine": "4.0.3", "@types/jasmine": "4.0.3",
"@types/jwt-decode": "2.2.1", "@types/jwt-decode": "2.2.1",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/papaparse": "^5.3.14", "@types/papaparse": "^5.3.14",
"@vality/cspell-config": "^8.0.1-pr-57-482a037.0", "@vality/cspell-config": "^8.0.1-pr-57-482a037.0",
"@vality/eslint-config": "8.2.0", "@vality/eslint-config-ng": "18.0.1-pr-63-e72dd8e.0",
"@vality/prettier-config": "3.1.0", "@vality/prettier-config": "3.1.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cspell": "^8.3.2", "cspell": "^8.3.2",
"eslint": "^8.53.0", "eslint": "^8.57.0",
"jasmine-core": "4.2.0", "jasmine-core": "4.2.0",
"jasmine-spec-reporter": "7.0.0", "jasmine-spec-reporter": "7.0.0",
"jwt-decode": "2.2.0", "jwt-decode": "2.2.0",
@ -82,7 +82,7 @@
"karma-jasmine": "5.1.0", "karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "2.0.0", "karma-jasmine-html-reporter": "2.0.0",
"prettier": "~3.1.1", "prettier": "~3.1.1",
"typescript": "~5.2.2", "typescript": "~5.4.5",
"typescript-memoize": "1.1.1" "typescript-memoize": "1.1.1"
} }
} }

View File

@ -1,6 +1,6 @@
import { registerLocaleData } from '@angular/common'; import { registerLocaleData } from '@angular/common';
import localeRu from '@angular/common/locales/ru'; import localeRu from '@angular/common/locales/ru';
import { LOCALE_ID, NgModule, Injector } from '@angular/core'; import { LOCALE_ID, NgModule } from '@angular/core';
import { MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER } from '@angular/material/autocomplete'; import { MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER } from '@angular/material/autocomplete';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; import { MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
@ -44,12 +44,6 @@ import {
registerLocaleData(localeRu); registerLocaleData(localeRu);
// Do not use in code! Only for extending windows methods
/* eslint-disable @typescript-eslint/naming-convention */
/** @internal */
export let AppInjector: Injector;
/* eslint-enable @typescript-eslint/naming-convention */
@NgModule({ @NgModule({
declarations: [AppComponent], declarations: [AppComponent],
imports: [ imports: [
@ -102,10 +96,8 @@ export class AppModule {
constructor( constructor(
private matIconRegistry: MatIconRegistry, private matIconRegistry: MatIconRegistry,
private domSanitizer: DomSanitizer, private domSanitizer: DomSanitizer,
private injector: Injector,
) { ) {
this.registerIcons(); this.registerIcons();
AppInjector = this.injector;
} }
registerIcons(): void { registerIcons(): void {

View File

@ -1,5 +1,5 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { APP_INITIALIZER, NgModule } from '@angular/core'; import { APP_INITIALIZER, NgModule } from '@angular/core';
import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular'; import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular';
@ -28,7 +28,7 @@ const initializer = (keycloak: KeycloakService, configService: ConfigService) =>
]); ]);
@NgModule({ @NgModule({
imports: [CommonModule, HttpClientModule, KeycloakAngularModule], imports: [CommonModule, KeycloakAngularModule],
providers: [ providers: [
ConfigService, ConfigService,
{ {
@ -37,6 +37,7 @@ const initializer = (keycloak: KeycloakService, configService: ConfigService) =>
multi: true, multi: true,
deps: [KeycloakService, ConfigService], deps: [KeycloakService, ConfigService],
}, },
provideHttpClient(withInterceptorsFromDi()),
], ],
}) })
export class CoreModule {} export class CoreModule {}

View File

@ -4,6 +4,6 @@
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
.cc-timeline-item-loading-text { .cc-timeline-item-loading-text {
color: mat.get-color-from-palette($foreground, secondary-text); color: mat.m2-get-color-from-palette($foreground, secondary-text);
} }
} }

View File

@ -4,6 +4,6 @@
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
.not-found { .not-found {
color: mat.get-color-from-palette($foreground, secondary-text); color: mat.m2-get-color-from-palette($foreground, secondary-text);
} }
} }

View File

@ -5,7 +5,7 @@ import { InvoicePaymentChargeback } from '@vality/domain-proto/domain';
import { InvoicePaymentChargebackParams } from '@vality/domain-proto/payment_processing'; import { InvoicePaymentChargebackParams } from '@vality/domain-proto/payment_processing';
import { DialogSuperclass, NotifyLogService } from '@vality/ng-core'; import { DialogSuperclass, NotifyLogService } from '@vality/ng-core';
import { from } from 'rxjs'; import { from } from 'rxjs';
import * as short from 'short-uuid'; import short from 'short-uuid';
import { InvoicingService } from '@cc/app/api/payment-processing'; import { InvoicingService } from '@cc/app/api/payment-processing';
import { DomainMetadataFormExtensionsService } from '@cc/app/shared/services'; import { DomainMetadataFormExtensionsService } from '@cc/app/shared/services';

View File

@ -4,6 +4,6 @@
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
.cc-routing-rules-caption { .cc-routing-rules-caption {
color: mat.get-color-from-palette($foreground, secondary-text); color: mat.m2-get-color-from-palette($foreground, secondary-text);
} }
} }

View File

@ -39,7 +39,7 @@
matTooltipPosition="right" matTooltipPosition="right"
style="white-space: nowrap; cursor: default" style="white-space: nowrap; cursor: default"
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -21,17 +21,18 @@ export function createShopFeesColumn<T extends object = TermSetHierarchyObject>(
) { ) {
const filterRreserve = (v: CashFlowPosting) => const filterRreserve = (v: CashFlowPosting) =>
v?.source?.merchant === 0 && v?.destination?.merchant === 1; v?.source?.merchant === 0 && v?.destination?.merchant === 1;
const filterDecisions = (d: T) => (v: InlineCashFlowSelector) =>
(!v?.if?.condition?.party?.definition?.shop_is ||
(v?.if?.condition?.party?.id === getPartyId(d) &&
v?.if?.condition?.party?.definition?.shop_is === getShopId(d))) &&
(!getCurrency(d) ||
!v?.if?.condition?.currency_is?.symbolic_code ||
v?.if?.condition?.currency_is?.symbolic_code === getCurrency(d));
const cols = createFeesColumns<T>( const cols = createFeesColumns<T>(
(d) => getViewedCashFlowSelectors(fn(d)), (d) => getViewedCashFlowSelectors(fn(d)),
(v) => v?.source?.merchant === 0 && v?.destination?.system === 0, (v) => v?.source?.merchant === 0 && v?.destination?.system === 0,
(v) => !filterRreserve(v), (v) => !filterRreserve(v),
(d: T) => (v: InlineCashFlowSelector) => filterDecisions,
(!v?.if?.condition?.party?.definition?.shop_is ||
(v?.if?.condition?.party?.id === getPartyId(d) &&
v?.if?.condition?.party?.definition?.shop_is === getShopId(d))) &&
(!getCurrency(d) ||
!v?.if?.condition?.currency_is?.symbolic_code ||
v?.if?.condition?.currency_is?.symbolic_code === getCurrency(d)),
); );
return [ return [
...cols.slice(0, -1), ...cols.slice(0, -1),
@ -39,9 +40,9 @@ export function createShopFeesColumn<T extends object = TermSetHierarchyObject>(
field: 'rreserve', field: 'rreserve',
header: 'RReserve', header: 'RReserve',
formatter: (d) => formatter: (d) =>
getInlineDecisions(getViewedCashFlowSelectors(fn(d)), filterRreserve).map( getInlineDecisions(getViewedCashFlowSelectors(fn(d)), filterRreserve)
(v) => v.value, .filter(filterDecisions(d))
), .map((v) => v.value),
}, },
cols.at(-1), cols.at(-1),
]; ];

View File

@ -18,7 +18,7 @@
matTooltipPosition="right" matTooltipPosition="right"
style="white-space: nowrap; cursor: default" style="white-space: nowrap; cursor: default"
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -18,7 +18,7 @@
matTooltipPosition="right" matTooltipPosition="right"
style="white-space: nowrap; cursor: default" style="white-space: nowrap; cursor: default"
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -40,7 +40,7 @@
text-overflow: ellipsis; text-overflow: ellipsis;
" "
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -79,7 +79,7 @@ export class TerminalsTermsComponent implements OnInit {
columns: Column<TerminalTermSet>[] = [ columns: Column<TerminalTermSet>[] = [
createDomainObjectColumn<TerminalTermSet>('terminal', (d) => d.terminal_id), createDomainObjectColumn<TerminalTermSet>('terminal', (d) => d.terminal_id),
createDomainObjectColumn<TerminalTermSet>('provider', (d) => d.provider_id), createDomainObjectColumn<TerminalTermSet>('provider', (d) => d.provider_id),
{ field: 'currency' }, { field: 'currencies', formatter: (d) => d.currencies.join(', ') },
...createTerminalFeesColumn<TerminalTermSet>((d) => d.current_term_set), ...createTerminalFeesColumn<TerminalTermSet>((d) => d.current_term_set),
{ {
field: 'term_set_history', field: 'term_set_history',

View File

@ -42,7 +42,7 @@
text-overflow: ellipsis; text-overflow: ellipsis;
" "
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -18,7 +18,7 @@
matTooltipPosition="right" matTooltipPosition="right"
style="white-space: nowrap; cursor: default" style="white-space: nowrap; cursor: default"
> >
{{ item }} {{ value?.length > 1 ? item || '-' : item }}
</div> </div>
</ng-container> </ng-container>
</ng-template> </ng-template>

View File

@ -57,7 +57,9 @@ function formatCashFlowAccount(acc: CashFlowAccount) {
} }
export function formatLevelPredicate(v: InlineCashFlowSelector) { export function formatLevelPredicate(v: InlineCashFlowSelector) {
return `${' '.repeat(v.level)}${formatPredicate(v.if) || (v.level > 0 ? '↳' : '')}`; return `${'\xa0'.repeat(Math.max(v.level - 1, 0))}${v.level > 0 ? '↳' : ''} ${formatPredicate(
v.if,
)}`;
} }
export function getInlineDecisions( export function getInlineDecisions(

View File

@ -6,7 +6,7 @@ import { AdjustmentParams } from '@vality/fistful-proto/withdrawal_adjustment';
import { DialogSuperclass, forkJoinToResult, NotifyLogService } from '@vality/ng-core'; import { DialogSuperclass, forkJoinToResult, NotifyLogService } from '@vality/ng-core';
import { isTypeWithAliases } from '@vality/ng-thrift'; import { isTypeWithAliases } from '@vality/ng-thrift';
import { BehaviorSubject, of } from 'rxjs'; import { BehaviorSubject, of } from 'rxjs';
import * as short from 'short-uuid'; import short from 'short-uuid';
import { ManagementService } from '@cc/app/api/withdrawal'; import { ManagementService } from '@cc/app/api/withdrawal';

View File

@ -6,7 +6,7 @@ import { getNoTimeZoneIsoString, getImportValue } from '@vality/ng-core';
import { ThriftData, isTypeWithAliases } from '@vality/ng-thrift'; import { ThriftData, isTypeWithAliases } from '@vality/ng-thrift';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { map, shareReplay } from 'rxjs/operators'; import { map, shareReplay } from 'rxjs/operators';
import * as short from 'short-uuid'; import short from 'short-uuid';
import { DomainStoreService } from '@cc/app/api/domain-config'; import { DomainStoreService } from '@cc/app/api/domain-config';

View File

@ -3,7 +3,7 @@ import { Party } from '@vality/domain-proto/domain';
import { isTypeWithAliases } from '@vality/ng-thrift'; import { isTypeWithAliases } from '@vality/ng-thrift';
import uniqBy from 'lodash-es/uniqBy'; import uniqBy from 'lodash-es/uniqBy';
import { of } from 'rxjs'; import { of } from 'rxjs';
import * as short from 'short-uuid'; import short from 'short-uuid';
import { import {
MetadataFormExtension, MetadataFormExtension,

View File

@ -1,6 +1,6 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { KeycloakService } from 'keycloak-angular'; import { KeycloakService } from 'keycloak-angular';
import * as short from 'short-uuid'; import short from 'short-uuid';
@Injectable() @Injectable()
export class UserInfoBasedIdGeneratorService { export class UserInfoBasedIdGeneratorService {

View File

@ -28,13 +28,13 @@ export function formatPredicate(predicate: Predicate, level = 0) {
const condition = predicate.condition; const condition = predicate.condition;
switch (getUnionKey(condition)) { switch (getUnionKey(condition)) {
case 'currency_is': case 'currency_is':
return `currency: ${condition.currency_is.symbolic_code}`; return `currency = ${condition.currency_is.symbolic_code}`;
case 'bin_data': case 'bin_data':
return `bin_data: ${inlineJson(toJson(condition.bin_data), Infinity)}`; return `bin_data = ${inlineJson(toJson(condition.bin_data), Infinity)}`;
case 'category_is': case 'category_is':
return `category: #${condition.category_is.id}`; return `category = #${condition.category_is.id}`;
case 'cost_in': case 'cost_in':
return `cost: ${ return `cost = ${
getUnionKey(condition.cost_in.lower) === 'inclusive' ? '[' : '(' getUnionKey(condition.cost_in.lower) === 'inclusive' ? '[' : '('
}${formatCurrency( }${formatCurrency(
getUnionValue(condition.cost_in.lower)?.amount, getUnionValue(condition.cost_in.lower)?.amount,
@ -44,22 +44,26 @@ export function formatPredicate(predicate: Predicate, level = 0) {
getUnionValue(condition.cost_in.upper)?.currency?.symbolic_code, getUnionValue(condition.cost_in.upper)?.currency?.symbolic_code,
)}${getUnionKey(condition.cost_in.upper) === 'inclusive' ? ']' : ')'}`; )}${getUnionKey(condition.cost_in.upper) === 'inclusive' ? ']' : ')'}`;
case 'cost_is_multiple_of': case 'cost_is_multiple_of':
return `cost_is_multiple: ${formatCurrency( return `cost_is_multiple = ${formatCurrency(
condition.cost_is_multiple_of.amount, condition.cost_is_multiple_of.amount,
condition.cost_is_multiple_of.currency.symbolic_code, condition.cost_is_multiple_of.currency.symbolic_code,
)}`; )}`;
case 'identification_level_is': case 'identification_level_is':
return `identification_level: ${condition.identification_level_is}`; // TODO: fix enum value return `identification_level = ${condition.identification_level_is}`; // TODO: fix enum value
case 'p2p_tool': case 'p2p_tool':
return `p2p_tool: ${inlineJson(toJson(condition.p2p_tool), Infinity)}`; return `p2p_tool = ${inlineJson(toJson(condition.p2p_tool), Infinity)}`;
case 'party': case 'party':
return `party: ${inlineJson(toJson(condition.party), Infinity)}`; return `party = (#${condition.party.id}${
condition.party?.definition
? ' & ' + inlineJson(toJson(condition.party?.definition), Infinity)
: ''
})`;
case 'payment_tool': case 'payment_tool':
return `payment_tool: ${inlineJson(toJson(condition.payment_tool), Infinity)}`; return `payment_tool = ${inlineJson(toJson(condition.payment_tool), Infinity)}`;
case 'payout_method_is': case 'payout_method_is':
return `payout_method: #${condition.payout_method_is.id}`; // TODO: fix enum value return `payout_method = ${condition.payout_method_is.id}`; // TODO: fix enum value
case 'shop_location_is': case 'shop_location_is':
return `shop_url: ${condition.shop_location_is.url}`; return `shop_url = ${condition.shop_location_is.url}`;
} }
return ''; return '';
} }

View File

@ -5,6 +5,6 @@
.cc-details-item-title, .cc-details-item-title,
.cc-details-item-content-empty { .cc-details-item-content-empty {
color: mat.get-color-from-palette($foreground, secondary-text); color: mat.m2-get-color-from-palette($foreground, secondary-text);
} }
} }

View File

@ -6,13 +6,13 @@
"outDir": "./dist/out-tsc", "outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"strict": false, "strict": false,
"esModuleInterop": true,
"noImplicitOverride": false, "noImplicitOverride": false,
"noPropertyAccessFromIndexSignature": false, "noPropertyAccessFromIndexSignature": false,
"noImplicitReturns": false, "noImplicitReturns": false,
"noFallthroughCasesInSwitch": false, "noFallthroughCasesInSwitch": false,
"sourceMap": true, "sourceMap": true,
"declaration": false, "declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"moduleResolution": "node", "moduleResolution": "node",
"importHelpers": true, "importHelpers": true,
@ -20,7 +20,6 @@
"module": "ES2022", "module": "ES2022",
"useDefineForClassFields": false, "useDefineForClassFields": false,
"lib": ["ESNext", "DOM"], "lib": ["ESNext", "DOM"],
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"skipLibCheck": true, "skipLibCheck": true,
"paths": { "paths": {