Skip to content

Commit 9b040e7

Browse files
committed
refactor(logging): replace console.error and console.warn with log utility
1 parent c144d2f commit 9b040e7

File tree

15 files changed

+85
-59
lines changed

15 files changed

+85
-59
lines changed

src/app/app.component.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Meta } from '@angular/platform-browser';
33
import { environment } from '../environments/environment';
44
import { AppService } from './service/app.service';
55
import { LayoutService } from './service/layout.service';
6+
import { log } from './model/log';
67
import type { LoadLayout, MahFormat } from './model/types';
78
import { GameComponent } from './components/game/game-component.component';
89

@@ -35,7 +36,7 @@ export class AppComponent implements OnInit {
3536
ngOnInit(): void {
3637
this.init()
3738
.catch(error => {
38-
console.error(error);
39+
log.error(error);
3940
});
4041
}
4142

@@ -65,7 +66,7 @@ export class AppComponent implements OnInit {
6566
this.editorLoading = false;
6667
})
6768
.catch(error => {
68-
console.error(error);
69+
log.error(error);
6970
this.editorLoading = false;
7071
});
7172
}
@@ -109,7 +110,7 @@ export class AppComponent implements OnInit {
109110
try {
110111
window.history.replaceState(null, '', window.location.pathname);
111112
} catch (error) {
112-
console.error(error);
113+
log.error(error);
113114
}
114115
}
115116

@@ -122,31 +123,31 @@ export class AppComponent implements OnInit {
122123
try {
123124
decoded = atob(base64jsonString);
124125
} catch (error) {
125-
console.warn('Import failed: Invalid base64 encoding', error);
126+
log.warn('Import failed: Invalid base64 encoding', error);
126127
return [];
127128
}
128129

129130
let parsed: unknown;
130131
try {
131132
parsed = JSON.parse(decoded);
132133
} catch (error) {
133-
console.warn('Import failed: Invalid JSON format', error);
134+
log.warn('Import failed: Invalid JSON format', error);
134135
return [];
135136
}
136137

137138
const mah = parsed as MahFormat;
138139
if (!mah.mah || mah.mah !== '1.0') {
139-
console.warn('Import failed: Invalid or unsupported MAH format version');
140+
log.warn('Import failed: Invalid or unsupported MAH format version');
140141
return [];
141142
}
142143

143144
if (!Array.isArray(mah.boards)) {
144-
console.warn('Import failed: Missing or invalid boards array');
145+
log.warn('Import failed: Missing or invalid boards array');
145146
return [];
146147
}
147148

148149
if (mah.boards.length === 0) {
149-
console.warn('Import failed: No boards found in import data');
150+
log.warn('Import failed: No boards found in import data');
150151
return [];
151152
}
152153

@@ -163,7 +164,7 @@ export class AppComponent implements OnInit {
163164
imported.push(LayoutService.layout2loadLayout(layout, custom.map));
164165
}
165166
} catch (error) {
166-
console.warn('Failed to import individual board:', error);
167+
log.warn('Failed to import individual board:', error);
167168
}
168169
}
169170

@@ -172,12 +173,12 @@ export class AppComponent implements OnInit {
172173
}
173174

174175
if (result.length === 0) {
175-
console.warn('Import completed but no valid boards were imported');
176+
log.warn('Import completed but no valid boards were imported');
176177
}
177178

178179
return result;
179180
} catch (error) {
180-
console.error('Unexpected error during import:', error);
181+
log.error('Unexpected error during import:', error);
181182
return [];
182183
}
183184
}

src/app/components/board/board.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { PanZoom } from '../../model/pan-zoom';
1010
import { PrefixPipe } from '../../pipes/prefix.pipe';
1111
import { TranslatePipe } from '@ngx-translate/core';
1212
import { PatternService } from '../../service/pattern.service';
13+
import { log } from '../../model/log';
1314

1415
const defaultW = 1470;
1516
const defaultH = 960;
@@ -270,7 +271,7 @@ export class BoardComponent implements OnInit, OnChanges {
270271
this.patternService
271272
.svgDataUrl(pattern, this.cssBarColors())
272273
.then(dataUrl => this.backgroundUrl = dataUrl)
273-
.catch(console.error);
274+
.catch(error => log.error(error));
274275
}
275276

