openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
84 lines (83 loc) • 3.7 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import { d as normalizeStringEntries } from "./string-normalization-DsCfAx8q.js";
import { prerelease, satisfies } from "semver";
//#region src/plugins/package-compat.ts
function normalizePartialComparableVersion(version) {
const trimmed = version.trim();
return /^[vV]?[0-9]+\.[0-9]+$/.test(trimmed) ? {
version: `${trimmed}.0`,
isPartial: true
} : {
version: trimmed,
isPartial: false
};
}
function shouldPreservePluginApiPrereleaseFloor(target) {
return Boolean(prerelease(normalizePartialComparableVersion(target).version));
}
function normalizePluginApiVersionForComparator(version, target) {
const normalizedCorrection = normalizeOpenClawNumericCorrectionForPluginApi(version);
if (normalizedCorrection) return normalizedCorrection;
return shouldPreservePluginApiPrereleaseFloor(target) ? version : normalizeOpenClawReleaseSuffixForPluginApi(version);
}
function satisfiesComparator(version, token) {
const trimmed = token.trim();
if (!trimmed) return true;
const match = /^(>=|<=|>|<|=|\^|~)?\s*(.+)$/.exec(trimmed);
if (!match) return false;
const operator = match[1] ?? "";
const target = match[2]?.trim();
if (!target || /^[<>=^~]/.test(target)) return false;
const comparableVersion = normalizePluginApiVersionForComparator(version, target);
const normalizedTarget = normalizePartialComparableVersion(target);
const comparator = normalizedTarget.isPartial && !operator ? `>=${normalizedTarget.version}` : `${operator}${normalizedTarget.version}`;
return satisfies(comparableVersion, comparator, { includePrerelease: true });
}
function satisfiesSemverRange(version, range) {
if (range.includes("||")) return false;
const tokens = normalizeStringEntries(range.trim().split(/\s+/));
if (tokens.length === 0) return false;
return tokens.every((token) => satisfiesComparator(version, token));
}
const OPENCLAW_RELEASE_SUFFIX_PATTERN = /^[vV]?(\d{4}\.[1-9]\d?\.[1-9]\d*)(?:-\d+|-(?:alpha|beta|rc)\.\d+)$/i;
const OPENCLAW_NUMERIC_CORRECTION_PATTERN = /^[vV]?(\d{4}\.[1-9]\d?\.[1-9]\d*)-\d+$/;
function normalizeOpenClawNumericCorrectionForPluginApi(pluginApiVersion) {
return OPENCLAW_NUMERIC_CORRECTION_PATTERN.exec(pluginApiVersion.trim())?.[1];
}
function normalizeOpenClawReleaseSuffixForPluginApi(pluginApiVersion) {
return OPENCLAW_RELEASE_SUFFIX_PATTERN.exec(pluginApiVersion.trim())?.[1] ?? pluginApiVersion;
}
/** Resolves the plugin API compatibility range declared by package metadata. */
function resolvePackagePluginApiRange(packageMetadata) {
if (packageMetadata === void 0 || packageMetadata === null) return { ok: true };
if (!isRecord(packageMetadata)) return { ok: true };
if (!("compat" in packageMetadata)) return { ok: true };
const compat = packageMetadata.compat;
if (compat === void 0 || compat === null) return { ok: true };
if (!isRecord(compat)) return {
ok: false,
error: "package.json openclaw.compat must be an object"
};
if (!("pluginApi" in compat)) return { ok: true };
const pluginApi = compat.pluginApi;
if (typeof pluginApi !== "string") return {
ok: false,
error: "package.json openclaw.compat.pluginApi must be a string"
};
const range = pluginApi.trim();
if (!range) return {
ok: false,
error: "package.json openclaw.compat.pluginApi must not be empty"
};
return {
ok: true,
range
};
}
/** Checks whether a host plugin API version satisfies a package plugin API range. */
function satisfiesPluginApiRange(pluginApiVersion, pluginApiRange) {
if (!pluginApiRange) return true;
return satisfiesSemverRange(pluginApiVersion, pluginApiRange);
}
//#endregion
export { satisfiesPluginApiRange as n, resolvePackagePluginApiRange as t };