rsshub
Version:
Make RSS Great Again!
116 lines (114 loc) • 3.95 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { load } from "cheerio";
//#region lib/routes/layoffs/index.ts
const ROW_COUNT = 100;
const WEBSITE_URL = "https://layoffs.fyi";
const ENTRY_URL = "https://airtable.com/embed/shrqYt5kSqMzHV9R5/tbl8c8kanuNB6bPYr";
const AIRTABLE_HOST = "https://airtable.com";
/**
* getMapping can convert either an array or an object
* of a specific structure into a Map, where the key is
* the name and the value is the Id. It will only parse
* entries with 'name' and 'id' in it
*
* Inputs:
* obj = [{name: 'Apple', id: 1}, {name: 'Peach', id: 2}]
* Returns:
* [{1: 'Apple', 2: 'Peach'}, {Apple: 1, Peach: 2}]
*
* Inputs:
* obj = {Apple: {name: 'Apple', id: 1}, Peach: {name: 'Peach', id: 2}}
* Returns:
* [{1: 'Apple', 2: 'Peach'}, {Apple: 1, Peach: 2}]
*/
const getMappings = function(obj) {
const mapping = /* @__PURE__ */ new Map();
const reverseMapping = /* @__PURE__ */ new Map();
for (const key in obj) if ("name" in obj[key] && "id" in obj[key]) {
reverseMapping.set(obj[key].name, obj[key].id);
mapping.set(obj[key].id, obj[key].name);
}
return [mapping, reverseMapping];
};
const route = {
path: "/",
radar: [{
source: ["layoffs.fyi/"],
target: ""
}],
name: "Unknown",
maintainers: ["BrandNewLifeJackie26"],
handler,
url: "layoffs.fyi/"
};
async function handler() {
const headers = {
"x-airtable-application-id": "app1PaujS9zxVGUZ4",
"x-airtable-inter-service-client": "webClient",
"x-requested-with": "XMLHttpRequest",
"x-time-zone": "America/Los_Angeles"
};
let dataSourceUrl = await cache_default.get(ENTRY_URL);
let cacheInvalid = false;
let response;
if (dataSourceUrl) try {
response = await got_default({
method: "get",
url: dataSourceUrl,
headers
});
if (response.statusCode >= 400) cacheInvalid = true;
} catch {
cacheInvalid = true;
}
else cacheInvalid = true;
if (cacheInvalid) {
dataSourceUrl = AIRTABLE_HOST + load((await got_default({
method: "get",
url: ENTRY_URL
})).data)("script").text().match(/urlWithParams: "(.*?)"/)[1].replaceAll(String.raw`\u002F`, "/");
cache_default.set(ENTRY_URL, dataSourceUrl);
response = await got_default({
method: "get",
url: dataSourceUrl,
headers
});
}
const table = response.data.data.table;
const columnReverseMapping = getMappings(table.columns)[1];
const companyColumnId = columnReverseMapping.get("Company");
const dateAddedColumnId = columnReverseMapping.get("Date Added");
const numOfLaidOffColumnId = columnReverseMapping.get("# Laid Off");
const sourceColumnId = columnReverseMapping.get("Source");
const countryColumnId = columnReverseMapping.get("Country");
const countryMapping = getMappings(table.columns.find((col) => col.name === "Country").typeOptions.choices)[0];
return {
title: "Tech layoff data feed from layoffs.fyi",
link: WEBSITE_URL,
description: "This feed gets tech layoff data from layoffs.fyi and display them in a user friendly way",
item: table.rows.slice(0, ROW_COUNT).map((row) => {
const rowContent = row.cellValuesByColumnId;
const company = rowContent[companyColumnId];
const dateAdded = parseDate(rowContent[dateAddedColumnId]);
const source = rowContent[sourceColumnId];
const numOfLaidOff = rowContent[numOfLaidOffColumnId] || "some";
const country = countryMapping.get(rowContent[countryColumnId]);
return {
title: `${company} Layoffs Happening!`,
description: `${company} lays off ${numOfLaidOff} employees in ${country}. For more details, please visit ${source}.`,
pubDate: dateAdded,
link: source
};
})
};
}
//#endregion
export { route };