Skip to content

Commit b1ffbee

Browse files
committedMar 26, 2024
Addressed undefined error recieved by OpenTDBError #11
1 parent a12e4ca commit b1ffbee

30 files changed

+1987
-4043
lines changed
 

‎.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
/node_modules
22
/bin
3-
/dist
43
.DS_Store
54
*.tgz

‎CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
# 2.1.6
4+
- Added typescript as a developer depencency.
5+
- Added safegaurd for unknown thrown exceptions from `OpenTDBError`.
6+
- Included /dist in repo.
7+
38
# 2.1.5
49
- Fixed the issue of the dist/ folder not being included.
510

‎dist/index.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Category from "./src/Classes/Category";
2+
import Constructor from "./src/Classes/Constructor";
3+
import OpenTDBError from "./src/Classes/OpenTDBError";
4+
import Session from "./src/Classes/Session";
5+
import Util from "./src/Classes/Util";
6+
import getCategory from "./src/Functions/getCategory";
7+
import getQuestions from "./src/Functions/getQuestions";
8+
import { CategoryNames, QuestionDifficulties, QuestionEncodings, QuestionTypes, Routes } from "./src/Typings/enums";
9+
import type { CategoryData, ErrorResponse, MinifiedCategoryData, Question, QuestionOptions, RawQuestion, RawCategoryResponse, RawQuestionResponse, RawSessionStartResponse } from "./src/Typings/interfaces";
10+
import type { AllAnswers, BooleanString, CategoryNameType, CategoryResolvable, Dictionary, ErrorCode, IncorrectAnswers, QuestionDifficultyType, QuestionEncodingType, QuestionTypeType, ResponseCode, SimpleDictionary, ExtendedDictionary } from "./src/Typings/types";
11+
export { Category, Constructor, OpenTDBError, Session, Util, getCategory, getQuestions, CategoryNames, QuestionDifficulties, QuestionEncodings, QuestionTypes, Routes, CategoryData, ErrorResponse, MinifiedCategoryData, Question, QuestionOptions, RawQuestion, RawCategoryResponse, RawQuestionResponse, RawSessionStartResponse, AllAnswers, BooleanString, CategoryNameType, CategoryResolvable, Dictionary, ErrorCode, IncorrectAnswers, QuestionDifficultyType, QuestionEncodingType, QuestionTypeType, ResponseCode, SimpleDictionary, ExtendedDictionary, };

‎dist/index.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.Routes = exports.QuestionTypes = exports.QuestionEncodings = exports.QuestionDifficulties = exports.CategoryNames = exports.getQuestions = exports.getCategory = exports.Util = exports.Session = exports.OpenTDBError = exports.Constructor = exports.Category = void 0;
4+
var Category_1 = require("./src/Classes/Category");
5+
exports.Category = Category_1.default;
6+
var Constructor_1 = require("./src/Classes/Constructor");
7+
exports.Constructor = Constructor_1.default;
8+
var OpenTDBError_1 = require("./src/Classes/OpenTDBError");
9+
exports.OpenTDBError = OpenTDBError_1.default;
10+
var Session_1 = require("./src/Classes/Session");
11+
exports.Session = Session_1.default;
12+
var Util_1 = require("./src/Classes/Util");
13+
exports.Util = Util_1.default;
14+
var getCategory_1 = require("./src/Functions/getCategory");
15+
exports.getCategory = getCategory_1.default;
16+
var getQuestions_1 = require("./src/Functions/getQuestions");
17+
exports.getQuestions = getQuestions_1.default;
18+
var enums_1 = require("./src/Typings/enums");
19+
Object.defineProperty(exports, "CategoryNames", { enumerable: true, get: function () { return enums_1.CategoryNames; } });
20+
Object.defineProperty(exports, "QuestionDifficulties", { enumerable: true, get: function () { return enums_1.QuestionDifficulties; } });
21+
Object.defineProperty(exports, "QuestionEncodings", { enumerable: true, get: function () { return enums_1.QuestionEncodings; } });
22+
Object.defineProperty(exports, "QuestionTypes", { enumerable: true, get: function () { return enums_1.QuestionTypes; } });
23+
Object.defineProperty(exports, "Routes", { enumerable: true, get: function () { return enums_1.Routes; } });

