imm-noc
Version:
A tool for noc inquiry
143 lines (142 loc) • 5.89 kB
JavaScript
;
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;