@causalfoundry/js-sdk
Version:
Causal Foundry WEB SDK (JS/TS)
85 lines (69 loc) • 2.51 kB
text/typescript
type AnyMap = Record<string, any>;
type StringMap = Record<string, string>;
// Generic "convert" via JSON
function convert<T>(input: any): T {
return JSON.parse(JSON.stringify(input)) as T;
}
// Flatten nested objects to map<string, any>
function flattenMap(input: AnyMap): AnyMap {
const result: AnyMap = {};
for (const [key, value] of Object.entries(input)) {
const newKey = toSnakeCase(key);
if (value === null || value === undefined) continue;
if (typeof value === 'string') {
if (value !== '') result[newKey] = value;
} else if (['number', 'boolean'].includes(typeof value)) {
result[newKey] = value;
} else if (Array.isArray(value)) {
const joined = value
.filter((v) => v !== null && v !== undefined)
.join(', ');
if (joined !== '') result[newKey] = joined;
} else if (typeof value === 'object') {
const nested = flattenMap(value as AnyMap);
Object.assign(result, nested);
} else {
result[newKey] = String(value);
}
}
return result;
}
// Flatten nested objects to map<string, string>
function flattenMapToString(input: AnyMap): StringMap {
const result: StringMap = {};
for (const [key, value] of Object.entries(input)) {
const newKey = toSnakeCase(key);
if (value === null || value === undefined) continue;
if (typeof value === 'string') {
if (value !== '') result[newKey] = value;
} else if (['number', 'boolean'].includes(typeof value)) {
const str = String(value);
if (str !== '') result[newKey] = str;
} else if (Array.isArray(value)) {
const joined = value
.filter((v) => v !== null && v !== undefined)
.map((v) => String(v))
.join(', ');
if (joined !== '') result[newKey] = joined;
} else if (typeof value === 'object') {
const nested = flattenMapToString(value as AnyMap);
Object.assign(result, nested);
} else {
const str = String(value);
if (str !== '') result[newKey] = str;
}
}
return result;
}
// Public API equivalents
export const serializeToFlatMapString = (obj: any): StringMap => {
const initialMap = obj ? convert<AnyMap>(obj) : {};
return flattenMapToString(initialMap);
};
export const serializeToFlatPrimitiveMap = (obj: any): AnyMap => {
const initialMap = obj ? convert<AnyMap>(obj) : {};
return flattenMap(initialMap);
};
export const toSnakeCase = (str: string): string => {
return str.trim().replace(/\s+/g, '_').toLowerCase();
};