‎dist/src/Classes/Category.d.ts

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { CategoryNameType } from "../Typings/types";
2+
import getCategory from "../Functions/getCategory";
3+
/**
4+
* @class Class for anything trivia category related.
5+
*/
6+
export default class Category {
7+
/**
8+
* An array of all category names. Use `Category.random()` for a random pick.
9+
*/
10+
static allNames: CategoryNameType[];
11+
/**
12+
* Decodes a URLLegacy, URL3968 or Base64 category name.
13+
* @param {string} str string to decode.
14+
* @returns {string} The decoded category name.
15+
*/
16+
static decodeEncodedCategoryName(str: string): CategoryNameType | null;
17+
/**
18+
* Fetches a trivia category's data. Duplicate of `getCategory()`.
19+
* @param {CategoryResolvable} arg An argument resolving to a trivia category.
20+
* @returns {Promise<CategoryData>} The data of the category.
21+
*/
22+
static getCategory: typeof getCategory;
23+
/**
24+
* Returns a category id when given it's name.
25+
* @param {CategoryNameType} name The name of the category.
26+
* @returns {number | null} The id if resolvable.
27+
*/
28+
static idByName(name: CategoryNameType): number | null;
29+
/**
30+
* Returns a category name when given it's id.
31+
* @param {number} id The id of the category.
32+
* @returns {CategoryNameType | null} The name if resolvable.
33+
*/
34+
static nameById(id: number): CategoryNameType | null;
35+
/**
36+
* Picks a random category name or id.
37+
* @param {'name' | 'id'} resolvableType The kind of resolvable to return (default `'name'`).
38+
* @returns {CategoryNameType | number} A random category id or name.
39+
*/
40+
static random(resolvableType: "name"): CategoryNameType;
41+
static random(resolvableType: "id"): number;
42+
}

‎dist/src/Classes/Category.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
var enums_1 = require("../Typings/enums");
4+
var getCategory_1 = require("../Functions/getCategory");
5+
var Util_1 = require("./Util");
6+
/**
7+
* @class Class for anything trivia category related.
8+
*/
9+
var Category = /** @class */ (function () {
10+
function Category() {
11+
}
12+
/**
13+
* Decodes a URLLegacy, URL3968 or Base64 category name.
14+
* @param {string} str string to decode.
15+
* @returns {string} The decoded category name.
16+
*/
17+
Category.decodeEncodedCategoryName = function (str) {
18+
return ([
19+
Util_1.default.decodeBase64(str),
20+
Util_1.default.decodeUrl3968(str),
21+
Util_1.default.decodeUrlLegacy(str),
22+
].find(function (str) { return Category.allNames.includes(str); }) || null);
23+
};
24+
/**
25+
* Returns a category id when given it's name.
26+
* @param {CategoryNameType} name The name of the category.
27+
* @returns {number | null} The id if resolvable.
28+
*/
29+
Category.idByName = function (name) {
30+
var id = Category.allNames.indexOf(name);
31+
return id > -1 ? id + 9 : null;
32+
};
33+
/**
34+
* Returns a category name when given it's id.
35+
* @param {number} id The id of the category.
36+
* @returns {CategoryNameType | null} The name if resolvable.
37+
*/
38+
Category.nameById = function (id) {
39+
var name = Category.allNames[id - 9];
40+
return name !== undefined ? name : null;
41+
};
42+
Category.random = function (resolvableType) {
43+
if (resolvableType === undefined)
44+
resolvableType = "name";
45+
var name = Category.allNames[Math.floor(Math.random() * Category.allNames.length)];
46+
if (resolvableType === "id")
47+
return Category.idByName(name);
48+
return name;
49+
};
50+
/**
51+
* An array of all category names. Use `Category.random()` for a random pick.
52+
*/
53+
Category.allNames = Object.keys(enums_1.CategoryNames).filter(function (key) { return isNaN(+key); });
54+
/**
55+
* Fetches a trivia category's data. Duplicate of `getCategory()`.
56+
* @param {CategoryResolvable} arg An argument resolving to a trivia category.
57+
* @returns {Promise<CategoryData>} The data of the category.
58+
*/
59+
Category.getCategory = getCategory_1.default;
60+
return Category;
61+
}());
62+
exports.default = Category;

‎dist/src/Classes/Constructor.d.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import type { CategoryData, Question, RawCategoryResponse, RawQuestion } from "../Typings/interfaces";
2+
/**
3+
* @class Class for transforming raw API data to developer friendly data.
4+
* @private
5+
*/
6+
export default class Constructor {
7+
/**
8+
* Parses a raw category to be more JavaScript friendly and less verbose.
9+
* @param {RawCategoryResponse} rawCategoryData The raw category.
10+
* @returns {CategoryData}
11+
*/
12+
static category(rawCategoryData: RawCategoryResponse): CategoryData;
13+
/**
14+
* Parses each object in a raw question array to be more JavaScript friendly.
15+
* @param {RawQuestion[]} rawQuestions An array of raw questions.
16+
* @returns {Question<unknown>[]}
17+
*/
18+
static questions(rawQuestions: RawQuestion[]): Question<unknown>[];
19+
}

