Create project, create webscraper for Euromilhões page, begin works on REST API

This commit is contained in:
Amelia 2022-06-05 16:02:41 +01:00
commit e88a6b2d0a
12 changed files with 2814 additions and 0 deletions

130
.gitignore vendored Normal file
View File

@ -0,0 +1,130 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

3
Portuguese-README.md Normal file
View File

@ -0,0 +1,3 @@
# jogos-santa-casa-api
Um REST API para consultar as chave dos últimos sorteio dos jogos Santacasa.

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# jogos-santa-casa-api
A REST API to check the keys for the latest draws of Jogos Santacasa.

980
index.html Normal file
View File

@ -0,0 +1,980 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="pt">
<head>
<!-- meta -->
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<meta name="description" content="Jogos & Jackpots, Euromilh<6C>es, Totoloto, Totobola, Lotaria Cl<43>ssica, Lotaria Popular">
<meta name="format-detection" content="telephone=no">
<title>Jogos Santa Casa - <20>ltimos Resultados - Euromilh<6C>es</title>
<link rel="shortcut icon" href="/html/favicon.ico" />
<!--CSS-->
<link type="text/css" rel="stylesheet" href="/html/css/34/jogosantacasa_34.css" />
<link type="text/css" rel="stylesheet" href="/html/css/34/fonts_34.css" />
<link type="text/css" rel="stylesheet" href="/html/css/34/colorbox_34.css" />
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="/html/css/34/jogosantacasa-ie7_34.css">
<![endif]-->
<!--SCRIPT-->
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery-1.5.2.min_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.tools.min_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jsc_search_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/core/jsc_mobile_25.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-34735701-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<!--PER PAGE RESOURCES -->
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.tools.min_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.jstyling_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.jscrollpane.min_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.colorbox_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/add-ins/jsc_results_board_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/core/jsc_ui_25.js"></script>
<script type="text/javascript" src="/html/scripts/25/core/jsc_main_25.js"></script>
</head>
<body>
<div class="wrapper">
<script type="text/javascript">
var Breadcrumb = {};
Breadcrumb.location = 'Chaves e Resultados/<2F>ltimos Resultados/Euromilh<6C>es';
</script>
<!--20131108 - Start Politica de cookies -->
<script type="text/javascript" src="/html/scripts/25/add-ins/jquery.cookie_disclaimer_25.js"></script>
<form id="frmPrivacyContent" name="frmPrivacyContent" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contentId" id="contentId" value="4523"/>
</form>
<a id="cookiediv"></a>
<script>cookiestatus();</script>
<!--20131108 - End Politica de cookies -->
<div class="header">
<h1><a href="/">Jogos Santa Casa</a></h1>
<div id="info" class="logout">
<div class="loginWrapper">
<h2><strong>Bem-vindo(a) </strong> ao Portal Jogos Santa Casa
<span>Se ainda n<>o est<73> registado(a) clique em "<a href="/web/ContaRegistar/">Abrir Conta</a>"</span>
</h2>
</div>
<div class="contentMyAccout">
<script>
var timerCookie = getCookie('mycookie');
if(timerCookie){
document.cookie = 'mycookie=;expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';
}
function getCookie(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) {
c_end = document.cookie.length;
}
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
</script>
<a href="/web/JogarApostar/" class="shoppingCart">Carrinho de Apostas: <strong>(00)<span> &euro;0,00</span></strong></a>
<div class="links">
<a href="/web/ContaRegistar/" class="myAccout"><span>ABRIR CONTA</span></a>
<a href="/web/login/view" class="login loginPopup redirect-to-self"><span>LOGIN</span></a>
<div class="recoverPass">
<span class="recoverPass">Recuperar </span><a href="/web/ContaRecupUser/" class="recoverPass"><span>Utilizador</span></a>
<span class="recoverPass">ou </span><a href="/web/ContaRecupPassword/" class="recoverPass"><span>Password</span></a>
</div>
</div>
</div>
</div>
<script>
JSC.MAIN.loginPopup(false);
</script>
</div>
<div class="menu">
<ul class="firstLevel">
<li class="firstLevel">
<a href="/">IN<EFBFBD>CIO</a>
</li>
<li class="firstLevel childrens">
<a href="/web/Jogar/">JOGAR</a>
<ul class="secondLevel">
<li class="secondLevel"><a href="/web/Jogar/">Jogos e Jackpots</a></li>
<li class="secondLevel"><a href="/web/JogarEuromilhoes/">Euromilh<EFBFBD>es</a></li>
<li class="secondLevel"><a href="/web/JogarTotoloto/">Totoloto</a></li>
<li class="secondLevel"><a href="/web/JogarLotClass/">Lotaria Cl<43>ssica</a></li>
<li class="secondLevel"><a href="/web/JogarLotPop/">Lotaria Popular</a></li>
<li class="secondLevel"><a href="/web/JogarRaspadinha/">Raspadinha</a></li>
<li class="secondLevel"><a href="/web/JogarTotobola/">Totobola</a></li>
<li class="secondLevel childrens"><a href="/web/JogarRapido/">Jogar R<>pido</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/JogarRapido/euromilhoes">Euromilh<EFBFBD>es</a></li>
<li class="thirdLevel"><a href="/web/JogarRapido/totoloto">Totoloto</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevelLast"></li>
</ul>
</li>
<li class="firstLevel">
<a href="/web/JogarRaspadinha/">RASPADINHA</a>
</li>
<li class="firstLevel childrens">
<a href="/web/SCCartazResult/">CHAVES E RESULTADOS</a>
<ul class="secondLevel">
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/euroMilhoes">Euromilh<EFBFBD>es</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevel"><a href="/web/SCCartazResult/cmil"><EFBFBD>ltimos Resultados Chuva de Milion<6F>rios</a></li>
<li class="thirdLevel"><a href="/web/SCEstatisticas/">Estat<EFBFBD>sticas</a></li>
<li class="thirdLevel"><a href="/web/SCMotorBusca/">Motor de Pesquisa</a></li>
<li class="thirdLevel"><a href="/web/SCQuantoGanhou/euromilhoes">Quanto Ganhei?</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/m1lhao">M1lh<EFBFBD>o</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/m1lhao"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevel"><a href="/web/SCQuantoGanhou/m1lhao">Quanto Ganhei?</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/totolotoNew">Totoloto</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/totolotoNew"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevel"><a href="/web/SCEstatisticas/totolotoN">Estat<EFBFBD>sticas</a></li>
<li class="thirdLevel"><a href="/web/SCMotorBusca/totolotoN">Motor de Pesquisa</a></li>
<li class="thirdLevel"><a href="/web/SCQuantoGanhou/totolotoN">Quanto Ganhei?</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/lotClass">Lotaria Cl<43>ssica</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/lotClass"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevel"><a href="/web/SCMotorBusca/lotariaClassica">Motor de Pesquisa</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/lotPop">Lotaria Popular</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/lotPop"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevel"><a href="/web/SCMotorBusca/lotariaPopular">Motor de Pesquisa</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/bolaNormal">Totobola</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/bolaNormal"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCCartazResult/bolaExtra1">Totobola Extra</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCCartazResult/bolaExtra1"><EFBFBD>ltimos Resultados</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a href="/web/SCListaPremios/">Lista de Pr<50>mios</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a href="/web/SCListaPremios/featuredPrizes">Destaque</a></li>
<li class="thirdLevel"><a href="/web/SCListaPremios/prizeHistory">Hist<EFBFBD>rico de Pr<50>mios</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevelLast"></li>
</ul>
</li>
<li class="firstLevel childrens helpers">
<a id="help_1_0_0_10">COMO JOGAR</a>
<ul class="secondLevel">
<li class="secondLevel"><a id="help_1_0_0_10">Como abrir a minha conta?</a></li>
<li class="secondLevel"><a id="help_1_1_0_9">Como carrego o cart<72>o de jogador?</a></li>
<li class="secondLevel childrens">
<a id="help_1_2_0_20">Como aposto?</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a id="help_1_2_0_20">Euromilh<EFBFBD>es</a></li>
<li class="thirdLevel"><a id="help_1_2_0_7722">M1lh<EFBFBD>o</a></li>
<li class="thirdLevel"><a id="help_1_2_0_21">Totoloto</a></li>
<li class="thirdLevel"><a id="help_1_2_0_23">Lotarias</a></li>
<li class="thirdLevel"><a id="help_1_2_0_2730">Raspadinha</a></li>
<li class="thirdLevel"><a id="help_1_2_0_22">Totobola</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a id="help_1_3_0_13">Apostas</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a id="help_1_3_0_13">Como pago?</a></li>
<li class="thirdLevel"><a id="help_1_3_0_14">Como recebo os pr<70>mios?</a></li>
<li class="thirdLevel"><a id="help_1_3_0_15">Como cancelo?</a></li>
<li class="thirdLevel"><a id="help_1_3_0_16">O que s<>o as Apostas Pendentes?</a></li>
<li class="thirdLevel"><a id="help_1_3_0_8">O que <20> o Registo Autom<6F>tico Apostas?</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a id="help_1_4_0_17">Outras Funcionalidades</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a id="help_1_4_0_17">Chave Cega</a></li>
<li class="thirdLevel"><a id="help_1_4_0_18">Jogar R<>pido</a></li>
<li class="thirdLevel"><a id="help_1_4_0_19">Jogar via SMS</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevelLast"></li>
</ul>
</li>
<li class="firstLevel childrens">
<a class='loginPopup' href="/web/Conta/">A MINHA CONTA</a>
<ul class="secondLevel">
<li class="secondLevel childrens">
<a class='loginPopup' href="/web/ContaApostas/">As Minhas Apostas</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaApostas/">Apostas em Jogo</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaHistoricoApostas/">Hist<EFBFBD>rico de Apostas</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/RegistoAutomaticoApostas/">Registo Autom<6F>tico de Apostas</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a class='loginPopup' href="/web/ChavesFavoritas/">As Minhas Chaves</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a class='loginPopup' href="/web/ChavesFavoritas/">Chaves Favoritas</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/NumerosSorteAzar/">N<EFBFBD> da Fortuna e N<> do Azar</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel childrens">
<a class='loginPopup' href="/web/ContaDados/">Os Meus Dados Pessoais</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaDados/">O Meu Perfil</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaUserPassword/">Utilizador e Password</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaCartoes/">Cart<EFBFBD>o de Jogador</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/GestaoNotificacoes/">Gest<EFBFBD>o de Notifica<63><61>es</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaEncerrar/">Encerrar Conta</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel"><a class='loginPopup' href="/web/ContaCorrente/">A Minha Conta Corrente</a></li>
<li class="secondLevel childrens">
<a class='loginPopup' href="/web/ContaPremios/">Receber os Meus Pr<50>mios</a>
<ul class="thirdLevel">
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaPremios/">Pagamento de Pr<50>mios</a></li>
<li class="thirdLevel"><a class='loginPopup' href="/web/ContaConfigResgPr/">Rece<EFBFBD><EFBFBD>o Autom<6F>tica de Pr<50>mios</a></li>
<li class="thirdLevelLast"></li>
</ul>
</li>
<li class="secondLevel">
<a class='loginPopup' href="/web/Autoexclusao/">Autoexclus<EFBFBD>o</a>
</li>
<li class="secondLevelLast"></li>
</ul>
</li>
<li class="firstLevelLast"></li>
</ul>
<form name="helpTopic" method="post" action="/web/AjudaComoApostar/" style="display: hidden;"></form>
<form name="searchFormTop" method="post" action="/web/AjudaProcurar/search">
<div class="searchContent">
<span>
<input type="text" name="searchInput" id="searchInput" maxlength="255" />
</span>
<input name="hidQuery" id="hidQuery" type="hidden" value=""/>
<input name="numPage" id="numPage" type="hidden" value="1"/>
<input type="submit" name="Search" id="Search" value="bot<6F>o Pesquisar" />
<!--[if IE]>
<input type="text" style="display: none;" disabled="disabled" size="1" />
<![endif]-->
</div>
</form>
</div>
<div class="clear"></div>
<div class="clear"></div>
<div class="contentMain">
<form name="frmContestSelection" id="frmContestSelection" method="post" action="/web/SCCartazResult/euroMilhoes">
<div class="mainRegistration breadCrumbLevel3">
<div class="breadcrumbs">
<ul>
<li><a href="/">In<EFBFBD>cio /</a></li>
<li><a href="/web/SCCartazResult/">Chaves e Resultados</a> /</li>
<li><a href="/web/SCCartazResult/"><EFBFBD>ltimos Resultados</a> /</li>
<li>Euromilh<EFBFBD>es</li>
</ul>
</div>
<div class="contentRecoverPass">
<div class="bgTopSection">
<div class="bgBottomSection">
<div class="bgCenter title">
<div class="hgroup">
<h2><EFBFBD>ltimos Resultados</h2>
<h3>Veja os n<>meros do <20>ltimo sorteio do Euromilh<6C>es.</h3>
</div>
</div>
</div>
</div>
<div class="bgTopSection">
<div class="bgBottomSection">
<div class="bgCenter title">
<div class="hgroup">
<h3 class="consult">Consultar Sorteios</h3>
</div>
<div class=" selectField2 floatLeft">
<select name="selectContest">
<option selected value="12107.0">044/2022 - sexta-feira</option>
<option value="12106.0">043/2022 - ter<65>a-feira</option>
<option value="12105.0">042/2022 - sexta-feira</option>
<option value="12104.0">041/2022 - ter<65>a-feira</option>
<option value="12103.0">040/2022 - sexta-feira</option>
<option value="12102.0">039/2022 - ter<65>a-feira</option>
<option value="12101.0">038/2022 - sexta-feira</option>
<option value="12100.0">037/2022 - ter<65>a-feira</option>
<option value="12099.0">036/2022 - sexta-feira</option>
<option value="12098.0">035/2022 - ter<65>a-feira</option>
<option value="12097.0">034/2022 - sexta-feira</option>
<option value="12096.0">033/2022 - ter<65>a-feira</option>
<option value="12095.0">032/2022 - sexta-feira</option>
<option value="12094.0">031/2022 - ter<65>a-feira</option>
<option value="12093.0">030/2022 - sexta-feira</option>
<option value="12092.0">029/2022 - ter<65>a-feira</option>
<option value="12091.0">028/2022 - sexta-feira</option>
<option value="12090.0">027/2022 - ter<65>a-feira</option>
<option value="12089.0">026/2022 - sexta-feira</option>
<option value="11936.0">025/2022 - ter<65>a-feira</option>
<option value="11935.0">024/2022 - sexta-feira</option>
<option value="11934.0">023/2022 - ter<65>a-feira</option>
<option value="11933.0">022/2022 - sexta-feira</option>
<option value="11932.0">021/2022 - ter<65>a-feira</option>
<option value="11931.0">020/2022 - sexta-feira</option>
<option value="11930.0">019/2022 - ter<65>a-feira</option>
<option value="11929.0">018/2022 - sexta-feira</option>
<option value="11928.0">017/2022 - ter<65>a-feira</option>
<option value="11927.0">016/2022 - sexta-feira</option>
<option value="11926.0">015/2022 - ter<65>a-feira</option>
</select>
</div>
<div class="formBtn lightGray">
<input name="Consultar" value="Consultar" type="button" />
</div>
</div>
</div>
</div>
<div class="bgTopSection">
<div class="bgBottomSection">
<div class="bgCenter sendBtn betnow">
<strong class="euromilhoes floatLeft">euro milh<6C>es</strong>
<span class="dataInfo">Sorteio: 044/2022 - sexta-feira<br>
Data do Sorteio - 03/06/2022</span>
<div class="clear"></div>
<div class="betHeader twocol">
<ul>
<li>Chave</li>
<li class="last">Ordem de sa<73>da</li>
</ul>
</div>
<div class="betMiddle twocol regPad">
<ul class="colums">
<li>12 28 29 34 48 + 9 11</li>
<li>29 12 48 28 34 + 9 11</li>
</ul>
</div>
<div class="betHeader fourcolRow">
<ul>
<li>Pr<EFBFBD>mios</li>
<li>Acertos</li>
<li class="twoRows twoLines">
<em>N<EFBFBD>mero de vencedores</em>
<span>
<small>Portugal</small>
<small>Total</small>
</span>
</li>
<li class="last">Valor
</li>
</ul>
</div>
<div class="stripped betMiddle customfiveCol regPad">
<ul class="colums">
<li>1.<2E> Pr<50>mio</li>
<li>5 N<>meros + 2 Estrelas</li>
<li class="litleCol">0</li>
<li class="litleCol">0</li>
<li>
(1)
</li>
</ul>
<ul class="colums">
<li>2.<2E> Pr<50>mio</li>
<li>5 N<>meros + 1 Estrela</li>
<li class="litleCol">1</li>
<li class="litleCol">2</li>
<li>
&euro; 347.955,69&nbsp;
</li>
</ul>
<ul class="colums">
<li>3.<2E> Pr<50>mio</li>
<li>5 N<>meros + 0 Estrelas</li>
<li class="litleCol">2</li>
<li class="litleCol">3</li>
<li>
&euro; 54.215,31&nbsp;
</li>
</ul>
<ul class="colums">
<li>4.<2E> Pr<50>mio</li>
<li>4 N<>meros + 2 Estrelas</li>
<li class="litleCol">4</li>
<li class="litleCol">23</li>
<li>
&euro; 2.202,61&nbsp;
</li>
</ul>
<ul class="colums">
<li>5.<2E> Pr<50>mio</li>
<li>4 N<>meros + 1 Estrela</li>
<li class="litleCol">49</li>
<li class="litleCol">563</li>
<li>
&euro; 165,75&nbsp;
</li>
</ul>
<ul class="colums">
<li>6.<2E> Pr<50>mio</li>
<li>3 N<>meros + 2 Estrelas</li>
<li class="litleCol">106</li>
<li class="litleCol">1.322</li>
<li>
&euro; 74,62&nbsp;
</li>
</ul>
<ul class="colums">
<li>7.<2E> Pr<50>mio</li>
<li>4 N<>meros + 0 Estrelas</li>
<li class="litleCol">109</li>
<li class="litleCol">1.452</li>
<li>
&euro; 47,74&nbsp;
</li>
</ul>
<ul class="colums">
<li>8.<2E> Pr<50>mio</li>
<li>2 N<>meros + 2 Estrelas</li>
<li class="litleCol">1.676</li>
<li class="litleCol">19.667</li>
<li>
&euro; 17,62&nbsp;
</li>
</ul>
<ul class="colums">
<li>9.<2E> Pr<50>mio</li>
<li>3 N<>meros + 1 Estrela</li>
<li class="litleCol">2.554</li>
<li class="litleCol">30.360</li>
<li>
&euro; 12,73&nbsp;
</li>
</ul>
<ul class="colums">
<li>10.<2E> Pr<50>mio</li>
<li>3 N<>meros + 0 Estrelas</li>
<li class="litleCol">6.316</li>
<li class="litleCol">71.744</li>
<li>
&euro; 10,03&nbsp;
</li>
</ul>
<ul class="colums">
<li>11.<2E> Pr<50>mio</li>
<li>1 N<>mero + 2 Estrelas</li>
<li class="litleCol">10.068</li>
<li class="litleCol">106.808</li>
<li>
&euro; 8,16&nbsp;
</li>
</ul>
<ul class="colums">
<li>12.<2E> Pr<50>mio</li>
<li>2 N<>meros + 1 Estrela</li>
<li class="litleCol">43.188</li>
<li class="litleCol">459.619</li>
<li>
&euro; 5,97&nbsp;
</li>
</ul>
<ul class="colums">
<li>13.<2E> Pr<50>mio</li>
<li>2 N<>meros + 0 Estrelas</li>
<li class="litleCol">104.809</li>
<li class="litleCol">1.086.312</li>
<li>
&euro; 4,07&nbsp;
</li>
</ul>
</div>
<div class="impostoAltosPremiados">
Os pr<70>mios atribu<62>dos de valor superior a &euro; 5.000,00 est<73>o sujeitos a imposto do selo, <20> taxa legal de 20%, nos termos da legisla<6C><61>o em vigor.
</div>
<div class="betHeader onecol">
<ul>
<li class="last">Estat<EFBFBD>sticas</li>
</ul>
</div>
<div class="betMiddle twocol">
<ul class="noLine">
<li>
Receita il<69>quida apostas *
</li>
<li>
&euro; 53.326.543,60
</li>
</ul>
<ul class="noLine">
<li>
Montante para pr<70>mios *
</li>
<li>
&euro; 26.663.271,80
</li>
</ul>
<ul class="noLine">
<li class="stronger">
(1)
Previs<69>o 1<> Pr<50>mio c / Jackpot
</li>
<li class="stronger">
&euro; 51.000.000,00
</li>
</ul>
<ul class="noLine">
<li>
N<> de Bilhetes registados em Portugal
</li>
<li>
1.372.443
</li>
</ul>
<ul class="noLine">
<li>
N<> de Combina<6E><61>es registadas em Portugal
</li>
<li>
2.336.128
</li>
</ul>
<ul class="noLine">
<li>
N<> de Apostas registadas em Portugal
</li>
<li>
2.475.202
</li>
</ul>
<p>*Valor total referente a todos os pa<70>ses participantes no Euromilh<6C>es</p>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<div class="footer">
<div class="top">
<ul class="contentTitle">
<li class="title"><span>Jogar</span>
<div class="borderLeftGray">
<ul class="contentLinks">
<li><a href="/web/JogarEuromilhoes/" title="Euromilh<6C>es">Euromilh<EFBFBD>es</a></li>
<li><a href="/web/JogarTotoloto/" title="Totoloto">Totoloto</a></li>
<li><a href="/web/JogarLotClass/" title="Lotaria Cl<43>ssica">Lotaria Cl<43>ssica</a></li>
<li><a href="/web/JogarLotPop/" title="Lotaria Popular">Lotaria Popular</a></li>
<li><a href="/web/JogarRaspadinha/" title="Raspadinha">Raspadinha</a></li>
<li><a href="/web/JogarTotobola/" title="Totobola">Totobola</a></li>
</ul>
</div>
</li>
<li class="title"><span>Chaves e Resultados</span>
<div class="borderLeftGray">
<ul class="contentLinks">
<li><a href="/web/SCCartazResult/" title="<22>ltimos Resultados"><EFBFBD>ltimos Resultados</a></li>
<li><a href="/web/SCEstatisticas/" title="Estat<61>sticas">Estat<EFBFBD>sticas</a></li>
<li><a href="/web/SCMotorBusca/" title="Motor de Pesquisa">Motor de Pesquisa</a></li>
<li><a href="/web/SCQuantoGanhou/euromilhoes" title="Quanto Ganhei?">Quanto Ganhei?</a></li>
<li><a href="/web/SCListaPremios/" title="Lista Pr<50>mios">Lista de Pr<50>mios</a></li>
</ul>
</div>
</li>
<li class="title"><span>Ajuda</span>
<div class="borderLeftGray">
<ul class="contentLinks">
<li>
<form id="frmFooterContent_10" name="frmContent_10" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="10.0"/>
<a href="javascript:document.forms['frmFooterContent_10'].submit();" title="Como abrir a minha conta?">Como abrir a minha conta?</a>
</form>
</li>
<li>
<form id="frmFooterContent_12" name="frmContent_12" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="12.0"/>
<a href="javascript:document.forms['frmFooterContent_12'].submit();" title="Como recuperar password?">Como recuperar password?</a>
</form>
</li>
<li>
<form id="frmFooterContent_11" name="frmContent_11" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="11.0"/>
<a href="javascript:document.forms['frmFooterContent_11'].submit();" title="Como utilizo o carrinho de apostas?">Como utilizo o carrinho de apostas?</a>
</form>
</li>
<li>
<form id="frmFooterContent_9" name="frmContent_9" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="9.0"/>
<a href="javascript:document.forms['frmFooterContent_9'].submit();" title="Como carrego o cart<72>o de jogador?">Como carrego o cart<72>o de jogador?</a>
</form>
</li>
<li>
<form id="frmFooterContent_8" name="frmContent_8" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="8.0"/>
<a href="javascript:document.forms['frmFooterContent_8'].submit();" title="O que <20> o Registo Autom<6F>tico de Apostas?">O que <20> o Registo Autom<6F>tico de Apostas?</a>
</form>
</li>
<li>
<a href="/web/AjudaFAQ/" title="FAQ's">FAQ's</a>
</li>
<li>
<form id="frmAjudaContactos" name="frmAjudaContactos" method="post" action="/web/AjudaContactos/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<a href="javascript:document.forms['frmAjudaContactos'].submit();" title="Contactos">Contactos</a>
</form>
</li>
</ul>
</div>
</li>
<li class="title"><span>Not<EFBFBD>cias e Informa<6D><61>es</span>
<div class="borderLeftGray">
<ul class="contentLinks">
<li>
<form id="frmFooterContent_1" name="frmContent_1" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="1"/>
<input type="hidden" name="contentId" id="contentId" value="1"/>
<a href="javascript:document.forms['frmFooterContent_1'].submit();" title="Condi<64><69>es do Cart<72>o de Jogador">Condi<EFBFBD><EFBFBD>es do Cart<72>o de Jogador</a>
</form>
</li>
<li><a href="/web/SCInstitucional/" title="Institucional">Institucional</a></li>
<li><a href="/web/SCNoticias/" title="Comunicados e Informa<6D><61>es">Comunicados e Informa<6D><61>es</a></li>
<li><a href="/web/SCMediador/" title="Pontos de Venda">Pontos de Venda</a></li>
</ul>
</div>
</li>
<li class="bgLast">
<p><EFBFBD>ltimo</p>
<span> elemento</span>
</li>
</ul>
<a href="/web/SCRss/" class="rssButton">Rss</a>
</div>
<div class="bottom">
<div class="contentLeft">
<a href="http://www.scml.pt" class="logoSantaCasa">Logo Santa Casa</a> <span>Proibido jogar a menores de 18 anos</span>
<a target="_blank" href="http://jogoresponsavel.jogossantacasa.pt/" class="logoJogoResponsavel">Logo Jogo Respons<6E>vel</a>
</div>
<div class="contentRight">
<span>
<ul>
<li>
<form id="frmFooterPrivacyContent" name="frmFooterPrivacyContent" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contentId" id="contentId" value="4523"/>
<a href="javascript:document.forms['frmFooterPrivacyContent'].submit();" title="Pol<6F>tica de Privacidade">Pol<EFBFBD>tica de Privacidade</a>
</form>
</li>
<li>
<form id="frmFooterContent_1.0" name="frmContent_1.0" method="post" action="/web/AjudaComoApostar/">
<input type="hidden" name="contactos" id="contactos" value="0"/>
<input type="hidden" name="contentId" id="contentId" value="1.0"/>
<a href="javascript:document.forms['frmFooterContent_1.0'].submit();" title="Termos e Condi<64><69>es do Cart<72>o de Jogador">Termos e Condi<64><69>es do Cart<72>o de Jogador</a>
</form>
</li>
<li>
<form id="frmContactos" name="frmContactos" method="post" action="/web/AjudaContactos/">
<input type="hidden" name="contactos" id="contactos" value="0"/>
<a href="javascript:document.forms['frmContactos'].submit();" title="Contactos">Contactos</a>
</form>
</li>
<li><a href="/web/AjudaMapa/" title="Mapa Site">Mapa Site</a></li>
</ul>
</span>
<span>Os conte<74>dos deste site, publicados a partir de 1 de janeiro de 2012, cumprem as regras do Acordo Ortogr<67>fico.</span>
<span>Produzido por SCML &copy; 2012. Todos os direitos reservados.</span>
</div>
</div>
</div>
</div>
</body>
</html>

