UNPKG

imm-noc

Version:

A tool for noc inquiry

143 lines (142 loc) 5.89 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNocOutlookSalary = exports.mergeOutlookSalary = exports.Salary = exports.Outlook = void 0; const goto_1 = require("./goto"); class Outlook { constructor(noc, page) { this.noc = noc; this.page = page; } // ".prov-container" ".details" fetch(prov_area_class) { return __awaiter(this, void 0, void 0, function* () { return yield this.page.evaluate((prov_area_class) => { const provs_areas = document.querySelectorAll(prov_area_class); var prov_area_outlooks = []; const outlook_map = { "Undetermined": 0, "Limited": 1, "Fair": 2, "Good": 3 }; for (const [index, prov_area] of provs_areas.entries()) { if (index == 0) continue; var province = prov_area.querySelector(".pull-left").textContent; var outlook = prov_area.querySelector(".outlooknote").textContent; prov_area_outlooks.push({ region: province, outlook: outlook_map[outlook] }); } return prov_area_outlooks; }, prov_area_class); }); } get() { return __awaiter(this, void 0, void 0, function* () { const outlook_args = { page: this.page, url: "https://www.jobbank.gc.ca/trend-analysis/search-job-outlooks", input_box: "#ec-outlook\\:occupationInput", search_button: "#searchOutlookOccupationSubmit", noc: this.noc }; const go = new goto_1.Go(outlook_args); yield go.go(); return { province: yield this.fetch(".prov-container"), area: yield this.fetch(".details") }; }); } } exports.Outlook = Outlook; // Salary class class Salary { constructor(noc, page) { this.noc = noc; this.page = page; } fetch() { return __awaiter(this, void 0, void 0, function* () { const data = yield this.page.$$eval('table tr', rows => rows.map((row, index) => { if (index != 0 && index != 1) { return { region: row.cells[0].innerText, lowest: row.cells[1].innerText, median: row.cells[2].innerText, highest: row.cells[3].innerText, }; } })); return data; }); } get() { return __awaiter(this, void 0, void 0, function* () { const wage_args = { page: this.page, url: "https://www.jobbank.gc.ca/trend-analysis/search-wages", input_box: "#ec-wages\\:wagesInput", search_button: "#searchWagesOccupationSubmit", noc: this.noc }; const go = new goto_1.Go(wage_args); yield go.go(); var all_salaries = yield this.fetch(); all_salaries = all_salaries.filter(element => element != null); const canada_salaries = all_salaries.shift(); // pop up the first one, which is Canada const provincial_salaries = all_salaries.filter((element, index) => { return [0, 5, 6, 12, 18, 36, 48, 57, 64, 73, 82, 83, 84].includes(Number(index)); }); const regional_salaries = all_salaries.filter((element, index) => { return ![0, 5, 6, 12, 18, 36, 48, 57, 64, 73, 82, 83, 84].includes(Number(index)); }); return { canada: canada_salaries, province: provincial_salaries, area: regional_salaries }; }); } } exports.Salary = Salary; // Merge outlook and salary function mergeOutlookSalary(outlooks, salaries) { var outlook_salary_list = []; for (var i = 0; i < outlooks.length; i++) { outlook_salary_list.push(Object.assign(Object.assign({}, outlooks[i]), salaries[i])); } return outlook_salary_list; } exports.mergeOutlookSalary = mergeOutlookSalary; // get a noc's combined outlook and salary data function getNocOutlookSalary(noc, page) { return __awaiter(this, void 0, void 0, function* () { const ol = new Outlook(noc, page); const outlooks = yield ol.get(); // get salary data based on noc code const sl = new Salary(noc, page); const salaries = yield sl.get(); const prov_outlook_salary = mergeOutlookSalary(outlooks.province, salaries.province); const regional_outlook_salary = mergeOutlookSalary(outlooks.area, salaries.area); return { [noc]: { canada: salaries.canada, province: prov_outlook_salary, region: regional_outlook_salary } }; }); } exports.getNocOutlookSalary = getNocOutlookSalary;