refactor: easier comparables, fix audits (#614)

This commit is contained in:
Jef LeCompte
2020-10-29 16:27:09 -04:00
committed by GitHub
parent e5b0d7983b
commit 13edbf311e
9 changed files with 12636 additions and 4213 deletions
+1 -1
View File
@@ -1 +1 @@
14.13.1 15.0.1
+1 -1
View File
@@ -44,7 +44,7 @@ You do not need any computer skills, smarts, or anything of that nature. You are
#### Native installation #### Native installation
- [Node.js 14](https://nodejs.org/en/) - [Node.js 15](https://nodejs.org/en/)
- [git](https://git-scm.com/) - [git](https://git-scm.com/)
- Clone this project `git clone https://github.com/jef/nvidia-snatcher.git` - Clone this project `git clone https://github.com/jef/nvidia-snatcher.git`
- Run `npm install` - Run `npm install`
+12563 -4169
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -3,7 +3,8 @@
"description": "🔮 For all your Nvidia needs", "description": "🔮 For all your Nvidia needs",
"main": "src/index.ts", "main": "src/index.ts",
"scripts": { "scripts": {
"build": "rimraf ./build && tsc", "all": "npm run build && npm run lint",
"build": "tsc",
"lint": "xo", "lint": "xo",
"lint:fix": "xo --fix", "lint:fix": "xo --fix",
"start": "npm run build && node build/index.js", "start": "npm run build && node build/index.js",
@@ -31,7 +32,7 @@
"messaging-api-telegram": "^1.0.1", "messaging-api-telegram": "^1.0.1",
"mqtt": "^4.2.3", "mqtt": "^4.2.3",
"node-notifier": "^8.0.0", "node-notifier": "^8.0.0",
"node-pagerduty": "^1.3.4", "node-pagerduty": "^1.2.0",
"nodemailer": "^6.4.14", "nodemailer": "^6.4.14",
"open": "^7.3.0", "open": "^7.3.0",
"play-sound": "^1.1.3", "play-sound": "^1.1.3",
@@ -58,7 +59,6 @@
"@types/twitter": "^1.7.0", "@types/twitter": "^1.7.0",
"husky": "^4.3.0", "husky": "^4.3.0",
"nodemon": "^2.0.6", "nodemon": "^2.0.6",
"rimraf": "^3.0.2",
"ts-node": "^9.0.0", "ts-node": "^9.0.0",
"typescript": "^4.0.5", "typescript": "^4.0.5",
"webpack": "^5.3.0", "webpack": "^5.3.0",
@@ -73,7 +73,7 @@
}, },
"husky": { "husky": {
"hooks": { "hooks": {
"pre-commit": "npm run lint" "pre-commit": "npm run all"
} }
} }
} }
+2 -2
View File
@@ -7,7 +7,7 @@ import {usingResponse} from '../util';
function addNewLinks(store: Store, links: Link[], series: Series) { function addNewLinks(store: Store, links: Link[], series: Series) {
if (links.length === 0) { if (links.length === 0) {
logger.warn(Print.message('NO STORE LINKS FOUND', series, store, true)); logger.debug(Print.message('NO STORE LINKS FOUND', series, store, true));
return; return;
} }
@@ -19,7 +19,7 @@ function addNewLinks(store: Store, links: Link[], series: Series) {
return; return;
} }
logger.info(Print.message(`FOUND ${newLinks.length} STORE LINKS`, series, store, true)); logger.debug(Print.message(`FOUND ${newLinks.length} STORE LINKS`, series, store, true));
logger.debug(JSON.stringify(newLinks, null, 2)); logger.debug(JSON.stringify(newLinks, null, 2));
store.links = store.links.concat(newLinks); store.links = store.links.concat(newLinks);
+2 -2
View File
@@ -1,5 +1,5 @@
import {Browser, Page, Response} from 'puppeteer'; import {Browser, Page, Response} from 'puppeteer';
import {Link, Store} from './model'; import {Link, Store, getStores} from './model';
import {Print, logger} from '../logger'; import {Print, logger} from '../logger';
import {Selector, cardPrice, pageIncludesLabels} from './includes-labels'; import {Selector, cardPrice, pageIncludesLabels} from './includes-labels';
import {closePage, delay, getRandomUserAgent, getSleepTime, isStatusCodeInRange} from '../util'; import {closePage, delay, getRandomUserAgent, getSleepTime, isStatusCodeInRange} from '../util';
@@ -24,7 +24,7 @@ const linkBuilderLastRunTimes: Record<string, number> = {};
* @param store Vendor of graphics cards. * @param store Vendor of graphics cards.
*/ */
async function lookup(browser: Browser, store: Store) { async function lookup(browser: Browser, store: Store) {
if (config.store.stores.length > 0 && !config.store.stores.find(foundStore => foundStore.name === store.name)) { if (!getStores().has(store.name)) {
return; return;
} }
+58 -33
View File
@@ -44,6 +44,7 @@ import {ProshopDE} from './proshop-de';
import {ProshopDK} from './proshop-dk'; import {ProshopDK} from './proshop-dk';
import {Saturn} from './saturn'; import {Saturn} from './saturn';
import {Scan} from './scan'; import {Scan} from './scan';
import {Store} from './store';
import {Very} from './very'; import {Very} from './very';
import {Zotac} from './zotac'; import {Zotac} from './zotac';
import {logger} from '../../logger'; import {logger} from '../../logger';
@@ -99,35 +100,73 @@ export const storeList = new Map([
]); ]);
const brands = new Set(); const brands = new Set();
const series = new Set();
const models = new Set(); const models = new Set();
const series = new Set();
const stores = new Map();
for (const storeData of config.store.stores) { function filterBrandsSeriesModels(stores: Map<string, Store>) {
const store = storeList.get(storeData.name); brands.clear();
if (store) { series.clear();
store.minPageSleep = storeData.minPageSleep; models.clear();
store.maxPageSleep = storeData.maxPageSleep;
} else { for (const store of stores.values()) {
logger.warn(`No store named ${storeData.name}, skipping.`); for (const link of store.links) {
brands.add(link.brand);
series.add(link.series);
models.add(link.model);
}
if (store.minPageSleep === undefined) {
store.minPageSleep = defaultStoreData.minPageSleep;
}
if (store.maxPageSleep === undefined) {
store.maxPageSleep = defaultStoreData.maxPageSleep;
}
} }
} }
for (const store of storeList.values()) { function printConfig() {
for (const link of store.links) { if (config.store.stores.length > 0) {
brands.add(link.brand); logger.info(` selected stores: ${config.store.stores.map(store => store.name).join(', ')}`);
series.add(link.series);
models.add(link.model);
} }
if (store.minPageSleep === undefined) { if (config.store.showOnlyBrands.length > 0) {
store.minPageSleep = defaultStoreData.minPageSleep; logger.info(` selected brands: ${config.store.showOnlyBrands.join(', ')}`);
} }
if (store.maxPageSleep === undefined) { if (config.store.showOnlyModels.length > 0) {
store.maxPageSleep = defaultStoreData.maxPageSleep; logger.info(` selected models: ${config.store.showOnlyModels.map(entry => {
return entry.series ? entry.name + ' (' + entry.series + ')' : entry.name;
}).join(', ')}`);
}
if (config.store.showOnlySeries.length > 0) {
logger.info(` selected series: ${config.store.showOnlySeries.join(', ')}`);
} }
} }
export function updateStores() {
stores.clear();
for (const storeData of config.store.stores) {
const store = storeList.get(storeData.name);
if (store) {
stores.set(storeData.name, store);
store.minPageSleep = storeData.minPageSleep;
store.maxPageSleep = storeData.maxPageSleep;
} else {
logger.warn(`No store named ${storeData.name}, skipping.`);
}
}
filterBrandsSeriesModels(stores);
printConfig();
}
updateStores();
export function getAllBrands() { export function getAllBrands() {
return Array.from(brands); return Array.from(brands);
} }
@@ -140,22 +179,8 @@ export function getAllModels() {
return Array.from(models); return Array.from(models);
} }
if (config.store.stores.length > 0) { export function getStores() {
logger.info(` selected stores: ${config.store.stores.map(store => store.name).join(', ')}`); return stores;
}
if (config.store.showOnlyBrands.length > 0) {
logger.info(` selected brands: ${config.store.showOnlyBrands.join(', ')}`);
}
if (config.store.showOnlyModels.length > 0) {
logger.info(` selected models: ${config.store.showOnlyModels.map(entry => {
return entry.series ? entry.name + ' (' + entry.series + ')' : entry.name;
}).join(', ')}`);
}
if (config.store.showOnlySeries.length > 0) {
logger.info(` selected series: ${config.store.showOnlySeries.join(', ')}`);
} }
export * from './store'; export * from './store';
+2 -1
View File
@@ -1,7 +1,7 @@
import {IncomingMessage, Server, ServerResponse, createServer} from 'http'; import {IncomingMessage, Server, ServerResponse, createServer} from 'http';
import {config, setConfig} from '../config'; import {config, setConfig} from '../config';
import {createReadStream, readdir} from 'fs'; import {createReadStream, readdir} from 'fs';
import {getAllBrands, getAllModels, getAllSeries, storeList} from '../store/model'; import {getAllBrands, getAllModels, getAllSeries, storeList, updateStores} from '../store/model';
import {join, normalize} from 'path'; import {join, normalize} from 'path';
const approot = join(__dirname, '../../'); const approot = join(__dirname, '../../');
@@ -75,6 +75,7 @@ function handleAPI(request: IncomingMessage, response: ServerResponse, urlCompon
// We ignore errors, client just sent wrong data... // We ignore errors, client just sent wrong data...
try { try {
setConfig(JSON.parse(data.join(''))); setConfig(JSON.parse(data.join('')));
updateStores();
} catch { } } catch { }
sendConfig(response); sendConfig(response);
+3
View File
@@ -46,6 +46,9 @@
if (subfield) { if (subfield) {
obj = {}; obj = {};
obj[subfield] = htmlElement.value; obj[subfield] = htmlElement.value;
if (id === 'modelList') {
obj['series'] = '';
}
} else { } else {
obj = htmlElement.value obj = htmlElement.value
} }