diff --git a/.eslintrc.json b/.eslintrc.json index b1e8dfba..1b6d13a3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -26,8 +26,9 @@ "plugin:import/recommended", "plugin:import/typescript", "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/recommended" + "plugin:@angular-eslint/recommended", + "plugin:@typescript-eslint/recommended-type-checked", + "plugin:@typescript-eslint/stylistic-type-checked" ], "settings": { "import/resolver": { @@ -37,8 +38,12 @@ } }, "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": true, + "tsconfigRootDir": "." + }, "plugins": [ - "eslint-plugin-import", + "import", "eslint-plugin-prefer-arrow", "@angular-eslint", "@typescript-eslint" @@ -102,6 +107,9 @@ } ], "@typescript-eslint/consistent-type-definitions": ["error", "type"], + "@typescript-eslint/prefer-optional-chain": "error", + "@typescript-eslint/prefer-nullish-coalescing": "error", + "@typescript-eslint/restrict-plus-operands": "error", "@angular-eslint/prefer-standalone-component": ["error"], "@angular-eslint/sort-lifecycle-methods": ["error"], "@angular-eslint/component-max-inline-declarations": ["error"], diff --git a/package.json b/package.json index 5a8de6d9..3d81af55 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "engines": { "pnpm": ">=8", - "node": ">=18.12 <20.0.0" + "node": ">=18.18 <20.0.0" }, "private": true, "dependencies": { @@ -69,8 +69,8 @@ "@types/luxon": "~3.4.2", "@types/node": "~16.18.83", "@types/xml2js": "^0.4.14", - "@typescript-eslint/eslint-plugin": "~5.62.0", - "@typescript-eslint/parser": "~5.62.0", + "@typescript-eslint/eslint-plugin": "~7.0.2", + "@typescript-eslint/parser": "~7.0.2", "eslint": "^8.57.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-node": "11.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81ecb8ce..c8468a26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,17 +128,17 @@ devDependencies: specifier: ^0.4.14 version: 0.4.14 '@typescript-eslint/eslint-plugin': - specifier: ~5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.1.6) + specifier: ~7.0.2 + version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/parser': - specifier: ~5.62.0 - version: 5.62.0(eslint@8.57.0)(typescript@5.1.6) + specifier: ~7.0.2 + version: 7.0.2(eslint@8.57.0)(typescript@5.1.6) eslint: specifier: ^8.57.0 version: 8.57.0 eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.0.2)(eslint@8.57.0) eslint-plugin-node: specifier: 11.1.0 version: 11.1.0(eslint@8.57.0) @@ -3411,29 +3411,30 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.1.6): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.57.0)(typescript@5.1.6): + resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/type-utils': 7.0.2(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.1.6) + ts-api-utils: 1.2.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -3459,19 +3460,20 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.6): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@7.0.2(eslint@8.57.0)(typescript@5.1.6): + resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 7.0.2 debug: 4.3.4 eslint: 8.57.0 typescript: 5.1.6 @@ -3487,6 +3489,14 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true + /@typescript-eslint/scope-manager@7.0.2: + resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 + dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@5.1.6): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3527,11 +3537,36 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils@7.0.2(eslint@8.57.0)(typescript@5.1.6): + resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.1.6) + '@typescript-eslint/utils': 7.0.2(eslint@8.57.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.2.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@7.0.2: + resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3553,6 +3588,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@7.0.2(typescript@5.1.6): + resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/visitor-keys': 7.0.2 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@5.1.6): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3593,6 +3650,25 @@ packages: - typescript dev: true + /@typescript-eslint/utils@7.0.2(eslint@8.57.0)(typescript@5.1.6): + resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 7.0.2 + '@typescript-eslint/types': 7.0.2 + '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.1.6) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3601,6 +3677,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.0.2: + resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.0.2 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true @@ -5430,7 +5514,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -5451,7 +5535,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.1.6) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -5481,7 +5565,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.0.2)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -5491,7 +5575,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.1.6) + '@typescript-eslint/parser': 7.0.2(eslint@8.57.0)(typescript@5.1.6) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 @@ -5500,7 +5584,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.0.2)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -9927,6 +10011,15 @@ packages: engines: {node: '>=8'} dev: true + /ts-api-utils@1.2.1(typescript@5.1.6): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: diff --git a/src/app/list-composition/list-composition.component.ts b/src/app/list-composition/list-composition.component.ts index a22c048b..a9a7bfdb 100644 --- a/src/app/list-composition/list-composition.component.ts +++ b/src/app/list-composition/list-composition.component.ts @@ -168,7 +168,7 @@ export class ListCompositionComponent .pipe( skipWhile(done => done !== undefined && !done), switchMap(() => this.dexieService.compositionTable.getAll()), - catchError(err => + catchError((err: unknown) => this.utilsService.handleError( err, 'Error when reading compositions table' diff --git a/src/app/list-fichier/list-fichier.component.ts b/src/app/list-fichier/list-fichier.component.ts index 913f5c31..c99288e2 100644 --- a/src/app/list-fichier/list-fichier.component.ts +++ b/src/app/list-fichier/list-fichier.component.ts @@ -20,6 +20,7 @@ import { FormControl, FormsModule, ReactiveFormsModule, + NonNullableFormBuilder, } from '@angular/forms'; import {yearsValidator} from '@utils/year.validator'; import {NavigationService} from '@services/navigation.service'; @@ -131,18 +132,14 @@ export class ListFichierComponent end: FormControl; }>( { - author: new FormControl(), - name: new FormControl(), - type: new FormControl('', { - nonNullable: true, - }), - deleted: new FormControl(), - category: new FormControl([], { - nonNullable: true, - }), - top: new FormControl(), - begin: new FormControl(), - end: new FormControl(), + author: this.fb.control(''), + name: this.fb.control(''), + type: this.fb.control(''), + deleted: this.fb.control(false), + category: this.fb.control([]), + top: this.fb.control(false), + begin: this.fb.control(undefined), + end: this.fb.control(undefined), }, {validators: yearsValidator} ); @@ -151,7 +148,8 @@ export class ListFichierComponent private myFichiersService: DataService, private dexieService: DexieService, protected serviceUtils: UtilsService, - private navigationService: NavigationService + private navigationService: NavigationService, + private fb: NonNullableFormBuilder ) { super(serviceUtils); } diff --git a/src/app/row-action/row-action.directive.ts b/src/app/row-action/row-action.directive.ts index abf66a4c..1b447b74 100644 --- a/src/app/row-action/row-action.directive.ts +++ b/src/app/row-action/row-action.directive.ts @@ -21,7 +21,7 @@ export class RowActionDirective implements AfterViewInit { private readonly threshold = 900; constructor( - private elementRef: ElementRef, + private elementRef: ElementRef, private dialog: MatDialog ) {} diff --git a/src/app/services/data.service.ts b/src/app/services/data.service.ts index 6b074e34..a16c3401 100644 --- a/src/app/services/data.service.ts +++ b/src/app/services/data.service.ts @@ -145,7 +145,7 @@ export class DataService { parse(xmlFile: string): T[] { let list: T[] = []; - new xml2js.Parser().parseString(xmlFile, (err, result) => { + new xml2js.Parser().parseString(xmlFile, (err, result: unknown) => { if (err) { console.error(err); } diff --git a/src/app/services/dropbox.service.ts b/src/app/services/dropbox.service.ts index 0787383f..33fd7297 100644 --- a/src/app/services/dropbox.service.ts +++ b/src/app/services/dropbox.service.ts @@ -42,7 +42,7 @@ export class DropboxService { path: DropboxService.getPath(fileName), }) ).pipe( - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument switchMap((response: any) => { const fileReader = new FileReader(); return new Observable(observer => { @@ -53,6 +53,7 @@ export class DropboxService { fileReader.onload = () => observer.next(fileReader?.result?.toString() ?? ''); fileReader.onloadend = () => observer.complete(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access fileReader.readAsBinaryString(response.result.fileBlob); }); }), diff --git a/src/app/services/utils.service.ts b/src/app/services/utils.service.ts index ae186de0..c2ac9d99 100644 --- a/src/app/services/utils.service.ts +++ b/src/app/services/utils.service.ts @@ -8,7 +8,6 @@ import { import {Injectable} from '@angular/core'; import {HttpHeaders, HttpClient, HttpErrorResponse} from '@angular/common/http'; import {ToastService} from './toast.service'; -import {GlobalError} from '@utils/model'; import {BreakpointObserver, Breakpoints} from '@angular/cdk/layout'; @Injectable({providedIn: 'root'}) @@ -19,30 +18,40 @@ export class UtilsService { private breakpointObserver: BreakpointObserver ) {} - static getErrorMessage(error: GlobalError): string { - let message; + static getErrorMessage(error: unknown): string { + let message = ''; if (UtilsService.isHttpError(error)) { let msg; + /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call */ if (error.error?.errors) { msg = error.error.errors.join(', '); } else if (error.error.response) { msg = error.error.response.statusText; } + /* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call */ message = `Status ${error.status}: ${msg}`; } else if (UtilsService.isError(error)) { message = error.message; - } else { + } else if (typeof error === 'string') { message = error; } return message; } - private static isHttpError(error: GlobalError): error is HttpErrorResponse { - return (error as HttpErrorResponse).status !== undefined; + private static isHttpError(error: unknown): error is HttpErrorResponse { + return ( + typeof error === 'object' && + error !== null && + (error as HttpErrorResponse).status !== undefined + ); } - private static isError(error: GlobalError): error is Error { - return (error as Error).message !== undefined; + private static isError(error: unknown): error is Error { + return ( + typeof error === 'object' && + error !== null && + (error as Error).message !== undefined + ); } static encodeQueryUrl(query: string): string { @@ -56,7 +65,7 @@ export class UtilsService { return new HttpHeaders({'Content-Type': 'application/json'}); } - handleError(error: GlobalError, message: string): Observable { + handleError(error: unknown, message: string): Observable { console.error('handleError', error); this.toast.open(UtilsService.getErrorMessage(error)); return throwError(() => message); diff --git a/src/app/utils/model.ts b/src/app/utils/model.ts index c714351c..0a3de532 100644 --- a/src/app/utils/model.ts +++ b/src/app/utils/model.ts @@ -1,4 +1,3 @@ -import {HttpErrorResponse} from '@angular/common/http'; import {SortDirection} from '@angular/material/sort'; export class Fichier { @@ -84,13 +83,10 @@ export class Composition { } export class Dropdown { - label: string; - code: string; - - constructor(label: string, code: string) { - this.label = label; - this.code = code; - } + constructor( + public label: string, + public code: string + ) {} } export class File { @@ -101,8 +97,6 @@ export class File { export const isComposition = (c: Composition | Fichier): c is Composition => 'artist' in c; -export type GlobalError = Error | HttpErrorResponse | string; - export type Field = `${string & keyof T}`; export type Sort = {active: Field; direction: SortDirection}; diff --git a/src/app/utils/table.ts b/src/app/utils/table.ts index 7284da97..9d19c6a8 100644 --- a/src/app/utils/table.ts +++ b/src/app/utils/table.ts @@ -1,4 +1,4 @@ -import Dexie from 'dexie'; +import Dexie, {BulkError} from 'dexie'; import {Observable, from} from 'rxjs'; export class Table { @@ -20,10 +20,7 @@ export class Table { return from(this.dexie.get(key)); } - update( - key: number, - changes: {[keyPath: string]: string} - ): Observable { + update(key: number, changes: Record): Observable { return from(this.dexie.update(key, changes)); } @@ -36,7 +33,7 @@ export class Table { this.dexie .bulkAdd(data) .then(() => console.warn(`Done adding ${data.length} datas`)) - .catch(Dexie.BulkError, e => { + .catch(Dexie.BulkError, (e: BulkError) => { // Explicitely catching the bulkAdd() operation makes those successful // additions commit despite that there were errors. console.error( diff --git a/src/app/utils/xml.ts b/src/app/utils/xml.ts index f7cd31d3..c26ed689 100644 --- a/src/app/utils/xml.ts +++ b/src/app/utils/xml.ts @@ -44,6 +44,8 @@ export type XC = { Compositions: XCompositions; }; -export const isXF = (data: XC | XF): data is XF => 'Fichiers' in data; +export const isXF = (data: unknown): data is XF => + typeof data === 'object' && data !== null && 'Fichiers' in data; -export const isXC = (data: XC | XF): data is XC => 'Compositions' in data; +export const isXC = (data: unknown): data is XC => + typeof data === 'object' && data !== null && 'Compositions' in data;