@zeplin/mcp-server
Version:
Zeplin’s official MCP server for AI-assisted UI development
102 lines (101 loc) • 3.47 kB
JavaScript
/**
* Preprocess a screen object to remove unnecessary information
* @param screen The screen object to preprocess
* @returns The processed screen object
*/
export function preProcessScreen(screen) {
return preProcess(screen);
}
/**
* Preprocess a design tokens object to remove metadata
* @param designTokens The design tokens to preprocess
* @returns The processed design tokens
*/
export function preProcessDesignTokens(designTokens) {
const processedTokens = preProcess(designTokens);
return removeMetadata(processedTokens);
}
/**
* Generic preprocessing function that removes unnecessary properties from objects
* @param data The data to preprocess
* @returns Processed data with unnecessary properties removed
*/
export function preProcess(data) {
if (Array.isArray(data)) {
return data
.map(item => preProcess(item))
.filter(item => {
if (Array.isArray(item) && item.length === 0)
return false;
return true;
});
}
else if (data !== null && typeof data === "object") {
const result = {};
// Skip unnecessary properties
const propsToSkip = new Set(["created", "creator", "thumbnails", "id"]);
const defaultValues = new Map([
["opacity", 1],
["blend_mode", "normal"],
["rotation", 0]
]);
for (const [key, value] of Object.entries(data)) {
if (propsToSkip.has(key))
continue;
if (defaultValues.has(key) && defaultValues.get(key) === value)
continue;
let processedValue;
if (key === "contents" && Array.isArray(value)) {
const itemsToKeep = value.filter(originalContentItem => {
if (originalContentItem && typeof originalContentItem === "object" && originalContentItem !== null && "density" in originalContentItem) {
return originalContentItem.density === 1;
}
if (Array.isArray(originalContentItem) && originalContentItem.length === 0) {
return false;
}
return true;
});
processedValue = itemsToKeep.map(keptItem => preProcess(keptItem))
.filter(processedItem => {
if (Array.isArray(processedItem) && processedItem.length === 0) {
return false;
}
return true;
});
}
else {
processedValue = preProcess(value);
}
if (Array.isArray(processedValue) && processedValue.length === 0) {
continue;
}
result[key] = processedValue;
}
return result;
}
else {
return data;
}
}
/**
* Removes metadata from design tokens
* @param obj Object containing design tokens
* @returns Object with metadata removed
*/
function removeMetadata(obj) {
if (Array.isArray(obj)) {
return obj.map(removeMetadata);
}
else if (obj !== null && typeof obj === "object") {
const result = {};
for (const [key, value] of Object.entries(obj)) {
if (key === "metadata")
continue;
result[key] = removeMetadata(value);
}
return result;
}
else {
return obj;
}
}