‎dist/src/Classes/Constructor.js

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"use strict";
2+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4+
if (ar || !(i in from)) {
5+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6+
ar[i] = from[i];
7+
}
8+
}
9+
return to.concat(ar || Array.prototype.slice.call(from));
10+
};
11+
Object.defineProperty(exports, "__esModule", { value: true });
12+
var Category_1 = require("./Category");
13+
var Util_1 = require("./Util");
14+
/**
15+
* @class Class for transforming raw API data to developer friendly data.
16+
* @private
17+
*/
18+
var Constructor = /** @class */ (function () {
19+
function Constructor() {
20+
}
21+
/**
22+
* Parses a raw category to be more JavaScript friendly and less verbose.
23+
* @param {RawCategoryResponse} rawCategoryData The raw category.
24+
* @returns {CategoryData}
25+
*/
26+
Constructor.category = function (rawCategoryData) {
27+
return {
28+
id: rawCategoryData.category_id,
29+
name: Category_1.default.nameById(rawCategoryData.category_id),
30+
questionCount: {
31+
total: rawCategoryData.category_question_count.total_question_count,
32+
easy: rawCategoryData.category_question_count.total_easy_question_count,
33+
medium: rawCategoryData.category_question_count.total_medium_question_count,
34+
hard: rawCategoryData.category_question_count.total_hard_question_count,
35+
},
36+
};
37+
};
38+
/**
39+
* Parses each object in a raw question array to be more JavaScript friendly.
40+
* @param {RawQuestion[]} rawQuestions An array of raw questions.
41+
* @returns {Question<unknown>[]}
42+
*/
43+
Constructor.questions = function (rawQuestions) {
44+
return rawQuestions.map(function (question) {
45+
return {
46+
value: question.question,
47+
category: {
48+
id: Category_1.default.idByName(Category_1.default.decodeEncodedCategoryName(question.category)),
49+
name: question.category,
50+
getData: function () {
51+
return Category_1.default.getCategory(this.id);
52+
},
53+
},
54+
type: question.type,
55+
difficulty: question.difficulty,
56+
correctAnswer: question.type === "multiple"
57+
? question.correct_answer
58+
: question.correct_answer.toLowerCase(),
59+
incorrectAnswers: question.type === "multiple"
60+
? question.incorrect_answers
61+
: question.incorrect_answers[0].toLowerCase(),
62+
allAnswers: Util_1.default.shuffleArray(__spreadArray([
63+
question.correct_answer
64+
], (question.type === "multiple"
65+
? question.incorrect_answers
66+
: question.incorrect_answers.map(function (s) { return s.toLowerCase(); })), true)),
67+
checkAnswer: function (str, caseSensitive) {
68+
if (caseSensitive === void 0) { caseSensitive = false; }
69+
if (!caseSensitive) {
70+
return str.toLowerCase() === this.correctAnswer.toLowerCase();
71+
}
72+
return str === this.correctAnswer;
73+
},
74+
};
75+
});
76+
};
77+
return Constructor;
78+
}());
79+
exports.default = Constructor;

‎dist/src/Classes/OpenTDBError.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { ErrorResponse } from "../Typings/interfaces";
2+
/**
3+
* @class OpenTDB error constructor
4+
* @private
5+
*/
6+
export default class OpenTDBError extends TypeError {
7+
/**
8+
* @param {ErrorResponse} error A basic header-text error object.
9+
*/
10+
constructor(error: ErrorResponse);
11+
}

‎dist/src/Classes/OpenTDBError.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"use strict";
2+
var __extends = (this && this.__extends) || (function () {
3+
var extendStatics = function (d, b) {
4+
extendStatics = Object.setPrototypeOf ||
5+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7+
return extendStatics(d, b);
8+
};
9+
return function (d, b) {
10+
if (typeof b !== "function" && b !== null)
11+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12+
extendStatics(d, b);
13+
function __() { this.constructor = d; }
14+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15+
};
16+
})();
17+
Object.defineProperty(exports, "__esModule", { value: true });
18+
/**
19+
* @class OpenTDB error constructor
20+
* @private
21+
*/
22+
var OpenTDBError = /** @class */ (function (_super) {
23+
__extends(OpenTDBError, _super);
24+
/**
25+
* @param {ErrorResponse} error A basic header-text error object.
26+
*/
27+
function OpenTDBError(error) {
28+
var _this = _super.call(this, error.text) || this;
29+
_this.name = "OpenTDBError [".concat(error.header, "]");
30+
return _this;
31+
}
32+
return OpenTDBError;
33+
}(TypeError));
34+
exports.default = OpenTDBError;

‎dist/src/Classes/Session.d.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* @class Class for working with trivia API sessions.
3+
*/
4+
export default class Session {
5+
/**
6+
* This session's current token
7+
*/
8+
token: string | null;
9+
/**
10+
* @param {string} token An existing session's token.
11+
*/
12+
constructor(token?: string);
13+
/**
14+
* Checks if the session has been initialized or holds a token. Emits a warning if not.
15+
*/
16+
assert(): void;
17+
/**
18+
* Generates a session token and assigns it to the instance (`Session.token`).
19+
*/
20+
start(): Promise<string>;
21+
/**
22+
* Resets the current session's data.
23+
*/
24+
reset(): Promise<void>;
25+
}

0 commit comments

Comments
 (0)
Please sign in to comment.