openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
161 lines (160 loc) • 6.56 kB
JavaScript
import { c as isRecord } from "./utils-CCC-BEJH.js";
import { t as parseConfigPathArrayIndex } from "./path-array-index-BDeCXbeb.js";
import "./shared-CuqTS6Vs.js";
import { isDeepStrictEqual } from "node:util";
//#region src/secrets/path-utils.ts
/** Strict dotted-path get/set/delete helpers for secrets migration targets. */
function looksLikeArrayIndexSegment(segment) {
return /^\d+$/.test(segment);
}
function parseArrayIndexSegment(segment) {
return parseConfigPathArrayIndex(segment);
}
function requireArrayIndexSegment(segment, pathLabel) {
const index = parseArrayIndexSegment(segment);
if (index === void 0) throw new Error(`Invalid array index segment "${segment}" at ${pathLabel}.`);
return index;
}
function expectedContainer(nextSegment) {
return looksLikeArrayIndexSegment(nextSegment) ? "array" : "object";
}
function parseArrayLeafTarget(cursor, leaf, segments) {
if (!Array.isArray(cursor)) return null;
return {
array: cursor,
index: requireArrayIndexSegment(leaf, segments.join("."))
};
}
function traverseToLeafParent(params) {
if (params.segments.length === 0) throw new Error("Target path is empty.");
let cursor = params.root;
for (let index = 0; index < params.segments.length - 1; index += 1) {
const segment = params.segments[index] ?? "";
if (Array.isArray(cursor)) {
const arrayIndex = requireArrayIndexSegment(segment, params.segments.join("."));
if (params.requireExistingSegment && (arrayIndex < 0 || arrayIndex >= cursor.length)) throw new Error(`Path segment does not exist at ${params.segments.slice(0, index + 1).join(".")}.`);
cursor = cursor[arrayIndex];
continue;
}
if (!isRecord(cursor)) throw new Error(`Invalid path shape at ${params.segments.slice(0, index).join(".") || "<root>"}.`);
if (params.requireExistingSegment && !Object.hasOwn(cursor, segment)) throw new Error(`Path segment does not exist at ${params.segments.slice(0, index + 1).join(".")}.`);
cursor = cursor[segment];
}
return cursor;
}
/**
* Reads a config path from object/array containers.
* Missing containers, invalid array indexes, and scalar parents resolve to undefined.
*/
function getPath(root, segments) {
if (segments.length === 0) return;
let cursor = root;
for (const segment of segments) {
if (Array.isArray(cursor)) {
const arrayIndex = parseArrayIndexSegment(segment);
if (arrayIndex === void 0) return;
cursor = cursor[arrayIndex];
continue;
}
if (!isRecord(cursor)) return;
cursor = cursor[segment];
}
return cursor;
}
/**
* Sets a config path, creating missing object or array containers from the next path segment.
* Existing non-container parents fail so callers cannot silently change config shape.
*/
function setPathCreateStrict(root, segments, value) {
if (segments.length === 0) throw new Error("Target path is empty.");
let cursor = root;
let changed = false;
for (let index = 0; index < segments.length - 1; index += 1) {
const segment = segments[index] ?? "";
const needs = expectedContainer(segments[index + 1] ?? "");
if (Array.isArray(cursor)) {
const arrayIndex = requireArrayIndexSegment(segment, segments.join("."));
const existing = cursor[arrayIndex];
if (existing === void 0 || existing === null) {
cursor[arrayIndex] = needs === "array" ? [] : {};
changed = true;
} else if (needs === "array" ? !Array.isArray(existing) : !isRecord(existing)) throw new Error(`Invalid path shape at ${segments.slice(0, index + 1).join(".")}.`);
cursor = cursor[arrayIndex];
continue;
}
if (!isRecord(cursor)) throw new Error(`Invalid path shape at ${segments.slice(0, index).join(".") || "<root>"}.`);
const existing = cursor[segment];
if (existing === void 0 || existing === null) {
cursor[segment] = needs === "array" ? [] : {};
changed = true;
} else if (needs === "array" ? !Array.isArray(existing) : !isRecord(existing)) throw new Error(`Invalid path shape at ${segments.slice(0, index + 1).join(".")}.`);
cursor = cursor[segment];
}
const leaf = segments[segments.length - 1] ?? "";
const arrayTarget = parseArrayLeafTarget(cursor, leaf, segments);
if (arrayTarget) {
if (!isDeepStrictEqual(arrayTarget.array[arrayTarget.index], value)) {
arrayTarget.array[arrayTarget.index] = value;
changed = true;
}
return changed;
}
if (!isRecord(cursor)) throw new Error(`Invalid path shape at ${segments.slice(0, -1).join(".") || "<root>"}.`);
if (!isDeepStrictEqual(cursor[leaf], value)) {
cursor[leaf] = value;
changed = true;
}
return changed;
}
/**
* Sets an existing config path and throws if any parent or leaf segment is missing.
* Used by runtime resolution paths that must only replace values proven by source discovery.
*/
function setPathExistingStrict(root, segments, value) {
const cursor = traverseToLeafParent({
root,
segments,
requireExistingSegment: true
});
const leaf = segments[segments.length - 1] ?? "";
const arrayTarget = parseArrayLeafTarget(cursor, leaf, segments);
if (arrayTarget) {
if (arrayTarget.index < 0 || arrayTarget.index >= arrayTarget.array.length) throw new Error(`Path segment does not exist at ${segments.join(".")}.`);
if (!isDeepStrictEqual(arrayTarget.array[arrayTarget.index], value)) {
arrayTarget.array[arrayTarget.index] = value;
return true;
}
return false;
}
if (!isRecord(cursor)) throw new Error(`Invalid path shape at ${segments.slice(0, -1).join(".") || "<root>"}.`);
if (!Object.hasOwn(cursor, leaf)) throw new Error(`Path segment does not exist at ${segments.join(".")}.`);
if (!isDeepStrictEqual(cursor[leaf], value)) {
cursor[leaf] = value;
return true;
}
return false;
}
/**
* Deletes an existing config path, returning whether anything was removed.
* Array deletes compact with splice; object deletes remove only the concrete leaf key.
*/
function deletePathStrict(root, segments) {
const cursor = traverseToLeafParent({
root,
segments,
requireExistingSegment: false
});
const leaf = segments[segments.length - 1] ?? "";
const arrayTarget = parseArrayLeafTarget(cursor, leaf, segments);
if (arrayTarget) {
if (arrayTarget.index < 0 || arrayTarget.index >= arrayTarget.array.length) return false;
arrayTarget.array.splice(arrayTarget.index, 1);
return true;
}
if (!isRecord(cursor)) throw new Error(`Invalid path shape at ${segments.slice(0, -1).join(".") || "<root>"}.`);
if (!Object.hasOwn(cursor, leaf)) return false;
delete cursor[leaf];
return true;
}
//#endregion
export { setPathExistingStrict as i, getPath as n, setPathCreateStrict as r, deletePathStrict as t };