276277
private updateBackground(background: string): void {

src/app/components/game/game-component.component.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Game } from '../../model/game';
33
import type { Stone } from '../../model/stone';
44
import type { Layout, Place } from '../../model/types';
55
import { AppService } from '../../service/app.service';
6+
import { log } from '../../model/log';
67
import type { BUILD_MODE_ID } from '../../model/builder';
78
import type { GAME_MODE_ID } from '../../model/consts';
89
import { environment } from '../../../environments/environment';
@@ -112,7 +113,7 @@ export class GameComponent {
112113
break;
113114
}
114115
case 'g': {
115-
this.debugSolve().catch(console.error);
116+
this.debugSolve().catch(error => log.error(error));
116117
break;
117118
}
118119
case 'u': {
@@ -224,19 +225,19 @@ export class GameComponent {
224225
if (doc.exitFullscreen) {
225226
doc.exitFullscreen()
226227
.catch(error => {
227-
console.warn('Failed to exit fullscreen:', error);
228+
log.warn('Failed to exit fullscreen:', error);
228229
});
229230
} else if (doc.webkitExitFullscreen) {
230231
try {
231232
doc.webkitExitFullscreen();
232233
} catch (error) {
233-
console.warn('Failed to exit fullscreen (webkit):', error);
234+
log.warn('Failed to exit fullscreen (webkit):', error);
234235
}
235236
} else if (doc.mozCancelFullScreen) {
236237
try {
237238
doc.mozCancelFullScreen();
238239
} catch (error) {
239-
console.warn('Failed to exit fullscreen (moz):', error);
240+
log.warn('Failed to exit fullscreen (moz):', error);
240241
}
241242
}
242243
}
@@ -246,19 +247,19 @@ export class GameComponent {
246247
if (element.requestFullscreen) {
247248
element.requestFullscreen()
248249
.catch(error => {
249-
console.warn('Failed to enter fullscreen:', error);
250+
log.warn('Failed to enter fullscreen:', error);
250251
});
251252
} else if (element.webkitRequestFullscreen) {
252253
try {
253254
element.webkitRequestFullscreen();
254255
} catch (error) {
255-
console.warn('Failed to enter fullscreen (webkit):', error);
256+
log.warn('Failed to enter fullscreen (webkit):', error);
256257
}
257258
} else if (element.mozRequestFullScreen) {
258259
try {
259260
element.mozRequestFullScreen();
260261
} catch (error) {
261-
console.warn('Failed to enter fullscreen (moz):', error);
262+
log.warn('Failed to enter fullscreen (moz):', error);
262263
}
263264
}
264265
}

src/app/components/help/help.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { clickExternalHref } from '../../model/external-links';
44
import { DurationPipe } from '../../pipes/duration.pipe';
55
import { LayoutService } from '../../service/layout.service';
66
import { LocalstorageService } from '../../service/localstorage.service';
7+
import { log } from '../../model/log';
78

89
interface StatEntry {
910
name: string;
@@ -93,7 +94,7 @@ export class HelpComponent implements OnInit {
9394
loseCount: 0
9495
};
9596
})
96-
.catch(error => console.error(error));
97+
.catch(error => log.error(error));
9798
}
9899
}
99100

src/app/components/image-set-loader/image-set-loader.component.spec.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { provideHttpClient, HttpClient } from '@angular/common/http';
33
import { SvgdefService } from '../../service/svgdef.service';
44
import { ImageSetLoaderComponent } from './image-set-loader.component';
55
import type { ElementRef } from '@angular/core';
6+
import { log } from '../../model/log';
67

78
interface HackImageSetLoaderComponent {
89
elementRef: ElementRef;
@@ -138,23 +139,19 @@ describe('ImageSetLoaderComponent', () => {
138139

139140
it('should call setError when svgDef.get fails', async () => {
140141
const testImageSet = 'test-image-set';
141-
const originalConsoleError = console.error;
142-
console.error = jest.fn();
143142

144143
fixture.componentRef.setInput('imageSet', testImageSet);
145144
fixture.detectChanges();
146145

147146
SvgdefServiceSpy.get.mockRejectedValue('Error loading SVG');
148147
jest.spyOn(component as unknown as HackImageSetLoaderComponent, 'setError');
149-
jest.spyOn(console, 'error');
148+
jest.spyOn(log, 'error').mockImplementation(jest.fn());
150149

151150
(component as unknown as HackImageSetLoaderComponent).loadImageSet();
152151

153152
// Wait for the promise to reject
154153
await fixture.whenStable();
155154
expect((component as unknown as HackImageSetLoaderComponent).setError).toHaveBeenCalled();
156-
expect(console.error).toHaveBeenCalled();
157-
console.error = originalConsoleError;
158155
});
159156
});
160157

src/app/components/image-set-loader/image-set-loader.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Component, ElementRef, type OnChanges, type SimpleChanges, inject, input } from '@angular/core';
22
import { SvgdefService } from '../../service/svgdef.service';
3+
import { log } from '../../model/log';
34
import { TILES } from '../../model/consts';
45
import { svg_error_icon, svgSpinnerIcon } from './svg';
56

