Update to API V2, restoring to ESM and modularizing functions
parent
d7755d7f32
commit
a44c1bc964
@ -1,6 +0,0 @@
|
||||
{
|
||||
"watch": ["src"],
|
||||
"ext": "ts",
|
||||
"ignore": ["src/**/.spect.ts"],
|
||||
"exec": "ts-node src/index.ts"
|
||||
}
|
@ -1,33 +1,26 @@
|
||||
{
|
||||
"name": "monoschinos-api-ts",
|
||||
"version": "1.2.0",
|
||||
"version": "2.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node dist/index.js",
|
||||
"build": "tsc ",
|
||||
"dev": "nodemon"
|
||||
"start": "node src/index.js",
|
||||
"dev": "nodemon src/index.js"
|
||||
},
|
||||
"type": "module",
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@types/axios": "^0.14.0",
|
||||
"@types/cheerio": "^0.22.28",
|
||||
"@types/cors": "^2.8.10",
|
||||
"@types/dotenv": "^8.2.0",
|
||||
"@types/express": "^4.17.11",
|
||||
"@types/morgan": "^1.9.2",
|
||||
"nodemon": "^2.0.7",
|
||||
"ts-node": "^9.1.1",
|
||||
"typescript": "^4.2.3"
|
||||
"nodemon": "^2.0.14"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^0.21.1",
|
||||
"axios": "^0.24.0",
|
||||
"cheerio": "^1.0.0-rc.5",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^8.2.0",
|
||||
"express": "^4.17.1",
|
||||
"morgan": "^1.10.0"
|
||||
"morgan": "^1.10.0",
|
||||
"node-html-parser": "^5.1.0"
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,8 @@
|
||||
import express from 'express';
|
||||
import cors from 'cors';
|
||||
import morgan from 'morgan';
|
||||
import routes from './routes/api.routes';
|
||||
import routes from './routes/api.routes.js';
|
||||
const app = express();
|
||||
app.use(cors(), morgan('dev'));
|
||||
// app.use('/', express.static('docs'));
|
||||
app.use('/', routes);
|
||||
export default app;
|
@ -0,0 +1,67 @@
|
||||
import cheerio from 'cheerio';
|
||||
import axios from 'axios';
|
||||
import { urls } from '../config.js';
|
||||
|
||||
export async function getBy(req, res, multiple) {
|
||||
try {
|
||||
let { gender, letter, category } = req.params;
|
||||
|
||||
let { page } = req.query;
|
||||
|
||||
if (!page) {
|
||||
page = '1';
|
||||
}
|
||||
|
||||
let bodyResponse;
|
||||
|
||||
if (multiple) {
|
||||
bodyResponse = await axios.get(
|
||||
`${urls.main}/categoria/${category}/genero/${gender}?page=${page}`
|
||||
);
|
||||
} else if (gender && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
|
||||
} else if (letter && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/letra/${letter}?page=${page}`);
|
||||
} else if (category && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/categoria/${category}?page=${page}`);
|
||||
}
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
|
||||
const animes = [];
|
||||
|
||||
$('.animes .container .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
let id = el.find('.link-anime').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let img = el.find('.link-anime .Image img').attr('src');
|
||||
let title = el.find('.link-anime .Title').text();
|
||||
let type = el.find('.link-anime .info .category').text();
|
||||
let year = el.find('.link-anime .info .fecha').text();
|
||||
|
||||
let anime = {
|
||||
id,
|
||||
img,
|
||||
title,
|
||||
type,
|
||||
year,
|
||||
};
|
||||
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
let totalPages = $('.pagination').children().length;
|
||||
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
|
||||
let pages = parseInt($(totalPages).text());
|
||||
|
||||
res.status(200).json({
|
||||
animes,
|
||||
pages,
|
||||
success: true,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
@ -1,553 +0,0 @@
|
||||
import cheerio from 'cheerio';
|
||||
import axios from 'axios';
|
||||
import { urls } from '../config';
|
||||
import { SuggestionI, GenderI, AnimeSearchI, EpI } from '../models/interfaces';
|
||||
import { Request, Response } from 'express';
|
||||
|
||||
export async function getAnime(req: Request, res: Response) {
|
||||
let noImage: string = 'https://monoschinos2.com/assets/img/no_image.png';
|
||||
let defaulImage: string =
|
||||
'https://image.freepik.com/free-vector/404-error-page-found_41910-364.jpg';
|
||||
try {
|
||||
let { id } = req.params;
|
||||
const response = await axios.get(`${urls.anime}/${id}`);
|
||||
const $ = cheerio.load(response.data);
|
||||
let i = $('.TPost.Serie.Single');
|
||||
let banner: string = i.find('.Banner img').attr('src');
|
||||
if (banner == noImage) {
|
||||
banner = defaulImage;
|
||||
} else {
|
||||
banner = banner;
|
||||
}
|
||||
let title = i
|
||||
.find('h1.Title')
|
||||
.text()
|
||||
.replace(/Sub Español/gi, '')
|
||||
.trim();
|
||||
let sinopsis = i.find('.row .col-sm-9 .Description p').text();
|
||||
let status = i.find('.row .col-sm-9 .Type').text().trim();
|
||||
let date = i
|
||||
.find('.row .col-sm-9 .after-title:nth-child(n)')
|
||||
.text()
|
||||
.match(/\d{4}-\d{2}-\d{2}/)[0];
|
||||
let type = i
|
||||
.find('.row .col-sm-9 .after-title:nth-child(n)')
|
||||
.text()
|
||||
.match(/\|\s\w+/gi)[0]
|
||||
.replace(/\|?\s?/, '');
|
||||
let cover = i.find('.Image img').attr('src');
|
||||
let genders: GenderI[] = [];
|
||||
i.find('.generos a').each((i, e) => {
|
||||
let el = $(e);
|
||||
let title = el.text();
|
||||
let id = el.attr('href').split('/')[4];
|
||||
genders.push({ title, id });
|
||||
});
|
||||
let episodes: EpI[] = [];
|
||||
i.find('.container .SerieCaps .item').each((i, e) => {
|
||||
let el = $(e);
|
||||
let episodeId = el.attr('href');
|
||||
episodeId = episodeId.split('/')[4];
|
||||
episodes.push({
|
||||
number: parseInt(episodeId.split('-').pop()),
|
||||
id: episodeId,
|
||||
});
|
||||
});
|
||||
if (!episodes || episodes.length == 0) {
|
||||
episodes = [];
|
||||
}
|
||||
let sugestions: SuggestionI[] = [];
|
||||
i.find('.container .row .col-12 .recom article').each((i, e) => {
|
||||
let el = $(e);
|
||||
let id = el.find('a').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let title = el
|
||||
.find('a .Title')
|
||||
.text()
|
||||
.replace(/ Sub Español/gi, '');
|
||||
let cover = el.find('a .Image img').attr('src');
|
||||
let year = parseInt(el.find('.fecha').text());
|
||||
sugestions.push({
|
||||
id,
|
||||
title,
|
||||
cover,
|
||||
year,
|
||||
});
|
||||
});
|
||||
res.json({
|
||||
title,
|
||||
banner,
|
||||
cover,
|
||||
sinopsis,
|
||||
status,
|
||||
date,
|
||||
type,
|
||||
genders,
|
||||
episodes,
|
||||
sugestions,
|
||||
});
|
||||
} catch (err) {
|
||||
res.json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getAnimes(req: Request, res: Response) {
|
||||
try {
|
||||
let { page } = req.params;
|
||||
!page ? (page = '1') : (page = page);
|
||||
const bodyResponse = await axios.get(`${urls.main}/animes?page=${page}`);
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
const animes = [];
|
||||
$('.animes .container .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let id = el.find('a').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let title = el.find('.Title').text();
|
||||
let img = el.find('.Image img').attr('src');
|
||||
let category = el.find('.category').text();
|
||||
category = category.substring(1, category.length);
|
||||
let year = parseInt(el.find('.fecha').text());
|
||||
|
||||
const anime = {
|
||||
id,
|
||||
title,
|
||||
img,
|
||||
category,
|
||||
year,
|
||||
};
|
||||
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
let totalPages: any = $('.pagination').children().length;
|
||||
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
|
||||
let pages = parseInt($(totalPages).text());
|
||||
let current = parseInt(page);
|
||||
res.status(200).json({
|
||||
current,
|
||||
pages,
|
||||
animes,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function searchAnime(req: Request, res: Response) {
|
||||
try {
|
||||
let { id } = req.params;
|
||||
const response = await axios.get(`${urls.search}${id}`);
|
||||
const $ = cheerio.load(response.data);
|
||||
let animes = [];
|
||||
$('.animes .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
let title = el.find('h3.Title').text();
|
||||
let cover = el.find('div.Image .cover .img-fluid').attr('src');
|
||||
let id1 = el.find('a.link-anime').attr('href');
|
||||
let id = id1.split('/')[4];
|
||||
let category = el.find('.category').text();
|
||||
category = category.substring(1, category.length);
|
||||
let year = parseInt(el.find('.fecha').text());
|
||||
|
||||
let anime: AnimeSearchI = {
|
||||
id,
|
||||
title,
|
||||
cover,
|
||||
category,
|
||||
year,
|
||||
};
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
res.json(animes);
|
||||
} catch (err) {
|
||||
res.json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getEpisode(req: Request, res: Response) {
|
||||
try {
|
||||
let { id } = req.params;
|
||||
const response = await axios.get(`${urls.episode}/${id}`);
|
||||
const $ = cheerio.load(response.data);
|
||||
let epnum = $('.Episode .Title-epi').text();
|
||||
let title = $('.Episode .Title-epi').text().replace('Sub Español', '').trim();
|
||||
let number: any = epnum.split(' ');
|
||||
number = parseInt(number[number.length - 3]);
|
||||
let ctrls = {
|
||||
prev: false,
|
||||
next: false,
|
||||
};
|
||||
$('.d-flex.justify-content-center.mb-4').map((i, e) => {
|
||||
let el = $(e);
|
||||
if (el.text().includes('Anterior')) {
|
||||
ctrls.prev = true;
|
||||
}
|
||||
if (el.text().includes('Siguiente')) {
|
||||
ctrls.next = true;
|
||||
}
|
||||
});
|
||||
let animeId = $('a.btnWeb.green.Current')
|
||||
.attr('href')
|
||||
.replace('https://monoschinos2.com/anime/', '');
|
||||
let videos = [];
|
||||
let videosContainer = $('.Episode .content .row .TPlayer').text();
|
||||
$(videosContainer).each((i, e) => {
|
||||
let el = $(e);
|
||||
let url = el.attr('src');
|
||||
if (url) {
|
||||
url = url.split('url=')[1];
|
||||
url = decodeURIComponent(url);
|
||||
url = url.split('&id')[0];
|
||||
let videolinks = new URL(url);
|
||||
let { host } = videolinks;
|
||||
let name = host.replace(/\.com|www\.|\.ru|repro\.|\.co|\.nz/, '');
|
||||
name = `${name.slice(0, 1).toUpperCase()}${name.slice(1)}`;
|
||||
let servers = {
|
||||
url,
|
||||
name,
|
||||
};
|
||||
videos.push(servers);
|
||||
}
|
||||
});
|
||||
let downloads = [];
|
||||
let downloadsContainer = $('#downloads table tbody tr');
|
||||
|
||||
$(downloadsContainer).each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let link = el.find('a').attr('href');
|
||||
let sn = link.replace(/\.com|www\.|\.ru|repro\.|\.co|\.nz/, '');
|
||||
let servername = sn.slice(8);
|
||||
let svn = servername.indexOf('/');
|
||||
let server = servername.slice(0, svn);
|
||||
server = `${server.slice(0, 1).toUpperCase()}${server.slice(1)}`;
|
||||
let down = {
|
||||
server,
|
||||
link,
|
||||
};
|
||||
if (down) {
|
||||
downloads.push(down);
|
||||
}
|
||||
});
|
||||
|
||||
res.json({
|
||||
title,
|
||||
animeId,
|
||||
ctrls,
|
||||
number,
|
||||
videos,
|
||||
downloads,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getCategories(req: Request, res: Response) {
|
||||
try {
|
||||
const response = await axios.get(`${urls.main}/animes`);
|
||||
const $ = cheerio.load(response.data);
|
||||
let categories = [];
|
||||
let categoriesContainer = $('.filter-container .clearfix .float-left')[0];
|
||||
$(categoriesContainer)
|
||||
.find('.dropdown-menu .dropdown-item')
|
||||
.each((i, e) => {
|
||||
let el = $(e);
|
||||
let title = el.text();
|
||||
let id = el.attr('href');
|
||||
id = id.split('/')[2];
|
||||
let category = {
|
||||
title,
|
||||
id,
|
||||
};
|
||||
categories.push(category);
|
||||
});
|
||||
|
||||
res.status(200).json(categories);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getGenders(req: Request, res: Response) {
|
||||
try {
|
||||
const response = await axios.get(`${urls.main}/animes`);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
let genders = [];
|
||||
|
||||
let gendersContainer = $('.filter-container .clearfix .float-left')[1];
|
||||
|
||||
$(gendersContainer)
|
||||
.find('.dropdown-menu .dropdown-item')
|
||||
.each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let title = el.text();
|
||||
if (title.charAt(0) == ' ') {
|
||||
title = title.substring(1, title.length);
|
||||
}
|
||||
let id = el.attr('href');
|
||||
id = id.split('/')[2];
|
||||
let gender: GenderI = {
|
||||
title,
|
||||
id,
|
||||
};
|
||||
genders.push(gender);
|
||||
});
|
||||
res.json(genders);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getGender(req: any, res: any) {
|
||||
try {
|
||||
let { gender } = req.params;
|
||||
let { page } = req.params;
|
||||
!page ? (page = 1) : (page = page);
|
||||
const bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
const animes = [];
|
||||
|
||||
$('.animes .container .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let id = el.find('a').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let title = el.find('.Title').text();
|
||||
let img = el.find('.Image img').attr('src');
|
||||
let category = el.find('.category').text();
|
||||
category = category.substring(1, category.length);
|
||||
let year = parseInt(el.find('.fecha').text());
|
||||
|
||||
const anime = {
|
||||
id,
|
||||
title,
|
||||
img,
|
||||
category,
|
||||
year,
|
||||
};
|
||||
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
let totalPages: any = $('.pagination').children().length;
|
||||
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
|
||||
let pages = parseInt($(totalPages).text());
|
||||
|
||||
let current = parseInt(page);
|
||||
res.status(200).json({
|
||||
current,
|
||||
pages,
|
||||
animes,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getYears(req: Request, res: Response) {
|
||||
try {
|
||||
const response = await axios.get(`${urls.main}/animes`);
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
let years = [];
|
||||
|
||||
let YearsContainer = $('.filter-container .clearfix .float-left')[2];
|
||||
|
||||
$(YearsContainer)
|
||||
.find('.dropdown-menu .dropdown-item')
|
||||
.each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let title = el.text();
|
||||
if (title.charAt(0) == ' ') {
|
||||
title = title.substring(1, title.length);
|
||||
}
|
||||
let id = el.attr('href');
|
||||
id = id.split('/')[2];
|
||||
let year: GenderI = {
|
||||
title,
|
||||
id,
|
||||
};
|
||||
years.push(year);
|
||||
});
|
||||
res.json(years);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getYear(req: Request, res: Response) {
|
||||
try {
|
||||
let { year } = req.params;
|
||||
let { page } = req.params;
|
||||
!page ? (page = '1') : (page = page);
|
||||
const bodyResponse = await axios.get(`${urls.main}/year/${year}?page=${page}`);
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
const animes = [];
|
||||
|
||||
$('.animes .container .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
|
||||
let id = el.find('a').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let title = el.find('.Title').text();
|
||||
let img = el.find('.Image img').attr('src');
|
||||
let category = el.find('.category').text();
|
||||
category = category.substring(1, category.length);
|
||||
let year = parseInt(el.find('.fecha').text());
|
||||
|
||||
const anime = {
|
||||
id,
|
||||
title,
|
||||
img,
|
||||
category,
|
||||
year,
|
||||
};
|
||||
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
let totalPages: any = $('.pagination').children().length;
|
||||
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
|
||||
let pages = parseInt($(totalPages).text());
|
||||
|
||||
let current = parseInt(page);
|
||||
res.status(200).json({
|
||||
current,
|
||||
pages,
|
||||
animes,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getLetters(req: Request, res: Response) {
|
||||
try {
|
||||
const bodyResponse = await axios.get(`${urls.main}/animes`);
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
const letters = [];
|
||||
let lettersContainer = $('.filter-container .clearfix .float-left')[3];
|
||||
$(lettersContainer)
|
||||
.find('.dropdown-menu .dropdown-item')
|
||||
.each((i, e) => {
|
||||
let el = $(e);
|
||||
let title = el.text();
|
||||
let id = el.attr('href');
|
||||
id = id.split('/')[2];
|
||||
let letter = {
|
||||
title,
|
||||
id,
|
||||
};
|
||||
letters.push(letter);
|
||||
});
|
||||
|
||||
res.status(200).json(letters);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
export async function getBy(req: Request, res: Response, multiple?) {
|
||||
try {
|
||||
let { gender, letter, category } = req.params;
|
||||
|
||||
let { page } = req.query;
|
||||
|
||||
if (!page) {
|
||||
page = '1';
|
||||
}
|
||||
|
||||
let bodyResponse;
|
||||
|
||||
if (multiple) {
|
||||
bodyResponse = await axios.get(
|
||||
`${urls.main}/categoria/${category}/genero/${gender}?page=${page}`
|
||||
);
|
||||
} else if (gender && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
|
||||
} else if (letter && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/letra/${letter}?page=${page}`);
|
||||
} else if (category && !multiple) {
|
||||
bodyResponse = await axios.get(`${urls.main}/categoria/${category}?page=${page}`);
|
||||
}
|
||||
const $ = cheerio.load(bodyResponse.data);
|
||||
|
||||
const animes = [];
|
||||
|
||||
$('.animes .container .row article').each((i, e) => {
|
||||
let el = $(e);
|
||||
let id = el.find('.link-anime').attr('href');
|
||||
id = id.split('/')[4];
|
||||
let img = el.find('.link-anime .Image img').attr('src');
|
||||
let title = el.find('.link-anime .Title').text();
|
||||
let type = el.find('.link-anime .info .category').text();
|
||||
let year = el.find('.link-anime .info .fecha').text();
|
||||
|
||||
let anime = {
|
||||
id,
|
||||
img,
|
||||
title,
|
||||
type,
|
||||
year,
|
||||
};
|
||||
|
||||
animes.push(anime);
|
||||
});
|
||||
|
||||
let totalPages: any = $('.pagination').children().length;
|
||||
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
|
||||
let pages = parseInt($(totalPages).text());
|
||||
|
||||
res.status(200).json({
|
||||
animes,
|
||||
pages,
|
||||
success: true,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// export {
|
||||
|
||||
// getAnime,
|
||||
// getAnimes,
|
||||
// searchAnime,
|
||||
// getEpisode,
|
||||
// getCategories,
|
||||
// getGenders,
|
||||
// getGender,
|
||||
// getYears,
|
||||
// getYear,
|
||||
// getLetters,
|
||||
// getBy
|
||||
// };
|
@ -0,0 +1,53 @@
|
||||
import axios from 'axios';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
import { parse } from 'node-html-parser';
|
||||
|
||||
export async function getAnime(req, res) {
|
||||
try {
|
||||
const url = 'https://monoschinos2.com/';
|
||||
const noImage = 'https://monoschinos2.com/assets/img/no_image.png';
|
||||
const defaulImage = 'https://image.freepik.com/free-vector/404-error-page-found_41910-364.jpg';
|
||||
const { id } = req.params;
|
||||
const { data } = await axios.get(`${urls.anime}/${id}`);
|
||||
const html = parse(data);
|
||||
const image = getAttr(html, '.Banner img', 'src');
|
||||
res.status(200).json({
|
||||
banner: image == noImage ? defaulImage : image || null,
|
||||
image: getAttr(html, 'figure img.img-fluid', 'src') || null,
|
||||
title:
|
||||
html
|
||||
.querySelector('h1.Title')
|
||||
.text.replace(/Sub Español/gi, '')
|
||||
.trim() || null,
|
||||
sinopsis: html.querySelector('.row .col-sm-9 .Description p').text || null,
|
||||
status: html.querySelector('.row .col-sm-9 .Type').text.trim() || null,
|
||||
date: html.querySelector('.after-title.mb-2').text.match(/\d+-\d+-\d+/)[0] || null,
|
||||
type:
|
||||
html.querySelector('.after-title.mb-2').text.match(/(\d+-\d+-\d+)\s?\|\s([A-Za-z]+)/)[2] ||
|
||||
null,
|
||||
genders: html.querySelectorAll('.generos a').map((g) => g.text) || null,
|
||||
episodes:
|
||||
html.querySelectorAll('.SerieCaps a').map((cap) => {
|
||||
const epId = cap.attributes['href'].replace(`${url}ver/`, '');
|
||||
return {
|
||||
no: parseInt(epId.split('-').pop()),
|
||||
id: epId,
|
||||
};
|
||||
}) || null,
|
||||
sugestions:
|
||||
html.querySelectorAll('.recom article').map((i) => {
|
||||
return {
|
||||
id: getAttr(i, 'a', 'href').replace(`${url}anime/`, ''),
|
||||
image: getAttr(i, 'a .Image img', 'src'),
|
||||
title: i.querySelector('a .Title').text,
|
||||
year: parseInt(i.querySelector('.fecha').text),
|
||||
};
|
||||
}) || null,
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
id: 'intertal-server-error',
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
import { parse } from 'node-html-parser';
|
||||
import axios from 'axios';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
|
||||
export async function getAnimes(req, res) {
|
||||
try {
|
||||
let { page = '1' } = req.params;
|
||||
const { data } = await axios.get(`${urls.main}/animes?page=${page}`);
|
||||
const html = parse(data);
|
||||
res.json(
|
||||
html.querySelectorAll('.animes .container .row article').map((i) => {
|
||||
const id = getAttr(i, 'a', 'href');
|
||||
return {
|
||||
id: id.split('/').pop() || null,
|
||||
title: i.querySelector('.Title').text || null,
|
||||
image: getAttr(i, '.Image img', 'src') || null,
|
||||
type: i.querySelector('.category.text-uppercase').text || null,
|
||||
year: parseInt(i.querySelector('.fecha').text) || null,
|
||||
};
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
import axios from 'axios';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { urls, getAttr } from '../config.js';
|
||||
|
||||
export async function getBy(req, res) {
|
||||
try {
|
||||
const { gender, category, letter, year, page = '1', sort, order } = req.query;
|
||||
let response;
|
||||
if (gender) response = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
|
||||
if (category) response = await axios.get(`${urls.main}/categoria/${category}?page=${page}`);
|
||||
if (letter) response = await axios.get(`${urls.main}/letra/${letter}?page=${page}`);
|
||||
if (year) response = await axios.get(`${urls.main}/year/${year}?page=${page}`);
|
||||
const { data } = response;
|
||||
const html = parse(data);
|
||||
const animes = html.querySelectorAll('.animes .container .row article').map((i) => {
|
||||
const id = getAttr(i, 'a', 'href');
|
||||
return {
|
||||
id: id.split('/').pop() || null,
|
||||
title: i.querySelector('.Title').text.trim() || null,
|
||||
image: getAttr(i, '.Image img', 'src') || null,
|
||||
type: i.querySelector('.category.text-uppercase').text.trim() || null,
|
||||
year: parseInt(i.querySelector('.fecha').text) || null,
|
||||
};
|
||||
});
|
||||
const isAsc = order == 'asc';
|
||||
const ordered = animes.sort((a, b) => {
|
||||
return (a[sort] < b[sort] ? -1 : 1) * (isAsc ? 1 : -1);
|
||||
});
|
||||
res.status(200).json(sort ? ordered : animes);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
import axios from 'axios';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { urls } from '../config.js';
|
||||
|
||||
export async function getCategories(req, res) {
|
||||
try {
|
||||
const { data } = await axios.get(`${urls.main}/animes`);
|
||||
const html = parse(data);
|
||||
res.status(200).json(
|
||||
html
|
||||
.querySelectorAll('div[aria-labelledby="categoryMenuButton"] a')
|
||||
.map((i) => {
|
||||
return {
|
||||
name: i.text.trim(),
|
||||
id: i?.attributes['href'].replace('/categoria/', ''),
|
||||
};
|
||||
})
|
||||
.filter((i) => i.id !== '')
|
||||
);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
import axios from 'axios';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
|
||||
export async function getEmision(req, res) {
|
||||
try {
|
||||
let { page = '1' } = req.query;
|
||||
const { data } = await axios.get(`${urls.emision}${page}`);
|
||||
const html = parse(data);
|
||||
res.status(200).json(
|
||||
html.querySelectorAll('.animes .container .row article').map((i) => {
|
||||
return {
|
||||
id: getAttr(i, 'a', 'href').split('/').pop(),
|
||||
title: i.querySelector('.Title').text.trim(),
|
||||
image: getAttr(i, '.Image img', 'src'),
|
||||
type: i.querySelector('.category').text.trim(),
|
||||
year: parseInt(i.querySelector('.fecha').text),
|
||||
};
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
import axios from 'axios';
|
||||
import cheerio from 'cheerio';
|
||||
import { Request, Response } from 'express';
|
||||
import { urls } from '../config';
|
||||
|
||||
export async function getEmision(req: Request, res: Response) {
|
||||
try {
|
||||
let { page = '1' } = req.query;
|
||||
const { data } = await axios.get(`${urls.emision}${page}`);
|
||||
const $ = cheerio.load(data);
|
||||
const animes = $('.animes .container .row article')
|
||||
.map((i, e) => {
|
||||
let el: cheerio.Cheerio = $(e);
|
||||
let category: string = el.find('.category').text();
|
||||
return {
|
||||
id: el.find('a').attr('href').split('/')[4],
|
||||
title: el.find('.Title').text(),
|
||||
img: el.find('.Image img').attr('src'),
|
||||
category: el.find('.category').text().substring(1, category.length),
|
||||
year: parseInt(el.find('.fecha').text()),
|
||||
};
|
||||
})
|
||||
.toArray();
|
||||
let pagesBase: string = $('.pagination').text().match(/\d/g).pop();
|
||||
let pages = parseInt(pagesBase);
|
||||
res.json({ animes, pages }).status(200);
|
||||
} catch (err) {
|
||||
res.json({
|
||||
message: err.message,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
// 46 lines before refactoring
|
@ -0,0 +1,48 @@
|
||||
import axios from 'axios';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
import { parse } from 'node-html-parser';
|
||||
|
||||
export async function getEpisode(req, res) {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { data } = await axios.get(`${urls.episode}/${id}`);
|
||||
const html = parse(data);
|
||||
const map = {
|
||||
Anterior: true,
|
||||
Siguiente: true,
|
||||
};
|
||||
const videos = html.querySelectorAll('.TPlayer.mt-3.mb-3 .TPlayerTb').map((i) => {
|
||||
const tag = parse(i.text);
|
||||
return tag.querySelector('iframe')?.attributes['src'];
|
||||
});
|
||||
const servers = html.querySelectorAll('#downloads table tbody tr').map((i) => {
|
||||
return {
|
||||
name: getAttr(i, 'a', 'href').match(/\/\/(.+)\//)[1],
|
||||
url: getAttr(i, 'a', 'href'),
|
||||
};
|
||||
});
|
||||
const ctrls = {};
|
||||
html.querySelectorAll('.d-flex.justify-content-center.mb-4 a').forEach((i) => {
|
||||
const id = i.text.replace(/\s/g, '');
|
||||
let key;
|
||||
id == 'Siguiente' ? (key = 'next') : id == 'Anterior' ? (key = 'prev') : 'menu';
|
||||
ctrls[key] = map[id];
|
||||
});
|
||||
delete ctrls['menu'];
|
||||
res.json({
|
||||
title: html.querySelector('.Title-epi').text,
|
||||
no: parseInt(id.split('-').pop()) || 0,
|
||||
animeId: getAttr(html, 'a.btnWeb.green.Current', 'href').replace(
|
||||
'https://monoschinos2.com/anime/',
|
||||
''
|
||||
),
|
||||
videos: videos.filter((i) => i !== undefined),
|
||||
servers,
|
||||
ctrls,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
import axios from 'axios';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { urls } from '../config.js';
|
||||
|
||||
export async function getGenders(req, res) {
|
||||
try {
|
||||
const { data } = await axios.get(`${urls.main}/animes`);
|
||||
const html = parse(data);
|
||||
res.status(200).json(
|
||||
html
|
||||
.querySelectorAll('div[aria-labelledby="genreMenuButton"] a')
|
||||
.map((i) => {
|
||||
return {
|
||||
name: i.text.trim(),
|
||||
id: i?.attributes['href'].replace('/genero/', ''),
|
||||
};
|
||||
})
|
||||
.filter((i) => i.id !== '')
|
||||
);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
import axios from 'axios';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
import { parse } from 'node-html-parser';
|
||||
|
||||
export async function getLastest(req, res) {
|
||||
try {
|
||||
const { data } = await axios.get(urls.main);
|
||||
const html = parse(data);
|
||||
res.json(
|
||||
html.querySelectorAll('.row article').map((i) => {
|
||||
const id = getAttr(i, 'a', 'href').split('/').pop();
|
||||
return {
|
||||
id: id || null,
|
||||
title: i.querySelector('.Title').text || null,
|
||||
image: getAttr(i, '.Image img', 'src') || null,
|
||||
type: i.querySelector('.Image figure span').text.trim() || null,
|
||||
episode: parseInt(id.split('-').pop()) || null,
|
||||
};
|
||||
})
|
||||
);
|
||||
} catch (error) {
|
||||
return res.json({ error: error.message }).status(500);
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
import cheerio from 'cheerio';
|
||||
import axios from 'axios';
|
||||
import { urls } from '../config';
|
||||
import { Response, Request } from 'express';
|
||||
|
||||
export async function getLastest(req: Request, res: Response) {
|
||||
try {
|
||||
const { data } = await axios.get(urls.main);
|
||||
const $ = cheerio.load(data);
|
||||
let getLastest = $('.container .caps .container')[0];
|
||||
const animes: cheerio.Element[] = $(getLastest)
|
||||
.find('.row article')
|
||||
.map((i, e) => {
|
||||
let el: cheerio.Cheerio = $(e);
|
||||
let type: string = el.find('.Image figure span').text();
|
||||
return {
|
||||
id: el
|
||||
.find('a')
|
||||
.attr('href')
|
||||
.replace(/https:\/\/monoschinos2\.com\/ver\//, ''),
|
||||
title: el.find('.Title').html().split('\t')[0],
|
||||
cover: el.find('.Image img').attr('src'),
|
||||
type: type.substring(1, type.length),
|
||||
episode: parseInt(el.find('.dataEpi .episode').text().split('\n')[1]),
|
||||
};
|
||||
})
|
||||
.toArray();
|
||||
return res.json(animes).status(200);
|
||||
} catch (error) {
|
||||
return res.json({ error: error.message }).status(500);
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
import axios from 'axios';
|
||||
import { parse } from 'node-html-parser';
|
||||
import { urls } from '../config.js';
|
||||
|
||||
export async function getYears(req, res) {
|
||||
try {
|
||||
const { data } = await axios.get(`${urls.main}/animes`);
|
||||
const html = parse(data);
|
||||
res.status(200).json(
|
||||
html
|
||||
.querySelectorAll('div[aria-labelledby="yearMenuButton"] a')
|
||||
.map((i) => {
|
||||
return {
|
||||
name: i.text.trim(),
|
||||
id: i?.attributes['href'].replace('/year/', ''),
|
||||
};
|
||||
})
|
||||
.filter((i) => i.id !== '')
|
||||
);
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
message: err,
|
||||
success: false,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
export * from './getLastest.js';
|
||||
export * from './getEmision.js';
|
||||
export * from './getAnime.js';
|
||||
export * from './searchAnimes.js';
|
||||
export * from './getAnimes.js';
|
||||
export * from './getEpisode.js';
|
||||
export * from './getCategories.js';
|
||||
export * from './getGenders.js';
|
||||
export * from './getYears.js';
|
||||
export * from './getBy.js';
|
@ -1,2 +0,0 @@
|
||||
export * from './getLastest';
|
||||
export * from './getEmision';
|
@ -0,0 +1,27 @@
|
||||
import { parse } from 'node-html-parser';
|
||||
import axios from 'axios';
|
||||
import { getAttr, urls } from '../config.js';
|
||||
|
||||
export async function searchAnime(req, res) {
|
||||
try {
|
||||
let { id } = req.params;
|
||||
const { data } = await axios.get(`${urls.search}${id}`);
|
||||
const html = parse(data);
|
||||
res.json(
|
||||
html.querySelectorAll('.animes .row article').map((i) => {
|
||||
return {
|
||||
id: getAttr(i, 'a', 'href').split('/').pop() || null,
|
||||
title: i.querySelector('h3.Title').text || null,
|
||||
image: getAttr(i, '.cover .img-fluid', 'src') || null,
|
||||
type: i.querySelector('.category.text-uppercase').text.trim() || null,
|
||||
year: parseInt(i.querySelector('.fecha').text) || null,
|
||||
};
|
||||
})
|
||||
);
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
id: 'intertal-server-error',
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
import app from './app.js';
|
||||
|
||||
app.listen(process.env.PORT || 5000, () => {
|
||||
console.clear();
|
||||
console.info(`API Running on: 5000 ============================`);
|
||||
});
|
@ -1,11 +0,0 @@
|
||||
import app from './app';
|
||||
import { appConfig } from './config'
|
||||
|
||||
function init(host:any, port:any) {
|
||||
app.listen(port, host, ( ) => {
|
||||
console.clear()
|
||||
console.info(`API Running on: ${host}:${port} ============================`);
|
||||
})
|
||||
}
|
||||
|
||||
init(appConfig.host, appConfig.port)
|
@ -1,79 +0,0 @@
|
||||
export interface EmisionResponse{
|
||||
animes: Array<EmisionI>;
|
||||
pages: number;
|
||||
}
|
||||
|
||||
export interface EmisionI{
|
||||
id: string;
|
||||
title: string;
|
||||
img: string;
|
||||
category: string;
|
||||
year: number;
|
||||
}
|
||||
// const anime: {
|
||||
|
||||
// }
|
||||
export interface LastestAnimeI {
|
||||
title: string
|
||||
cover: string
|
||||
id?: string
|
||||
episode: string
|
||||
type: string
|
||||
}
|
||||
export interface AnimeI{
|
||||
id: string;
|
||||
title: string;
|
||||
banner: string;
|
||||
type: string;
|
||||
cover: string;
|
||||
sinopsis: string;
|
||||
status: string;
|
||||
date: string;
|
||||
genders: GenderI[];
|
||||
sugestions: SuggestionI[];
|
||||
episodes: EpI[];
|
||||
}
|
||||
|
||||
export interface GenderI{
|
||||
id:string;
|
||||
title:string;
|
||||
}
|
||||
|
||||
export interface SuggestionI{
|
||||
id:string;
|
||||
title:string;
|
||||
cover:string;
|
||||
year:number;
|
||||
}
|
||||
export interface EpI{
|
||||
id:string;
|
||||
number:number;
|
||||
}
|
||||
|
||||
export interface AnimeSearchI {
|
||||
id?: string;
|
||||
title: string;
|
||||
cover: string
|
||||
category: string;
|
||||
year: number;
|
||||
}
|
||||
|
||||
|
||||
export interface EpisodeI {
|
||||
id?: string;
|
||||
title: string;
|
||||
number: string
|
||||
videos: Array<VideosI>;
|
||||
downloads: Array<DownloadsI>;
|
||||
}
|
||||
|
||||
export interface VideosI {
|
||||
url: string;
|
||||
title: string;
|
||||
}
|
||||
export interface DownloadsI {
|
||||
url: string;
|
||||
server: string;
|
||||
}
|
||||
|
||||
|
@ -1,71 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Visit https://aka.ms/tsconfig.json to read more about this file */
|
||||
|
||||
/* Basic Options */
|
||||
// "incremental": true, /* Enable incremental compilation */
|
||||
"target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
|
||||
// "lib": [], /* Specify library files to be included in the compilation. */
|
||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||
// "checkJs": true, /* Report errors in .js files. */
|
||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
|
||||
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||||
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||
"outDir": "./dist/", /* Redirect output structure to the directory. */
|
||||
"rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||
// "composite": true, /* Enable project compilation */
|
||||
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||||
"removeComments": true, /* Do not emit comments to output. */
|
||||
// "noEmit": true, /* Do not emit outputs. */
|
||||
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||
|
||||
/* Strict Type-Checking Options */
|
||||
"strict": false, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||
"strictNullChecks": false, /* Enable strict null checks. */
|
||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||
|
||||
/* Additional Checks */
|
||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
|
||||
// "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
|
||||
|
||||
/* Module Resolution Options */
|
||||
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||
// "types": [], /* Type declaration files to be included in compilation. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
|
||||
/* Source Map Options */
|
||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||
|
||||
/* Experimental Options */
|
||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||
|
||||
/* Advanced Options */
|
||||
"skipLibCheck": true, /* Skip type checking of declaration files. */
|
||||
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue