Lint scripts
parent
e6f6d5b1b7
commit
2070352ca0
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable no-console */
|
||||
/*
|
||||
to use this example, create an .env file
|
||||
in the project root with the following values:
|
||||
|
|
|
@ -45,8 +45,8 @@ export { default as ThreadSearchQuery } from "./scripts/classes/query/thread-sea
|
|||
/**
|
||||
* Set the logger level for module debugging.
|
||||
*/
|
||||
/* istambul ignore next */
|
||||
export var loggerLevel = shared.logger.level;
|
||||
// eslint-disable-next-line prefer-const
|
||||
export let loggerLevel = shared.logger.level;
|
||||
shared.logger.level = "warn"; // By default log only the warn messages
|
||||
|
||||
/**
|
||||
|
|
|
@ -38,91 +38,91 @@ export default class PlatformUser {
|
|||
/**
|
||||
* Unique user ID.
|
||||
*/
|
||||
public get id() {
|
||||
public get id(): number {
|
||||
return this._id;
|
||||
}
|
||||
/**
|
||||
* Username.
|
||||
*/
|
||||
public get name() {
|
||||
public get name(): string {
|
||||
return this._name;
|
||||
}
|
||||
/**
|
||||
* Title assigned to the user by the platform.
|
||||
*/
|
||||
public get title() {
|
||||
public get title(): string {
|
||||
return this._title;
|
||||
}
|
||||
/**
|
||||
* List of banners assigned by the platform.
|
||||
*/
|
||||
public get banners() {
|
||||
public get banners(): string[] {
|
||||
return this._banners;
|
||||
}
|
||||
/**
|
||||
* Number of messages written by the user.
|
||||
*/
|
||||
public get messages() {
|
||||
public get messages(): number {
|
||||
return this._messages;
|
||||
}
|
||||
/**
|
||||
* @todo Reaction score.
|
||||
*/
|
||||
public get reactionScore() {
|
||||
public get reactionScore(): number {
|
||||
return this._reactionScore;
|
||||
}
|
||||
/**
|
||||
* @todo Points.
|
||||
*/
|
||||
public get points() {
|
||||
public get points(): number {
|
||||
return this._points;
|
||||
}
|
||||
/**
|
||||
* Number of ratings received.
|
||||
*/
|
||||
public get ratingsReceived() {
|
||||
public get ratingsReceived(): number {
|
||||
return this._ratingsReceived;
|
||||
}
|
||||
/**
|
||||
* Date of joining the platform.
|
||||
*/
|
||||
public get joined() {
|
||||
public get joined(): Date {
|
||||
return this._joined;
|
||||
}
|
||||
/**
|
||||
* Date of the last connection to the platform.
|
||||
*/
|
||||
public get lastSeen() {
|
||||
public get lastSeen(): Date {
|
||||
return this._lastSeen;
|
||||
}
|
||||
/**
|
||||
* Indicates whether the user is followed by the currently logged in user.
|
||||
*/
|
||||
public get followed() {
|
||||
public get followed(): boolean {
|
||||
return this._followed;
|
||||
}
|
||||
/**
|
||||
* Indicates whether the user is ignored by the currently logged on user.
|
||||
*/
|
||||
public get ignored() {
|
||||
public get ignored(): boolean {
|
||||
return this._ignored;
|
||||
}
|
||||
/**
|
||||
* Indicates that the profile is private and not viewable by the user.
|
||||
*/
|
||||
public get private() {
|
||||
public get private(): boolean {
|
||||
return this._private;
|
||||
}
|
||||
/**
|
||||
* URL of the image used as the user's avatar.
|
||||
*/
|
||||
public get avatar() {
|
||||
public get avatar(): string {
|
||||
return this._avatar;
|
||||
}
|
||||
/**
|
||||
* Value of donations made.
|
||||
*/
|
||||
public get donation() {
|
||||
public get donation(): number {
|
||||
return this._amountDonated;
|
||||
}
|
||||
|
||||
|
@ -134,11 +134,11 @@ export default class PlatformUser {
|
|||
|
||||
//#region Public methods
|
||||
|
||||
public setID(id: number) {
|
||||
public setID(id: number): void {
|
||||
this._id = id;
|
||||
}
|
||||
|
||||
public async fetch() {
|
||||
public async fetch(): Promise<void> {
|
||||
// Check ID
|
||||
if (!this.id && this.id < 1) throw new Error("Invalid user ID");
|
||||
|
||||
|
|
|
@ -35,49 +35,49 @@ export default class Post {
|
|||
/**
|
||||
* Represents a post published by a user on the F95Zone platform.
|
||||
*/
|
||||
public get id() {
|
||||
public get id(): number {
|
||||
return this._id;
|
||||
}
|
||||
/**
|
||||
* Unique ID of the post within the thread in which it is present.
|
||||
*/
|
||||
public get number() {
|
||||
public get number(): number {
|
||||
return this._number;
|
||||
}
|
||||
/**
|
||||
* Date the post was first published.
|
||||
*/
|
||||
public get published() {
|
||||
public get published(): Date {
|
||||
return this._published;
|
||||
}
|
||||
/**
|
||||
* Date the post was last modified.
|
||||
*/
|
||||
public get lastEdit() {
|
||||
public get lastEdit(): Date {
|
||||
return this._lastEdit;
|
||||
}
|
||||
/**
|
||||
* User who owns the post.
|
||||
*/
|
||||
public get owner() {
|
||||
public get owner(): PlatformUser {
|
||||
return this._owner;
|
||||
}
|
||||
/**
|
||||
* Indicates whether the post has been bookmarked.
|
||||
*/
|
||||
public get bookmarked() {
|
||||
public get bookmarked(): boolean {
|
||||
return this._bookmarked;
|
||||
}
|
||||
/**
|
||||
* Post message text.
|
||||
*/
|
||||
public get message() {
|
||||
public get message(): string {
|
||||
return this._message;
|
||||
}
|
||||
/**
|
||||
* Set of the elements that make up the body of the post.
|
||||
*/
|
||||
public get body() {
|
||||
public get body(): IPostElement[] {
|
||||
return this._body;
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,7 @@ export default class Post {
|
|||
/**
|
||||
* Gets the post data starting from its unique ID for the entire platform.
|
||||
*/
|
||||
public async fetch() {
|
||||
public async fetch(): Promise<void> {
|
||||
// Fetch HTML page containing the post
|
||||
const url = new URL(this.id.toString(), urls.F95_POSTS).toString();
|
||||
const htmlResponse = await fetchHTML(url);
|
||||
|
|
|
@ -45,7 +45,7 @@ export default class Thread {
|
|||
/**
|
||||
* Unique ID of the thread on the platform.
|
||||
*/
|
||||
public get id() {
|
||||
public get id(): number {
|
||||
return this._id;
|
||||
}
|
||||
/**
|
||||
|
@ -53,55 +53,55 @@ export default class Thread {
|
|||
*
|
||||
* It may vary depending on any versions of the contained product.
|
||||
*/
|
||||
public get url() {
|
||||
public get url(): string {
|
||||
return this._url;
|
||||
}
|
||||
/**
|
||||
* Thread title.
|
||||
*/
|
||||
public get title() {
|
||||
public get title(): string {
|
||||
return this._title;
|
||||
}
|
||||
/**
|
||||
* Tags associated with the thread.
|
||||
*/
|
||||
public get tags() {
|
||||
public get tags(): string[] {
|
||||
return this._tags;
|
||||
}
|
||||
/**
|
||||
* Prefixes associated with the thread
|
||||
*/
|
||||
public get prefixes() {
|
||||
public get prefixes(): string[] {
|
||||
return this._prefixes;
|
||||
}
|
||||
/**
|
||||
* Rating assigned to the thread.
|
||||
*/
|
||||
public get rating() {
|
||||
public get rating(): TRating {
|
||||
return this._rating;
|
||||
}
|
||||
/**
|
||||
* Owner of the thread.
|
||||
*/
|
||||
public get owner() {
|
||||
public get owner(): PlatformUser {
|
||||
return this._owner;
|
||||
}
|
||||
/**
|
||||
* Date the thread was first published.
|
||||
*/
|
||||
public get publication() {
|
||||
public get publication(): Date {
|
||||
return this._publication;
|
||||
}
|
||||
/**
|
||||
* Date the thread was last modified.
|
||||
*/
|
||||
public get modified() {
|
||||
public get modified(): Date {
|
||||
return this._modified;
|
||||
}
|
||||
/**
|
||||
* Category to which the content of the thread belongs.
|
||||
*/
|
||||
public get category() {
|
||||
public get category(): TCategory {
|
||||
return this._category;
|
||||
}
|
||||
|
||||
|
@ -233,7 +233,7 @@ export default class Thread {
|
|||
/**
|
||||
* Gets information about this thread.
|
||||
*/
|
||||
public async fetch() {
|
||||
public async fetch(): Promise<void> {
|
||||
// Prepare the url
|
||||
this._url = new URL(this.id.toString(), urls.F95_THREADS).toString();
|
||||
|
||||
|
|
|
@ -52,28 +52,28 @@ export default class UserProfile extends PlatformUser {
|
|||
/**
|
||||
* List of followed thread data.
|
||||
*/
|
||||
public get watched() {
|
||||
public get watched(): IWatchedThread[] {
|
||||
return this._watched;
|
||||
}
|
||||
/**
|
||||
* List of bookmarked posts.
|
||||
* @todo
|
||||
*/
|
||||
public get bookmarks() {
|
||||
public get bookmarks(): Post[] {
|
||||
return this._bookmarks;
|
||||
}
|
||||
/**
|
||||
* List of alerts.
|
||||
* @todo
|
||||
*/
|
||||
public get alerts() {
|
||||
public get alerts(): string[] {
|
||||
return this._alerts;
|
||||
}
|
||||
/**
|
||||
* List of conversations.
|
||||
* @todo
|
||||
*/
|
||||
public get conversation() {
|
||||
public get conversation(): string[] {
|
||||
return this._conversations;
|
||||
}
|
||||
|
||||
|
@ -85,7 +85,7 @@ export default class UserProfile extends PlatformUser {
|
|||
|
||||
//#region Public methods
|
||||
|
||||
public async fetch() {
|
||||
public async fetch(): Promise<void> {
|
||||
// First get the user ID and set it
|
||||
const id = await this.fetchUserID();
|
||||
super.setID(id);
|
||||
|
|
|
@ -6,7 +6,7 @@ import validator from "class-validator";
|
|||
|
||||
// Module from files
|
||||
import { IQuery, TCategory, TQueryInterface } from "../../interfaces.js";
|
||||
import { GenericAxiosError, UnexpectedResponseContentType } from "../errors.js";
|
||||
import { GenericAxiosError } from "../errors.js";
|
||||
import { Result } from "../result.js";
|
||||
import LatestSearchQuery, { TLatestOrder } from "./latest-search-query.js";
|
||||
import ThreadSearchQuery, { TThreadOrder } from "./thread-search-query.js";
|
||||
|
|
|
@ -8,6 +8,9 @@ import { urls } from "../../constants/url.js";
|
|||
import PrefixParser from "../prefix-parser.js";
|
||||
import { IQuery, TCategory, TQueryInterface } from "../../interfaces.js";
|
||||
import { fetchGETResponse } from "../../network-helper.js";
|
||||
import { AxiosResponse } from "axios";
|
||||
import { GenericAxiosError } from "../errors.js";
|
||||
import { Result } from "../result.js";
|
||||
|
||||
// Type definitions
|
||||
export type TLatestOrder = "date" | "likes" | "views" | "title" | "rating";
|
||||
|
@ -64,7 +67,9 @@ export default class LatestSearchQuery implements IQuery {
|
|||
return validator.validateSync(this).length === 0;
|
||||
}
|
||||
|
||||
public async execute() {
|
||||
public async execute(): Promise<
|
||||
Result<GenericAxiosError, AxiosResponse<any>>
|
||||
> {
|
||||
// Check if the query is valid
|
||||
if (!this.validate()) {
|
||||
throw new Error(
|
||||
|
|
|
@ -37,37 +37,37 @@ export default class Session {
|
|||
/**
|
||||
* Path of the session map file on disk.
|
||||
*/
|
||||
public get path() {
|
||||
public get path(): string {
|
||||
return this._path;
|
||||
}
|
||||
/**
|
||||
* Indicates if the session is mapped on disk.
|
||||
*/
|
||||
public get isMapped() {
|
||||
public get isMapped(): boolean {
|
||||
return this._isMapped;
|
||||
}
|
||||
/**
|
||||
* Date of creation of the session.
|
||||
*/
|
||||
public get created() {
|
||||
public get created(): Date {
|
||||
return this._created;
|
||||
}
|
||||
/**
|
||||
* MD5 hash of the username and the password.
|
||||
*/
|
||||
public get hash() {
|
||||
public get hash(): string {
|
||||
return this._hash;
|
||||
}
|
||||
/**
|
||||
* Token used to login to F95Zone.
|
||||
*/
|
||||
public get token() {
|
||||
public get token(): string {
|
||||
return this._token;
|
||||
}
|
||||
/**
|
||||
* Cookie holder.
|
||||
*/
|
||||
public get cookieJar() {
|
||||
public get cookieJar(): tough.CookieJar {
|
||||
return this._cookieJar;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ export async function fetchHTML(
|
|||
*/
|
||||
export async function authenticate(
|
||||
credentials: credentials,
|
||||
force = false
|
||||
force: boolean = false
|
||||
): Promise<LoginResult> {
|
||||
shared.logger.info(`Authenticating with user ${credentials.username}`);
|
||||
if (!credentials.token)
|
||||
|
@ -140,7 +140,7 @@ export async function authenticate(
|
|||
/**
|
||||
* Obtain the token used to authenticate the user to the platform.
|
||||
*/
|
||||
export async function getF95Token() {
|
||||
export async function getF95Token(): Promise<string> {
|
||||
// Fetch the response of the platform
|
||||
const response = await fetchGETResponse(f95url.F95_LOGIN_URL);
|
||||
|
||||
|
@ -167,7 +167,6 @@ export async function fetchGETResponse(
|
|||
const response = await axios.get(secureURL, commonConfig);
|
||||
return success(response);
|
||||
} catch (e) {
|
||||
console.log(e.response);
|
||||
shared.logger.error(
|
||||
`(GET) Error ${e.message} occurred while trying to fetch ${secureURL}`
|
||||
);
|
||||
|
@ -217,7 +216,7 @@ export function isStringAValidURL(url: string): boolean {
|
|||
*/
|
||||
export async function urlExists(
|
||||
url: string,
|
||||
checkRedirect = false
|
||||
checkRedirect: boolean = false
|
||||
): Promise<boolean> {
|
||||
// Local variables
|
||||
let valid = false;
|
||||
|
|
|
@ -90,13 +90,7 @@ function parseCheerioSpoilerNode(
|
|||
if (element.attr("class") === "bbCodeSpoiler") {
|
||||
const spoiler = parseCheerioSpoilerNode($, element);
|
||||
content.content.push(spoiler);
|
||||
}
|
||||
//@ts-ignore
|
||||
// else if (el.name === "br") {
|
||||
// // Add new line
|
||||
// content.text += "\n";
|
||||
// }
|
||||
else if (el.type === "text") {
|
||||
} else if (el.type === "text") {
|
||||
// Append text
|
||||
content.text += element.text();
|
||||
}
|
||||
|
@ -266,7 +260,7 @@ function parseCheerioNode(
|
|||
function parsePostElements(elements: IPostElement[]): IPostElement[] {
|
||||
// Local variables
|
||||
const pairs: IPostElement[] = [];
|
||||
const specialCharsRegex = /^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/;
|
||||
const specialCharsRegex = /^[-!$%^&*()_+|~=`{}[\]:";'<>?,./]/;
|
||||
const specialRegex = new RegExp(specialCharsRegex);
|
||||
|
||||
for (let i = 0; i < elements.length; i++) {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable @typescript-eslint/no-inferrable-types */
|
||||
"use strict";
|
||||
|
||||
// Modules from file
|
||||
|
@ -13,15 +14,13 @@ import getURLsFromQuery from "./fetch-data/fetch-query.js";
|
|||
*/
|
||||
export default async function search<T extends IBasic>(
|
||||
query: IQuery,
|
||||
limit = 30
|
||||
limit: number = 30
|
||||
): Promise<T[]> {
|
||||
// Fetch the URLs
|
||||
const urls: string[] = await getURLsFromQuery(query, limit);
|
||||
|
||||
// Fetch the data
|
||||
const results = urls.map((url, idx) => {
|
||||
return getHandiworkInformation<T>(url);
|
||||
});
|
||||
const results = urls.map((url) => getHandiworkInformation<T>(url));
|
||||
|
||||
return Promise.all(results);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import Session from "./classes/session.js";
|
|||
// Types declaration
|
||||
export type TPrefixDict = { [n: number]: string };
|
||||
type TPrefixKey = "engines" | "statuses" | "tags" | "others";
|
||||
type TPrefixes = { [key in TPrefixKey]: TPrefixDict };
|
||||
|
||||
/**
|
||||
* Class containing variables shared between modules.
|
||||
|
@ -22,9 +23,7 @@ export default abstract class Shared {
|
|||
//#region Fields
|
||||
|
||||
private static _isLogged = false;
|
||||
private static _prefixes: { [key in TPrefixKey]: TPrefixDict } = {} as {
|
||||
[key in TPrefixKey]: TPrefixDict;
|
||||
};
|
||||
private static _prefixes: TPrefixes = {} as TPrefixes;
|
||||
private static _logger: log4js.Logger = log4js.getLogger();
|
||||
private static _session = new Session(join(tmpdir(), "f95session.json"));
|
||||
|
||||
|
|
Loading…
Reference in New Issue