From a6e9bf0612b323df67a2b5821212cb82fcbea272 Mon Sep 17 00:00:00 2001 From: Scott O'Hara Date: Fri, 29 Oct 2021 16:14:37 +1100 Subject: [PATCH] Use nullish coalescing, optional catch bindings and logical nullish assignment operator (Fixes #93) --- cypress/support/index.ts | 8 ++++---- cypress/tsconfig.json | 3 ++- .../controllers/dataSync-controller_spec.ts | 2 +- src/controllers/dataSync-controller.ts | 2 +- src/controllers/episodes-controller.ts | 2 +- src/controllers/program-controller.ts | 9 ++------- src/controllers/series-controller.ts | 2 +- src/models/episode-model.ts | 16 +++++++--------- src/models/program-model.ts | 14 ++++++-------- src/models/series-model.ts | 18 ++++++++---------- src/models/setting-model.ts | 4 ++-- src/models/sync-model.ts | 4 ++-- src/stores/series.ts | 6 +----- 13 files changed, 38 insertions(+), 52 deletions(-) diff --git a/cypress/support/index.ts b/cypress/support/index.ts index 569c10c..468506a 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -115,7 +115,7 @@ Cypress.Commands.add("createTestData", ({ programs = [], settings = [] }: TestDa await programsStore.save({ ProgramID: programId, - Name: undefined === programName ? `Program ${programIndex}` : programName + Name: programName ?? `Program ${programIndex}` }); series.forEach(async ({ seriesName, nowShowing, episodes }, seriesIndex): Promise => { @@ -123,15 +123,15 @@ Cypress.Commands.add("createTestData", ({ programs = [], settings = [] }: TestDa await seriesStore.save({ SeriesID: seriesId, - Name: undefined === seriesName ? `Series ${seriesIndex}` : seriesName, - NowShowing: undefined === nowShowing ? null : nowShowing, + Name: seriesName ?? `Series ${seriesIndex}`, + NowShowing: nowShowing ?? null, ProgramID: programId }); episodes.forEach(async ({ episodeName, status = "", statusDate = "", unverified = "false", unscheduled = "false" }, episodeIndex): Promise => { await episodesStore.save({ EpisodeID: `${seriesId}-${episodeIndex}`, - Name: undefined === episodeName ? `Episode ${episodeIndex}` : episodeName, + Name: episodeName ?? `Episode ${episodeIndex}`, SeriesID: seriesId, Status: status, StatusDate: statusDate, diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json index 8a1a223..1d7b0e4 100644 --- a/cypress/tsconfig.json +++ b/cypress/tsconfig.json @@ -11,7 +11,8 @@ "types": [ "cypress", "node" - ] + ], + "target": "ES2019" }, "exclude": [ "node_modules" diff --git a/spec/public/controllers/dataSync-controller_spec.ts b/spec/public/controllers/dataSync-controller_spec.ts index c309763..6b6dbe7 100644 --- a/spec/public/controllers/dataSync-controller_spec.ts +++ b/spec/public/controllers/dataSync-controller_spec.ts @@ -644,7 +644,7 @@ describe("DataSyncController", (): void => { beforeEach((): SyncMock => (sync = new SyncMock(null, "1"))); scenarios.forEach((scenario: Scenario): void => { - describe(null === scenario.type ? "invalid sync type" : scenario.type, (): void => { + describe(scenario.type ?? "invalid sync type", (): void => { let model: Model | undefined; beforeEach(async (): Promise => { diff --git a/src/controllers/dataSync-controller.ts b/src/controllers/dataSync-controller.ts index 92cc6bd..5e9892a 100644 --- a/src/controllers/dataSync-controller.ts +++ b/src/controllers/dataSync-controller.ts @@ -835,7 +835,7 @@ export default class DataSyncController extends ViewController { if (!response.ok) { this.syncError("Save error", type, `Error saving ${type.toLowerCase()}`); } - } catch (_e: unknown) { + } catch { // No op } diff --git a/src/controllers/episodes-controller.ts b/src/controllers/episodes-controller.ts index 8c3901d..9cfdaaa 100644 --- a/src/controllers/episodes-controller.ts +++ b/src/controllers/episodes-controller.ts @@ -75,7 +75,7 @@ export default class EpisodesController extends ViewController { leftButton: { eventHandler: this.goBack.bind(this) as NavButtonEventHandler, style: "backButton", - label: undefined === this.listItem.source ? "Series" : this.listItem.source + label: this.listItem.source ?? "Series" }, rightButton: { eventHandler: this.addItem.bind(this) as NavButtonEventHandler, diff --git a/src/controllers/program-controller.ts b/src/controllers/program-controller.ts index 0ee23e0..616da8a 100644 --- a/src/controllers/program-controller.ts +++ b/src/controllers/program-controller.ts @@ -35,13 +35,8 @@ export default class ProgramController extends ViewController { public constructor(listItem?: ProgramListItem) { super(); - // If a list item was not passed, we're adding a new program - if (undefined === listItem) { - this.listItem = { program: new Program(null, "", 0, 0, 0, 0, 0) }; - } else { - // Otherwise we're editing an existing program - this.listItem = listItem; - } + // If a list item was passed, we're editing an existing program, otherwise we're adding a new program + this.listItem = listItem ?? { program: new Program(null, "", 0, 0, 0, 0, 0) }; } /** diff --git a/src/controllers/series-controller.ts b/src/controllers/series-controller.ts index 563bc61..cfc5f3a 100644 --- a/src/controllers/series-controller.ts +++ b/src/controllers/series-controller.ts @@ -95,7 +95,7 @@ export default class SeriesController extends ViewController { // Set the series details $("#seriesName").val(String(this.listItem.series.seriesName)); - $("#nowShowing").val(null === this.listItem.series.nowShowing ? "" : String(this.listItem.series.nowShowing)); + $("#nowShowing").val(this.listItem.series.nowShowing ?? ""); $("#moveTo").val(String(this.listItem.series.programId)); } diff --git a/src/models/episode-model.ts b/src/models/episode-model.ts index 390879e..967ba59 100644 --- a/src/models/episode-model.ts +++ b/src/models/episode-model.ts @@ -73,7 +73,7 @@ export default class Episode extends Base { try { episodeList = await Promise.all((await (await this.db).episodesStore.listBySeries(seriesId)).map((ep: PersistedEpisode): Episode => new Episode(ep.EpisodeID, ep.Name, ep.Status, ep.StatusDate, ep.SeriesID, "true" === ep.Unverified, "true" === ep.Unscheduled, ep.Sequence, ep.SeriesName, ep.ProgramName))); - } catch (_e: unknown) { + } catch { // No op } @@ -91,7 +91,7 @@ export default class Episode extends Base { try { episodeList = await Promise.all((await (await this.db).episodesStore.listByUnscheduled()).map((ep: PersistedEpisode): Episode => new Episode(ep.EpisodeID, ep.Name, ep.Status, ep.StatusDate, ep.SeriesID, "true" === ep.Unverified, "true" === ep.Unscheduled, ep.Sequence, ep.SeriesName, ep.ProgramName))); - } catch (_e: unknown) { + } catch { // No op } @@ -121,7 +121,7 @@ export default class Episode extends Base { if (undefined !== ep) { ({ EpisodeID, Name, Status, StatusDate, Unverified, Unscheduled, Sequence, SeriesID } = ep); } - } catch (_e: unknown) { + } catch { // No op } @@ -139,7 +139,7 @@ export default class Episode extends Base { try { count = await (await this.db).episodesStore.totalCount(); - } catch (_e: unknown) { + } catch { // No op } @@ -158,7 +158,7 @@ export default class Episode extends Base { try { count = await (await this.db).episodesStore.countByStatus(status); - } catch (_e: unknown) { + } catch { // No op } @@ -204,9 +204,7 @@ export default class Episode extends Base { */ public async save(): Promise { // If an id has not been set (ie. is a new episode to be added), generate a new UUID - if (null === this.id) { - this.id = v4(); - } + this.id ??= v4(); try { await (await this.db).episodesStore.save({ @@ -221,7 +219,7 @@ export default class Episode extends Base { }); return this.id; - } catch (_e: unknown) { + } catch { // No op } diff --git a/src/models/program-model.ts b/src/models/program-model.ts index c797e11..025cba2 100644 --- a/src/models/program-model.ts +++ b/src/models/program-model.ts @@ -79,7 +79,7 @@ export default class Program extends Base { try { programList = await Promise.all((await (await this.db).programsStore.list()).map((prog: PersistedProgram): Program => new Program(prog.ProgramID, prog.Name, prog.SeriesCount, prog.EpisodeCount, prog.WatchedCount, prog.RecordedCount, prog.ExpectedCount))); - } catch (_e: unknown) { + } catch { // No op } @@ -103,7 +103,7 @@ export default class Program extends Base { if (undefined !== prog) { ({ ProgramID, Name } = prog); } - } catch (_e: unknown) { + } catch { // No op } @@ -121,7 +121,7 @@ export default class Program extends Base { try { count = await (await this.db).programsStore.count(); - } catch (_e: unknown) { + } catch { // No op } @@ -167,9 +167,7 @@ export default class Program extends Base { */ public async save(): Promise { // If an id has not been set (ie. is a new program to be added), generate a new UUID - if (null === this.id) { - this.id = v4(); - } + this.id ??= v4(); try { await (await this.db).programsStore.save({ @@ -178,7 +176,7 @@ export default class Program extends Base { }); return this.id; - } catch (_e: unknown) { + } catch { // No op } @@ -227,7 +225,7 @@ export default class Program extends Base { * @desc Returns the group that the program belongs to */ public get programGroup(): string { - return null === this.programName ? "" : this.programName.substring(0, 1).toUpperCase(); + return this.programName?.substring(0, 1).toUpperCase() ?? ""; } /** diff --git a/src/models/series-model.ts b/src/models/series-model.ts index 8fdc62c..4512703 100644 --- a/src/models/series-model.ts +++ b/src/models/series-model.ts @@ -95,7 +95,7 @@ export default class Series extends Base { try { seriesList = await Promise.all((await (await this.db).seriesStore.listByProgram(programId)).map((series: PersistedSeries): Series => new Series(series.SeriesID, series.Name, series.NowShowing, series.ProgramID, series.ProgramName, series.EpisodeCount, series.WatchedCount, series.RecordedCount, series.ExpectedCount, series.MissedCount, series.StatusWarningCount))); - } catch (_e: unknown) { + } catch { // No op } @@ -113,7 +113,7 @@ export default class Series extends Base { try { seriesList = await Promise.all((await (await this.db).seriesStore.listByNowShowing()).map((series: PersistedSeries): Series => new Series(series.SeriesID, series.Name, series.NowShowing, series.ProgramID, series.ProgramName, series.EpisodeCount, series.WatchedCount, series.RecordedCount, series.ExpectedCount, series.MissedCount, series.StatusWarningCount))); - } catch (_e: unknown) { + } catch { // No op } @@ -132,7 +132,7 @@ export default class Series extends Base { try { seriesList = await Promise.all((await (await this.db).seriesStore.listByStatus(status)).map((series: PersistedSeries): Series => new Series(series.SeriesID, series.Name, series.NowShowing, series.ProgramID, series.ProgramName, series.EpisodeCount, series.WatchedCount, series.RecordedCount, series.ExpectedCount, series.MissedCount, series.StatusWarningCount))); - } catch (_e: unknown) { + } catch { // No op } @@ -150,7 +150,7 @@ export default class Series extends Base { try { seriesList = await Promise.all((await (await this.db).seriesStore.listByIncomplete()).map((series: PersistedSeries): Series => new Series(series.SeriesID, series.Name, series.NowShowing, series.ProgramID, series.ProgramName, series.EpisodeCount, series.WatchedCount, series.RecordedCount, series.ExpectedCount, series.MissedCount, series.StatusWarningCount))); - } catch (_e: unknown) { + } catch { // No op } @@ -176,7 +176,7 @@ export default class Series extends Base { if (undefined !== series) { ({ SeriesID, Name, NowShowing, ProgramID } = series); } - } catch (_e: unknown) { + } catch { // No op } @@ -194,7 +194,7 @@ export default class Series extends Base { try { count = await (await this.db).seriesStore.count(); - } catch (_e: unknown) { + } catch { // No op } @@ -240,9 +240,7 @@ export default class Series extends Base { */ public async save(): Promise { // If an id has not been set (ie. is a new series to be added), generate a new UUID - if (null === this.id) { - this.id = v4(); - } + this.id ??= v4(); try { await (await this.db).seriesStore.save({ @@ -253,7 +251,7 @@ export default class Series extends Base { }); return this.id; - } catch (_e: unknown) { + } catch { // No op } diff --git a/src/models/setting-model.ts b/src/models/setting-model.ts index 9ecc37b..bfcaaa3 100644 --- a/src/models/setting-model.ts +++ b/src/models/setting-model.ts @@ -44,7 +44,7 @@ export default class Setting extends Base { if (undefined !== persistedSetting) { ({ name, value } = persistedSetting); } - } catch (_e: unknown) { + } catch { // No op } @@ -63,7 +63,7 @@ export default class Setting extends Base { await (await this.db).settingsStore.save(String(this.settingName), String(this.settingValue)); return true; - } catch (_e: unknown) { + } catch { return false; } } diff --git a/src/models/sync-model.ts b/src/models/sync-model.ts index b1781ec..6066b9c 100644 --- a/src/models/sync-model.ts +++ b/src/models/sync-model.ts @@ -46,7 +46,7 @@ export default class Sync extends Base { try { syncList = await Promise.all((await (await this.db).syncsStore.list()).map((sync: PersistedSync): Sync => new Sync(sync.Type, sync.ID, sync.Action))); - } catch (_e: unknown) { + } catch { // No op } @@ -64,7 +64,7 @@ export default class Sync extends Base { try { count = await (await this.db).syncsStore.count(); - } catch (_e: unknown) { + } catch { // No op } diff --git a/src/stores/series.ts b/src/stores/series.ts index 626fce6..b4fae84 100644 --- a/src/stores/series.ts +++ b/src/stores/series.ts @@ -143,11 +143,7 @@ function create(db: IDBPDatabase): SeriesStore { // Get set of series with at least one episode in the specified status (await txEpisodesStore.index("status").getAll(IDBKeyRange.bound([status], [status, "~"]))).forEach((episode: EpisodesStoreObject): void => { - let count: number | undefined = series.get(episode.seriesId); - - if (undefined === count) { - count = 0; - } + const count: number = series.get(episode.seriesId) ?? 0; series.set(episode.seriesId, count + 1); });