Files
Alexandre 2cb633e99d Initial commit: offline flight planner (Rust, PFPX-class)
Clean-room reproduction of PFPX: route generation + IFPS validation + OFP.
Independent design — official ICAO/EUROCONTROL data only (RAD, FRA points,
IFPUV oracle); no community FPL sources.

Workspace crates: core (routing/discover/rad/navdata/perf/export),
cli, server, rad (Annex parser), gui (Tauri v2 + React + MapLibre).
Route discovery: oracle-in-the-loop repair against Eurocontrol IFPUV.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:10:35 +02:00

39 lines
1.4 KiB
JavaScript

// Explore the public Eurocontrol IFPUV page to find the route input / validate
// button / result area. Run: node explore.mjs
import { chromium } from "playwright";
const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/";
const b = await chromium.launch({ headless: true });
const ctx = await b.newContext({ viewport: { width: 1600, height: 1000 } });
const page = await ctx.newPage();
try {
await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 });
await page.waitForTimeout(9000); // let the GWT app render
console.log("TITLE:", await page.title());
console.log("URL :", page.url());
const dump = await page.$$eval(
"input, textarea, button, a, span, div[role], [class*='gwt'], [class*='Button']",
(nodes) =>
nodes
.map((n) => ({
tag: n.tagName,
type: n.getAttribute("type") || "",
id: n.id || "",
cls: (n.className && typeof n.className === "string" ? n.className : "").slice(0, 40),
text: (n.innerText || n.value || "").trim().slice(0, 50),
}))
.filter((e) => e.text && e.text.length > 1)
.slice(0, 120),
);
console.log(JSON.stringify(dump, null, 0));
await page.screenshot({ path: "ifpuv.png", fullPage: true });
console.log("screenshot -> ifpuv.png");
} catch (e) {
console.error("ERR:", e.message);
} finally {
await b.close();
}