@@ -66,7 +67,7 @@ export class ImageSetLoaderComponent implements OnChanges {
6667
})
6768
.catch(error => {
6869
this.setError();
69-
console.error(error);
70+
log.error(error);
7071
});
7172
}
7273

src/app/components/settings/settings.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const SETTINGS_TABS = [
2626
}
2727
})
2828
export class SettingsComponent implements AfterViewInit {
29-
readonly kyodaiInput = viewChild.required<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('kyodaiInput');
29+
readonly kyodaiInput = viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('kyodaiInput');
3030
readonly canKyodai = environment.kyodai;
3131
readonly kyodaiTileSets = KyodaiTileSets;
3232
readonly sets = ImageSets;
@@ -65,7 +65,7 @@ export class SettingsComponent implements AfterViewInit {
6565

6666
setKyodaiUrl(event: Event): void {
6767
const kyodaiInput = this.kyodaiInput();
68-
if (kyodaiInput.nativeElement) {
68+
if (kyodaiInput?.nativeElement) {
6969
event.preventDefault();
7070
event.stopPropagation();
7171
kyodaiInput.nativeElement.value = (event.target as HTMLSelectElement).value;
@@ -74,7 +74,7 @@ export class SettingsComponent implements AfterViewInit {
7474

7575
applyKyodaiUrl(): void {
7676
const kyodaiInput = this.kyodaiInput();
77-
if (kyodaiInput.nativeElement) {
77+
if (kyodaiInput?.nativeElement) {
7878
this.app.settings.kyodaiUrl = kyodaiInput.nativeElement.value;
7979
this.app.settings.save();
8080
}

src/app/model/log.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { environment } from '../../environments/environment';
2+
3+
const enabled = environment.logging;
4+
5+
export const log = {
6+
error(...parameters: Array<unknown>): void {
7+
if (enabled) {
8+
console.error(...parameters);
9+
}
10+
},
11+
warn(...parameters: Array<unknown>): void {
12+
if (enabled) {
13+
console.warn(...parameters);
14+
}
15+
}
16+
};

src/app/modules/editor/components/import/import.component.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Component, inject, output } from '@angular/core';
22
import type { Layout, LoadLayout } from '../../../../model/types';
33
import { LayoutService } from '../../../../service/layout.service';
4+
import { log } from '../../../../model/log';
45
import { importLayouts } from '../../model/import';
56
import { TranslatePipe } from '@ngx-translate/core';
67
import { DropZoneDirective } from '../../directives/drop-zone.directive';
@@ -39,12 +40,12 @@ export class ImportComponent {
3940
imported.push(LayoutService.layout2loadLayout(layout, loadLayout.map));
4041
this.logs.push({ msg: `Imported: "${file.name}"`, id: layout.id });
4142
} else {
42-
console.error(`Similar layout to "${layout.name}" already available. Import rejected`);
43+
log.error(`Similar layout to "${layout.name}" already available. Import rejected`);
4344
this.logs.push({ msg: `Similar layout to "${layout.name}" already available. Import rejected.`, isError: true });
4445
}
4546
}
4647
} catch (error) {
47-
console.error('Error importing', file, error);
48+
log.error('Error importing', file, error);
4849
this.logs.push({ msg: `ERROR importing "${file.name}". Invalid file.`, isError: true });
4950
}
5051
}
@@ -63,7 +64,7 @@ export class ImportComponent {
6364
importFiles(files: Array<File>): void {
6465
this.importLayouts(files)
6566
.catch(error => {
66-
console.error(error);
67+
log.error(error);
6768
});
6869
}
6970

src/app/service/layout.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { expandMapping, mappingToID } from '../model/mapping';
66
import { generateBase64SVG } from '../model/layout-svg';
77
import type { CompactMapping, Layout, Layouts, LoadLayout, Mapping, SafeUrlSVG } from '../model/types';
88
import { LocalstorageService } from './localstorage.service';
9+
import { log } from '../model/log';
910

1011
@Injectable({ providedIn: 'root' })
1112
export class LayoutService {
@@ -93,13 +94,13 @@ export class LayoutService {
9394
return await firstValueFrom(
9495
this.http.get<Array<LoadLayout>>('assets/data/boards.json').pipe(
9596
catchError((error: unknown) => {
96-
console.error('Failed to load boards.json:', error);
97+
log.error('Failed to load boards.json:', error);
9798
return of([]);
9899
})
99100
)
100101
);
101102
} catch (error) {
102-
console.error('Critical error loading boards:', error);
103+
log.error('Critical error loading boards:', error);
103104
return [];
104105
}
105106
}

0 commit comments

Comments
 (0)