diff --git a/package-lock.json b/package-lock.json
index 4b4e6d1..c15d2d7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "obsidian-media-db-plugin",
- "version": "0.3.0",
+ "version": "0.3.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "obsidian-media-db-plugin",
- "version": "0.3.0",
+ "version": "0.3.1",
"license": "GPL-3.0",
"dependencies": {
"ts-node": "^10.8.1",
diff --git a/package.json b/package.json
index e2a88d0..6e5a9db 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "obsidian-media-db-plugin",
- "version": "0.3.1",
+ "version": "0.3.2",
"description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.",
"main": "main.js",
"scripts": {
diff --git a/src/api/apis/BoardGameGeekAPI.ts b/src/api/apis/BoardGameGeekAPI.ts
index 174bbff..4996eb6 100644
--- a/src/api/apis/BoardGameGeekAPI.ts
+++ b/src/api/apis/BoardGameGeekAPI.ts
@@ -32,16 +32,16 @@ export class BoardGameGeekAPI extends APIModel {
}
const data = fetchData.text;
- const response = new window.DOMParser().parseFromString(data, "text/xml")
+ const response = new window.DOMParser().parseFromString(data, 'text/xml');
debugLog(response);
let ret: MediaTypeModel[] = [];
- for (const boardgame of Array.from(response.querySelectorAll("boardgame"))) {
- const id = boardgame.attributes.getNamedItem("objectid")!.value;
- const title = boardgame.querySelector("name")!.textContent!;
- const year = boardgame.querySelector("yearpublished")?.textContent ?? "";
+ for (const boardgame of Array.from(response.querySelectorAll('boardgame'))) {
+ const id = boardgame.attributes.getNamedItem('objectid')!.value;
+ const title = boardgame.querySelector('name')!.textContent!;
+ const year = boardgame.querySelector('yearpublished')?.textContent ?? '';
ret.push(new BoardGameModel({
dataSource: this.apiName,
@@ -68,21 +68,21 @@ export class BoardGameGeekAPI extends APIModel {
}
const data = fetchData.text;
- const response = new window.DOMParser().parseFromString(data, "text/xml")
+ const response = new window.DOMParser().parseFromString(data, 'text/xml');
debugLog(response);
- const boardgame = response.querySelector("boardgame")!;
- const title = boardgame.querySelector("name")!.textContent!;
- const year = boardgame.querySelector("yearpublished")?.textContent ?? "";
- const image = boardgame.querySelector("image")?.textContent ?? undefined;
- const onlineRating = Number.parseFloat(boardgame.querySelector("statistics ratings average")?.textContent ?? "");
- const genres = Array.from(boardgame.querySelectorAll("boardgamecategory")).map(n => n!.textContent!);
+ const boardgame = response.querySelector('boardgame')!;
+ const title = boardgame.querySelector('name')!.textContent!;
+ const year = boardgame.querySelector('yearpublished')?.textContent ?? '';
+ const image = boardgame.querySelector('image')?.textContent ?? undefined;
+ const onlineRating = Number.parseFloat(boardgame.querySelector('statistics ratings average')?.textContent ?? '');
+ const genres = Array.from(boardgame.querySelectorAll('boardgamecategory')).map(n => n!.textContent!);
const model = new BoardGameModel({
type: MediaType.BoardGame,
title,
englishTitle: title,
- year: year === "0" ? "" : year,
+ year: year === '0' ? '' : year,
dataSource: this.apiName,
url: `https://boardgamegeek.com/boardgame/${id}`,
id,
diff --git a/src/main.ts b/src/main.ts
index aba9251..218dddb 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -305,7 +305,7 @@ export default class MediaDbPlugin extends Plugin {
const erroredFiles: { filePath: string, error: string }[] = [];
let canceled: boolean = false;
- const {selectedAPI, titleFieldName, appendContent} = await new Promise<{selectedAPI: string, titleFieldName: string, appendContent: boolean}>((resolve, reject) => {
+ const {selectedAPI, titleFieldName, appendContent} = await new Promise<{ selectedAPI: string, titleFieldName: string, appendContent: boolean }>((resolve, reject) => {
new MediaDbFolderImportModal(this.app, this, ((selectedAPI: string, titleFieldName: string, appendContent: boolean) => {
resolve({selectedAPI, titleFieldName, appendContent});
})).open();
@@ -402,7 +402,7 @@ export default class MediaDbPlugin extends Plugin {
if (err) {
return reject(err);
}
- resolve(res)
+ resolve(res);
}).open();
});
}
@@ -413,7 +413,7 @@ export default class MediaDbPlugin extends Plugin {
if (err) {
return reject(err);
}
- resolve(res)
+ resolve(res);
}).open();
});
}
@@ -426,7 +426,7 @@ export default class MediaDbPlugin extends Plugin {
}
resolve(res);
}, () => {
- resolve([])
+ resolve([]);
}).open();
});
}
diff --git a/src/modals/MediaDbAdvancedSearchModal.ts b/src/modals/MediaDbAdvancedSearchModal.ts
index c463f4c..246590b 100644
--- a/src/modals/MediaDbAdvancedSearchModal.ts
+++ b/src/modals/MediaDbAdvancedSearchModal.ts
@@ -8,10 +8,10 @@ export class MediaDbAdvancedSearchModal extends Modal {
isBusy: boolean;
plugin: MediaDbPlugin;
searchBtn: ButtonComponent;
- selectedApis: {name: string, selected: boolean}[];
- onSubmit: (res: {query: string, apis: string[]}, err?: Error) => void;
+ selectedApis: { name: string, selected: boolean }[];
+ onSubmit: (res: { query: string, apis: string[] }, err?: Error) => void;
- constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (res: {query: string, apis: string[]}, err?: Error) => void) {
+ constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (res: { query: string, apis: string[] }, err?: Error) => void) {
super(app);
this.plugin = plugin;
this.onSubmit = onSubmit;
diff --git a/src/modals/MediaDbIdSearchModal.ts b/src/modals/MediaDbIdSearchModal.ts
index 87fb4ce..19b3d58 100644
--- a/src/modals/MediaDbIdSearchModal.ts
+++ b/src/modals/MediaDbIdSearchModal.ts
@@ -9,9 +9,9 @@ export class MediaDbIdSearchModal extends Modal {
plugin: MediaDbPlugin;
searchBtn: ButtonComponent;
selectedApi: string;
- onSubmit: (res: {query: string, api: string}, err?: Error) => void;
+ onSubmit: (res: { query: string, api: string }, err?: Error) => void;
- constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (res: {query: string, api: string}, err?: Error) => void) {
+ constructor(app: App, plugin: MediaDbPlugin, onSubmit?: (res: { query: string, api: string }, err?: Error) => void) {
super(app);
this.plugin = plugin;
this.onSubmit = onSubmit;
diff --git a/src/models/MusicReleaseModel.ts b/src/models/MusicReleaseModel.ts
index 9aa03bf..2d134b6 100644
--- a/src/models/MusicReleaseModel.ts
+++ b/src/models/MusicReleaseModel.ts
@@ -39,8 +39,8 @@ export class MusicReleaseModel extends MediaTypeModel {
getSummary(): string {
var summary = this.title + ' (' + this.year + ')';
- if(this.artists.length > 0)
- summary += ' - ' + this.artists.join(', ')
+ if (this.artists.length > 0)
+ summary += ' - ' + this.artists.join(', ');
return summary;
}
}
diff --git a/src/tests/ParameterizedAPI.test.ts b/src/tests/ParameterizedAPI.test.ts
index bf1703e..72b2549 100644
--- a/src/tests/ParameterizedAPI.test.ts
+++ b/src/tests/ParameterizedAPI.test.ts
@@ -1,77 +1,77 @@
-import fetchMock, { enableFetchMocks } from 'jest-fetch-mock';
-import { MediaDbPluginSettings } from 'src/settings/Settings';
-import { LocGovAPI } from '../api/apis/LocGovAPI';
-import { MALAPI } from '../api/apis/MALAPI';
-import { MusicBrainzAPI } from '../api/apis/MusicBrainzAPI';
-import { OMDbAPI } from '../api/apis/OMDbAPI';
-import { SteamAPI } from '../api/apis/SteamAPI';
-import { WikipediaAPI } from '../api/apis/WikipediaAPI';
+import fetchMock, {enableFetchMocks} from 'jest-fetch-mock';
+import {MediaDbPluginSettings} from 'src/settings/Settings';
+import {LocGovAPI} from '../api/apis/LocGovAPI';
+import {MALAPI} from '../api/apis/MALAPI';
+import {MusicBrainzAPI} from '../api/apis/MusicBrainzAPI';
+import {OMDbAPI} from '../api/apis/OMDbAPI';
+import {SteamAPI} from '../api/apis/SteamAPI';
+import {WikipediaAPI} from '../api/apis/WikipediaAPI';
import MediaDbPlugin from '../main';
-import { setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock } from "./mockHelpers";
-import MALMockMovie from "./ResponseMocks/MALMockMovie.json";
-import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json";
-import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json";
-import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json";
-import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json";
+import {setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock} from './mockHelpers';
+import MALMockMovie from './ResponseMocks/MALMockMovie.json';
+import MusicBrainzResponseMock from './ResponseMocks/MusicBrainzMockResponse.json';
+import OMDBMockMovie from './ResponseMocks/OMDBMockResponse.json';
+import SteamAPIResponseMock from './ResponseMocks/SteamAPIMockResponse.json';
+import WikipediaMockResponse from './ResponseMocks/WikipediaMockResponse.json';
enableFetchMocks();
export let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI;
describe.each(
[
- { name: OMDbAPI },
- { name: MALAPI },
- { name: LocGovAPI },
- { name: MusicBrainzAPI },
- { name: SteamAPI },
- { name: WikipediaAPI }
- ]
-)('$name.name', ({ name: parameterizedApi }) => {
+ {name: OMDbAPI},
+ {name: MALAPI},
+ {name: LocGovAPI},
+ {name: MusicBrainzAPI},
+ {name: SteamAPI},
+ {name: WikipediaAPI},
+ ],
+)('$name.name', ({name: parameterizedApi}) => {
beforeAll(() => {
let settingsMock: MediaDbPluginSettings = {} as MediaDbPluginSettings;
let pluginMock = {} as MediaDbPlugin;
pluginMock.settings = settingsMock;
// TODO: add fake API key?
apiMock = new parameterizedApi(pluginMock);
- })
+ });
beforeEach(() => {
fetchMock.resetMocks();
- })
+ });
- test("searchByTitle behavior when API returns garbage data", async () => {
+ test('searchByTitle behavior when API returns garbage data', async () => {
const garbageResponse = JSON.stringify({
- data: "string"
+ data: 'string',
});
- fetchMock.mockResponseOnce(garbageResponse)
- await expect(apiMock.searchByTitle("sample")).resolves.toEqual([]);
+ fetchMock.mockResponseOnce(garbageResponse);
+ await expect(apiMock.searchByTitle('sample')).resolves.toEqual([]);
// }
expect(fetch).toHaveBeenCalledTimes(1);
});
- test("searchByTitle behavior when requestUrl/fetch returns 401", async () => {
+ test('searchByTitle behavior when requestUrl/fetch returns 401', async () => {
let sampleResponse = {
- data: "string"
+ data: 'string',
};
- fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 401 });
+ fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 401});
// TODO: Check API name and fix message
// TODO: Externalize string
- await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${401} from an API.`);
+ await expect(apiMock.searchByTitle('sample')).rejects.toThrow(`MDB | Received status code ${401} from an API.`);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
- test("searchByTitle behavior when requestUrl/fetch returns 403", async () => {
+ test('searchByTitle behavior when requestUrl/fetch returns 403', async () => {
let sampleResponse = {
- data: "string"
+ data: 'string',
};
- fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 403 });
+ fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 403});
// TODO: Check API name and fix message
// TODO: Externalize string/import?
- await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${403} from an API.`);
+ await expect(apiMock.searchByTitle('sample')).rejects.toThrow(`MDB | Received status code ${403} from an API.`);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
- test("searchByTitle behavior when requestUrl/fetch returns 200", async () => {
+ test('searchByTitle behavior when requestUrl/fetch returns 200', async () => {
let sampleResponse;
let ret;
switch (parameterizedApi) {
@@ -101,10 +101,10 @@ describe.each(
default:
throw Error();
}
- fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 200 });
+ fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 200});
// TODO: Check API name and fix message
// TODO: Externalize string
- await expect(apiMock.searchByTitle("Hooking Season Playtest")).resolves.toEqual(ret);
+ await expect(apiMock.searchByTitle('Hooking Season Playtest')).resolves.toEqual(ret);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
-})
\ No newline at end of file
+});
diff --git a/src/tests/ResponseMocks/MusicBrainzMockResponse.json b/src/tests/ResponseMocks/MusicBrainzMockResponse.json
index 02a81ec..ec89553 100644
--- a/src/tests/ResponseMocks/MusicBrainzMockResponse.json
+++ b/src/tests/ResponseMocks/MusicBrainzMockResponse.json
@@ -1,25 +1,25 @@
{
- "release-groups": [
- {
- "id": "9cf08bf9-1948-4087-abe1-783210ea1fae",
- "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc",
- "title": "Halo Halo",
- "first-release-date": "2013-07-08",
- "primary-type": "Album",
- "artist-credit": [
- {
- "name": "Halo Halo",
- "artist": {
- "name": "Halo Halo"
- }
- }
- ],
- "releases": [
- {
- "id": "58dd1d57-2201-472e-9e36-5d497dcedb6f",
- "title": "Halo Halo"
- }
- ]
- }
- ]
-}
\ No newline at end of file
+ "release-groups": [
+ {
+ "id": "9cf08bf9-1948-4087-abe1-783210ea1fae",
+ "primary-type-id": "f529b476-6e62-324f-b0aa-1f3e33d313fc",
+ "title": "Halo Halo",
+ "first-release-date": "2013-07-08",
+ "primary-type": "Album",
+ "artist-credit": [
+ {
+ "name": "Halo Halo",
+ "artist": {
+ "name": "Halo Halo"
+ }
+ }
+ ],
+ "releases": [
+ {
+ "id": "58dd1d57-2201-472e-9e36-5d497dcedb6f",
+ "title": "Halo Halo"
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/ResponseMocks/OMDBMockResponse.json b/src/tests/ResponseMocks/OMDBMockResponse.json
index 28f96fd..6f43f5b 100644
--- a/src/tests/ResponseMocks/OMDBMockResponse.json
+++ b/src/tests/ResponseMocks/OMDBMockResponse.json
@@ -7,7 +7,7 @@
"Type": "movie",
"Poster": "https://m.media-amazon.com/images/M/MV5BMTAwMjU5OTgxNjZeQTJeQWpwZ15BbWU4MDUxNDYxODEx._V1_SX300.jpg"
}
- ],
+ ],
"totalResults": "1",
"Response": "True"
-}
\ No newline at end of file
+}
diff --git a/src/tests/ResponseMocks/SteamAPIMockResponse.json b/src/tests/ResponseMocks/SteamAPIMockResponse.json
index c9796ec..af2fc9c 100644
--- a/src/tests/ResponseMocks/SteamAPIMockResponse.json
+++ b/src/tests/ResponseMocks/SteamAPIMockResponse.json
@@ -1,14 +1,14 @@
{
- "applist": {
- "apps": [
- {
- "appid": 2076590,
- "name": "Hooking Season Playtest"
- },
- {
- "appid": 2076600,
- "name": "MonsterTamer"
- }
- ]
- }
-}
\ No newline at end of file
+ "applist": {
+ "apps": [
+ {
+ "appid": 2076590,
+ "name": "Hooking Season Playtest"
+ },
+ {
+ "appid": 2076600,
+ "name": "MonsterTamer"
+ }
+ ]
+ }
+}
diff --git a/src/tests/ResponseMocks/WikipediaMockResponse.json b/src/tests/ResponseMocks/WikipediaMockResponse.json
index 64bd473..7f8e91e 100644
--- a/src/tests/ResponseMocks/WikipediaMockResponse.json
+++ b/src/tests/ResponseMocks/WikipediaMockResponse.json
@@ -1,20 +1,20 @@
{
- "query": {
- "searchinfo": {
- "totalhits": 1199001,
- "suggestion": "book",
- "suggestionsnippet": "book"
- },
- "search": [
- {
- "ns": 0,
- "title": "Book",
- "pageid": 3778,
- "size": 68829,
- "wordcount": 8821,
- "snippet": "called books or chapters or parts, are parts. The intellectual content in a physical book need not be a composition, nor even be called a book. Books can",
- "timestamp": "2022-08-19T19:13:56Z"
- }
- ]
- }
-}
\ No newline at end of file
+ "query": {
+ "searchinfo": {
+ "totalhits": 1199001,
+ "suggestion": "book",
+ "suggestionsnippet": "book"
+ },
+ "search": [
+ {
+ "ns": 0,
+ "title": "Book",
+ "pageid": 3778,
+ "size": 68829,
+ "wordcount": 8821,
+ "snippet": "called books or chapters or parts, are parts. The intellectual content in a physical book need not be a composition, nor even be called a book. Books can",
+ "timestamp": "2022-08-19T19:13:56Z"
+ }
+ ]
+ }
+}
diff --git a/src/tests/mockHelpers.ts b/src/tests/mockHelpers.ts
index df4755a..ec763e3 100644
--- a/src/tests/mockHelpers.ts
+++ b/src/tests/mockHelpers.ts
@@ -1,14 +1,14 @@
-import { GameModel } from "../models/GameModel";
-import { MovieModel } from '../models/MovieModel';
-import { MusicReleaseModel } from "../models/MusicReleaseModel";
-import { WikiModel } from '../models/WikiModel';
-import { MediaType } from "../utils/MediaType";
-import { apiMock } from "./ParameterizedAPI.test";
-import MALMockMovie from "./ResponseMocks/MALMockMovie.json";
-import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json";
-import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json";
-import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json";
-import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json";
+import {GameModel} from '../models/GameModel';
+import {MovieModel} from '../models/MovieModel';
+import {MusicReleaseModel} from '../models/MusicReleaseModel';
+import {WikiModel} from '../models/WikiModel';
+import {MediaType} from '../utils/MediaType';
+import {apiMock} from './ParameterizedAPI.test';
+import MALMockMovie from './ResponseMocks/MALMockMovie.json';
+import MusicBrainzResponseMock from './ResponseMocks/MusicBrainzMockResponse.json';
+import OMDBMockMovie from './ResponseMocks/OMDBMockResponse.json';
+import SteamAPIResponseMock from './ResponseMocks/SteamAPIMockResponse.json';
+import WikipediaMockResponse from './ResponseMocks/WikipediaMockResponse.json';
export function setWikipediaResponseMock() {
let ret = [];
@@ -55,33 +55,31 @@ export function setMALResponseMock() {
export function setSteamResponseMock() {
let ret = [];
let steamResponse = SteamAPIResponseMock.applist.apps[0];
- ret.push(
- new GameModel({
- type: MediaType.Game,
- title: steamResponse.name,
- englishTitle: steamResponse.name,
- year: '',
- dataSource: apiMock.apiName,
- id: steamResponse.appid,
- })
- )
+ ret.push(new GameModel({
+ type: MediaType.Game,
+ title: steamResponse.name,
+ englishTitle: steamResponse.name,
+ year: '',
+ dataSource: apiMock.apiName,
+ id: steamResponse.appid,
+ }));
return ret;
}
export function setMusicBrainzResponseMock() {
let ret = [];
- let result = MusicBrainzResponseMock["release-groups"][0];
- ret.push(new MusicReleaseModel({
- type: 'musicRelease',
- title: result.title,
- englishTitle: result.title,
- year: (new Date(result['first-release-date'])).getFullYear().toString(),
- dataSource: apiMock.apiName,
- url: '',
- id: result.id,
+ let result = MusicBrainzResponseMock['release-groups'][0];
+ ret.push(new MusicReleaseModel({
+ type: 'musicRelease',
+ title: result.title,
+ englishTitle: result.title,
+ year: (new Date(result['first-release-date'])).getFullYear().toString(),
+ dataSource: apiMock.apiName,
+ url: '',
+ id: result.id,
- artists: result['artist-credit'].map((a: any) => a.name),
- subType: result['primary-type'],
- } as MusicReleaseModel));
+ artists: result['artist-credit'].map((a: any) => a.name),
+ subType: result['primary-type'],
+ } as MusicReleaseModel));
return ret;
}
diff --git a/src/tests/utils.test.ts b/src/tests/utils.test.ts
index ce7a247..eb9bbd1 100644
--- a/src/tests/utils.test.ts
+++ b/src/tests/utils.test.ts
@@ -1,24 +1,29 @@
-import { wrapAround, containsOnlyLettersAndUnderscores, replaceIllegalFileNameCharactersInString} from '../utils/Utils';
+import {containsOnlyLettersAndUnderscores, replaceIllegalFileNameCharactersInString, wrapAround} from '../utils/Utils';
test('If wrapAround wraps correctly', () => {
- expect(wrapAround(100,5)).toBe(0);
- expect(wrapAround(100,7)).toBe(2);
+ expect(wrapAround(100, 5)).toBe(0);
+ expect(wrapAround(100, 7)).toBe(2);
});
test('If wrapAround errors out when dividing by zero', () => {
- expect(wrapAround(100,0)).toThrow();
+ expect(wrapAround(100, 0)).toThrow();
+});
+
+test('If wrapAround errors out when size is negative', () => {
+ expect(wrapAround(100, -5)).toThrow();
});
test('Letter and underscore string validity', () => {
- expect(containsOnlyLettersAndUnderscores("asdkfj_")).toBe(true);
- expect(containsOnlyLettersAndUnderscores("asdkfj0")).toBe(false);
+ expect(containsOnlyLettersAndUnderscores('asdkfj_')).toBe(true);
+ expect(containsOnlyLettersAndUnderscores('asdkfj0')).toBe(false);
});
-test('Letter and underscore unicode char test', () =>{
- expect(containsOnlyLettersAndUnderscores("asdkaÈj")).toBe(true);
- expect(containsOnlyLettersAndUnderscores("asdkaÈj0")).toBe(false);
+// since this is used to check if a string is a valid name for an object property, unicode characters shouldn't be allowed, thus the name of the function is misleading
+test('Letter and underscore unicode char test', () => {
+ expect(containsOnlyLettersAndUnderscores('asdkaÈj')).toBe(true);
+ expect(containsOnlyLettersAndUnderscores('asdkaÈj0')).toBe(false);
});
-test('Valid filename test', ()=>{
- expect(replaceIllegalFileNameCharactersInString("what?is\\this:")).toBe("whatisthis -");
-})
\ No newline at end of file
+test('Valid filename test', () => {
+ expect(replaceIllegalFileNameCharactersInString('what?is\\this:')).toBe('whatisthis -');
+});
diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts
index e37a28c..fda6c35 100644
--- a/src/utils/Utils.ts
+++ b/src/utils/Utils.ts
@@ -8,7 +8,10 @@ export const mediaDbVersion: string = '0.3.2';
export const debug: boolean = true;
export function wrapAround(value: number, size: number): number {
- return ((value % size) + size) % size;
+ if (size <= 0) {
+ throw Error('size may not be zero or negative');
+ }
+ return mod(value, size);
}
export function debugLog(o: any): void {