a8423e8503
# Introduction Added a no-explicit-any rule to the twenty-server, not applicable to tests and integration tests folder Related to https://github.com/twentyhq/core-team-issues/issues/975 Discussed with Charles ## In case of conflicts Until this is approved I won't rebased and handle conflict, just need to drop two latest commits and re run the scripts etc ## Legacy We decided not to handle the existing lint error occurrences and programmatically ignored them through a disable next line rule comment ## Open question We might wanna activate the [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any/) `ignoreRestArgs` for our use case ? ``` ignoreRestArgs?: boolean; ``` --------- Co-authored-by: etiennejouan <jouan.etienne@gmail.com>
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export const cleanGraphQLResponse = (input: any) => {
|
|
if (!input) return null;
|
|
const output = { data: {} }; // Initialize the output with a data key at the top level
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const isObject = (obj: any) => {
|
|
return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
|
|
};
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const cleanObject = (obj: any) => {
|
|
const cleanedObj = {};
|
|
|
|
Object.keys(obj).forEach((key) => {
|
|
if (isObject(obj[key])) {
|
|
if (obj[key].edges) {
|
|
// Handle edges by mapping over them and applying cleanObject to each node
|
|
cleanedObj[key] = obj[key].edges.map((edge) =>
|
|
cleanObject(edge.node),
|
|
);
|
|
} else {
|
|
// Recursively clean nested objects
|
|
cleanedObj[key] = cleanObject(obj[key]);
|
|
}
|
|
} else {
|
|
// Directly assign non-object properties
|
|
cleanedObj[key] = obj[key];
|
|
}
|
|
});
|
|
|
|
return cleanedObj;
|
|
};
|
|
|
|
Object.keys(input).forEach((key) => {
|
|
if (isObject(input[key]) && input[key].edges) {
|
|
// Handle collections with edges, ensuring data is placed under the data key
|
|
output.data[key] = input[key].edges.map((edge) => cleanObject(edge.node));
|
|
// Move pageInfo and totalCount to the top level
|
|
if (input[key].pageInfo) {
|
|
output['pageInfo'] = input[key].pageInfo;
|
|
}
|
|
if (input[key].totalCount) {
|
|
output['totalCount'] = input[key].totalCount;
|
|
}
|
|
} else if (isObject(input[key])) {
|
|
// Recursively clean and assign nested objects under the data key
|
|
output.data[key] = cleanObject(input[key]);
|
|
} else if (Array.isArray(input[key])) {
|
|
const itemsWithEdges = input[key].filter((item) => item.edges);
|
|
const cleanedObjArray = itemsWithEdges.map(({ edges, ...item }) => {
|
|
return {
|
|
...item,
|
|
[key]: edges.map((edge) => cleanObject(edge.node)),
|
|
};
|
|
});
|
|
|
|
output.data = cleanedObjArray;
|
|
} else {
|
|
// Assign all other properties directly under the data key
|
|
output.data[key] = input[key];
|
|
}
|
|
});
|
|
|
|
return output;
|
|
};
|