Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
73 lines
1.5 KiB
TypeScript
73 lines
1.5 KiB
TypeScript
export function isRecord(value: unknown): value is Record<string, unknown> {
|
|
return !!value && typeof value === "object";
|
|
}
|
|
|
|
export function normalizeTextValue(value: unknown): string {
|
|
if (typeof value !== "string") {
|
|
return "";
|
|
}
|
|
|
|
return value.trim();
|
|
}
|
|
|
|
export function normalizeBoolean(value: unknown): boolean | null {
|
|
if (typeof value !== "boolean") {
|
|
return null;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
export function normalizeIntegerInRange(
|
|
value: unknown,
|
|
fallback: number,
|
|
min: number,
|
|
max: number
|
|
): number {
|
|
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
return fallback;
|
|
}
|
|
|
|
const normalized = Math.round(value);
|
|
return Math.max(min, Math.min(max, normalized));
|
|
}
|
|
|
|
export function normalizeUniqueStringArray(value: unknown): string[] {
|
|
if (!Array.isArray(value)) {
|
|
return [];
|
|
}
|
|
|
|
const normalized: string[] = [];
|
|
for (const item of value) {
|
|
const entry = normalizeTextValue(item);
|
|
if (entry.length === 0 || normalized.includes(entry)) {
|
|
continue;
|
|
}
|
|
|
|
normalized.push(entry);
|
|
}
|
|
|
|
return normalized;
|
|
}
|
|
|
|
export function normalizeUniqueStringArrayWithFallback(
|
|
value: unknown,
|
|
fallback: string[]
|
|
): string[] {
|
|
if (!Array.isArray(value)) {
|
|
return [...fallback];
|
|
}
|
|
|
|
const normalized: string[] = [];
|
|
for (const item of value) {
|
|
const entry = normalizeTextValue(item);
|
|
if (entry.length === 0 || normalized.includes(entry)) {
|
|
continue;
|
|
}
|
|
|
|
normalized.push(entry);
|
|
}
|
|
|
|
return normalized.length > 0 ? normalized : [...fallback];
|
|
}
|