mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-22 15:12:23 +03:00
⭐4 — Suporte de backend nativo Bun + Dockerfile.bun multi-stage + fallback dinâmico de driver SQLite (better-sqlite3 prioritário sob Bun, bun:sqlite fallback; Node preservado) + correção de estabilidade do DAST CI smoke.
Validado a fundo (worktree board sobre tip): bun-support 4/4, typecheck:core limpo, dashboard-typecheck OK (220 dentro do baseline), open-sse-typecheck OK (5 pré-existentes), gate de runtime OK sob Node, changelog-integrity OK, file-size/complexity/cognitive/dead-code OK. Verificado que o driver preserva a cadeia Node/falback conforme AGENTS.md; teste bun-support presente. Baselines de typecheck removidos são ratchet honesto (erros não existem mais).
OBS: destravei 2 base-reds do tip neste turno (push direto 7ffa3ef): movi o changelog fragment da #11050 da seção inválida breaking/ para fixes/, e rebaselinei AddApiKeyModal 1067->1073 (crescimento da #11056). Sem isso a #11039 e o resto da fila ficariam vermelhos.
97 lines
3.4 KiB
JavaScript
97 lines
3.4 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
export const SECURE_NODE_LINES = Object.freeze([
|
|
Object.freeze({ major: 22, minor: 22, patch: 2 }),
|
|
Object.freeze({ major: 24, minor: 0, patch: 0 }),
|
|
Object.freeze({ major: 25, minor: 0, patch: 0 }),
|
|
Object.freeze({ major: 26, minor: 0, patch: 0 }),
|
|
]);
|
|
|
|
export const RECOMMENDED_NODE_VERSION = "24.14.1";
|
|
export const SUPPORTED_NODE_RANGE = ">=22.22.2 <23 || >=24.0.0 <27";
|
|
export const SUPPORTED_NODE_DISPLAY =
|
|
"Node.js 22.22.2+ (22.x LTS), 24.0.0+ (24.x LTS), 25.0.0+ (25.x), or 26.0.0+ (26.x)";
|
|
|
|
function formatVersion(version) {
|
|
return `${version.major}.${version.minor}.${version.patch}`;
|
|
}
|
|
|
|
export function parseNodeVersion(version = process.versions.node) {
|
|
const rawInput = String(version || process.versions.node || "0.0.0").trim();
|
|
const normalized = rawInput.replace(/^v/i, "");
|
|
const parts = normalized.split(".");
|
|
const major = Number.parseInt(parts[0] || "0", 10);
|
|
const minor = Number.parseInt(parts[1] || "0", 10);
|
|
const patch = Number.parseInt(parts[2] || "0", 10);
|
|
|
|
return {
|
|
raw: normalized ? `v${normalized}` : "v0.0.0",
|
|
normalized: normalized || "0.0.0",
|
|
major: Number.isFinite(major) ? major : 0,
|
|
minor: Number.isFinite(minor) ? minor : 0,
|
|
patch: Number.isFinite(patch) ? patch : 0,
|
|
};
|
|
}
|
|
|
|
export function compareNodeVersions(a, b) {
|
|
if (a.major !== b.major) return a.major - b.major;
|
|
if (a.minor !== b.minor) return a.minor - b.minor;
|
|
return a.patch - b.patch;
|
|
}
|
|
|
|
export function getSecureFloorForMajor(major) {
|
|
return SECURE_NODE_LINES.find((line) => line.major === major) || null;
|
|
}
|
|
|
|
export function getNodeRuntimeSupport(version = process.versions.node) {
|
|
if (process.versions.bun) {
|
|
return {
|
|
nodeVersion: `bun-${process.versions.bun} (Node.js API ${version})`,
|
|
nodeCompatible: true,
|
|
reason: "supported-bun",
|
|
supportedRange: SUPPORTED_NODE_RANGE + " || Bun >=1.1.0",
|
|
supportedDisplay: SUPPORTED_NODE_DISPLAY + ", or Bun 1.1+",
|
|
recommendedVersion: `v${RECOMMENDED_NODE_VERSION}`,
|
|
minimumSecureVersion: null,
|
|
};
|
|
}
|
|
|
|
const parsed = parseNodeVersion(version);
|
|
const secureFloor = getSecureFloorForMajor(parsed.major);
|
|
const nodeCompatible = secureFloor ? compareNodeVersions(parsed, secureFloor) >= 0 : false;
|
|
|
|
let reason = "unsupported-major";
|
|
if (nodeCompatible) {
|
|
reason = "supported";
|
|
} else if (secureFloor) {
|
|
reason = "below-security-floor";
|
|
} else if (parsed.major >= 27) {
|
|
reason = "unreleased-major";
|
|
}
|
|
|
|
return {
|
|
nodeVersion: parsed.raw,
|
|
nodeCompatible,
|
|
reason,
|
|
supportedRange: SUPPORTED_NODE_RANGE,
|
|
supportedDisplay: SUPPORTED_NODE_DISPLAY,
|
|
recommendedVersion: `v${RECOMMENDED_NODE_VERSION}`,
|
|
minimumSecureVersion: secureFloor ? `v${formatVersion(secureFloor)}` : null,
|
|
};
|
|
}
|
|
|
|
export function getNodeRuntimeWarning(version = process.versions.node) {
|
|
const support = getNodeRuntimeSupport(version);
|
|
if (support.nodeCompatible) return null;
|
|
|
|
if (support.reason === "below-security-floor" && support.minimumSecureVersion) {
|
|
return `Node.js ${support.nodeVersion} is below the patched minimum ${support.minimumSecureVersion} for this LTS line.`;
|
|
}
|
|
|
|
if (support.reason === "unreleased-major") {
|
|
return `Node.js ${support.nodeVersion} is outside the supported LTS lines. OmniRoute currently supports Node.js 22.x, 24.x, 25.x, and 26.x.`;
|
|
}
|
|
|
|
return `Node.js ${support.nodeVersion} is outside OmniRoute's approved secure runtime policy.`;
|
|
}
|