24
package.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "jogos-santa-casa-api",
"version": "1.0.0",
"description": "A REST API to check the keys for the latest draws of Jogos Santacasa.",
"main": "dist/server/app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon ."
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@types/node": "^17.0.40",
"axios": "^0.27.2",
"cheerio": "^1.0.0-rc.11",
"express": "^4.18.1"
},
"devDependencies": {
"@types/express": "^4.17.13",
"nodemon": "^2.0.16",
"typescript": "^4.7.3"
}
}

111
src/scrapers/euromilhoes.ts Normal file
View File

@ -0,0 +1,111 @@
import axios from "axios";
import * as cheerio from "cheerio";
import * as fs from "fs";
import handlePromise from "../util/promiseHandler";
const EUROMILHOES_URL =
"https://www.jogossantacasa.pt/web/SCCartazResult/euroMilhoes";
type Key = {
numbers: string;
stars: string;
};
type Keys = {
sortedKey: Key;
orderedKey: Key;
};
type Prize = {
placement: string;
requiredNumberGuesses: string;
requiredStarGuesses: string;
winners: {
portugal: string;
total: string;
};
};
type EurmomilhoesData = {
keys: Keys;
prizes: Prize[];
};
/** */
function storeData() {}
/** */
async function scrapeWebpage() {
return new Promise(function (resolve, reject) {
/* const [resolved, result] = await handlePromise(axios.get(EUROMILHOES_URL));
if (resolved == false) {
console.error(result);
// Return no results
console.error(result);
return;
}
fs.writeFileSync("index.html", result.data); */
const result = fs.readFileSync("index.html");
const $ = cheerio.load(result);
const keyLists = $(".betMiddle.twocol.regPad ul li");
const key = keyLists.first().text().trim();
let splitKey = key.split("+");
const orderedKey = keyLists.eq(1).text();
splitKey = orderedKey.split("+");
const prizesDiv = $(".stripped.betMiddle.customfiveCol.regPad ul");
const prizes: Prize[] = [];
prizesDiv.each(function (i, elem) {
const column = $(this).find("li");
const rightGuessesRow = column.eq(1).text();
// TODO: Learn Regex and use it here
const rightGuessesSplit = rightGuessesRow.split("+");
const rightnumbers = rightGuessesSplit[0].split(" ")[0];
const rightStars = rightGuessesSplit[1].split(" ")[1];
const portugalWinners = column.eq(2).text();
const totalWinners = column.eq(3).text();
const prize = {
placement: (i + 1).toString(),
requiredNumberGuesses: rightnumbers,
requiredStarGuesses: rightStars,
winners: {
portugal: portugalWinners,
total: totalWinners,
},
};
prizes.push(prize);
});
const data: EurmomilhoesData = {
keys: {
orderedKey: { numbers: "0", stars: "0" },
sortedKey: { numbers: "0", stars: "0" },
},
prizes: prizes,
};
resolve(data);
});
}
export default scrapeWebpage;

