Initial catalog maker baseline
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,82 @@
|
||||
import { spawn } from "node:child_process";
|
||||
import { Builder } from "selenium-webdriver";
|
||||
import firefox from "selenium-webdriver/firefox.js";
|
||||
import { start } from "geckodriver";
|
||||
|
||||
const FIREFOX_PATHS = [
|
||||
"C:\\Program Files\\Mozilla Firefox\\firefox.exe",
|
||||
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
|
||||
];
|
||||
|
||||
export function openInFirefox(url) {
|
||||
const firefoxPath = FIREFOX_PATHS.find((candidate) => candidate);
|
||||
if (!firefoxPath) throw new Error("Firefox executable was not found.");
|
||||
|
||||
const process = spawn(firefoxPath, [url], {
|
||||
detached: true,
|
||||
stdio: "ignore",
|
||||
windowsHide: true,
|
||||
});
|
||||
process.unref();
|
||||
}
|
||||
|
||||
export async function searchInFirefox({ url, headless = false, waitAfterLoadMs = 3000 }) {
|
||||
const firefoxPath = FIREFOX_PATHS.find((candidate) => candidate);
|
||||
const port = 4444;
|
||||
const geckodriver = await start({ port, binary: firefoxPath, log: "error" });
|
||||
let driver;
|
||||
|
||||
try {
|
||||
await waitForWebDriver(port);
|
||||
const options = new firefox.Options();
|
||||
if (firefoxPath) options.setBinary(firefoxPath);
|
||||
if (headless) options.addArguments("-headless");
|
||||
|
||||
driver = await new Builder()
|
||||
.forBrowser("firefox")
|
||||
.setFirefoxOptions(options)
|
||||
.usingServer(`http://127.0.0.1:${port}`)
|
||||
.build();
|
||||
|
||||
await driver.get(url);
|
||||
await driver.sleep(Math.max(1000, Number(waitAfterLoadMs) || 3000));
|
||||
|
||||
const [currentUrl, title, pageSource] = await Promise.all([
|
||||
driver.getCurrentUrl(),
|
||||
driver.getTitle(),
|
||||
driver.getPageSource(),
|
||||
]);
|
||||
const cleanText = stripHtml(pageSource).slice(0, 1200);
|
||||
const failed = /something has gone wrong|reference id/i.test(cleanText);
|
||||
|
||||
return { ok: !failed, url: currentUrl, title, text: cleanText, pageSource };
|
||||
} finally {
|
||||
if (driver) await driver.quit().catch(() => {});
|
||||
geckodriver.kill();
|
||||
}
|
||||
}
|
||||
|
||||
async function waitForWebDriver(port) {
|
||||
const deadline = Date.now() + 10000;
|
||||
while (Date.now() < deadline) {
|
||||
try {
|
||||
const response = await fetch(`http://127.0.0.1:${port}/status`);
|
||||
if (response.ok) return;
|
||||
} catch {
|
||||
// Geckodriver needs a short moment to open its local port.
|
||||
}
|
||||
await new Promise((resolve) => setTimeout(resolve, 150));
|
||||
}
|
||||
throw new Error("Firefox WebDriver did not start.");
|
||||
}
|
||||
|
||||
function stripHtml(value) {
|
||||
return String(value ?? "")
|
||||
.replace(/<script[\s\S]*?<\/script>/gi, " ")
|
||||
.replace(/<style[\s\S]*?<\/style>/gi, " ")
|
||||
.replace(/<[^>]+>/g, " ")
|
||||
.replace(/ /gi, " ")
|
||||
.replace(/&/gi, "&")
|
||||
.replace(/\s+/g, " ")
|
||||
.trim();
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { queryEndpoint } from "../endpoint/endpoint-client.js";
|
||||
import { catalogMakerSql } from "../sql/catalog-maker.js";
|
||||
|
||||
export async function listLanguages(config) {
|
||||
const result = await queryEndpoint(config, catalogMakerSql.languages);
|
||||
return {
|
||||
...result,
|
||||
items: result.items.map((row) => ({
|
||||
id: row.id_lang,
|
||||
name: row.name,
|
||||
isoCode: row.iso_code,
|
||||
})),
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { queryEndpoint } from "../endpoint/endpoint-client.js";
|
||||
import { catalogMakerSql } from "../sql/catalog-maker.js";
|
||||
|
||||
export async function listManufacturers(config) {
|
||||
const result = await queryEndpoint(config, catalogMakerSql.manufacturers);
|
||||
return {
|
||||
...result,
|
||||
items: result.items.map((row) => ({
|
||||
id: row.id_manufacturer,
|
||||
name: row.name,
|
||||
})),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user