27
src/server/app.ts Normal file
View File

@ -0,0 +1,27 @@
import express from "express";
import apiRouter from "./routes/apiRouter";
const app = express();
const PORT = 8080;
// IDEAS:
// Web scrape the data using a scraper
// Store data in DB for ~1h
// When a request is made
// - Return data from the DB if the data is fresh
// - Update DB and return new data
//
// OR
// Automatically fetch new data every 1h?
app.use("/api", apiRouter);
app.get("/", (req, res) => {
res.send("Hello, world!");
});
app.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});

View File

@ -0,0 +1,18 @@
import { Router } from "express";
import handlePromise from "../../../util/promiseHandler";
import scrapeWebpage from "../../../scrapers/euromilhoes";
const euromilhoesRouter = Router();
euromilhoesRouter.get("/", async (req, res) => {
const [resolved, result] = await handlePromise(scrapeWebpage());
if (resolved == true) {
res.json(result);
} else {
res.sendStatus(500);
}
});
export default euromilhoesRouter;

View File

@ -0,0 +1,9 @@
import { Router } from "express";
import euromilhoesRouter from "./api/euromilhoes";
const apiRouter = Router();
// TODO: Find a way to dynamilly create routes using files in routes/api
apiRouter.use("/euromilhoes", euromilhoesRouter);
export default apiRouter;

View File

@ -0,0 +1,16 @@
/**
* Util function to allow one liners when dealing with promises. Credit to [fireship.io](https://https://youtu.be/ITogH7lJTyE)
* @param promise The promise to be resolved
* @returns
*/
async function handlePromise(promise: Promise<any>) {
try {
const result = await promise;
return [true, result];
} catch (reason) {
return [false, reason];
}
}
export default handlePromise;

101
tsconfig.json Normal file
View File

@ -0,0 +1,101 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Projects */
// "incremental": true, /* Enable incremental compilation */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
/* Modules */
"module": "commonjs" /* Specify what module code is generated. */,
"rootDir": "./src" /* Specify the root folder within your source files. */,
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "resolveJsonModule": true, /* Enable importing .json files */
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
"outDir": "./dist" /* Specify an output folder for all emitted files. */,
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
/* Type Checking */
"strict": true /* Enable all strict type-checking options. */,
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
// "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}

1392
yarn.lock Normal file

File diff suppressed because it is too large Load Diff