@kailashg101/mcp-figma-to-code
Version:
MCP server for converting Figma designs to React Native components
85 lines (84 loc) • 2.88 kB
JavaScript
import fs from 'node:fs';
// Get environment variables
const FIGMA_TOKEN = process.env.FIGMA_TOKEN || '';
const FIGMA_FILE = process.env.FIGMA_FILE || '';
export function camelCaseToDash(string) {
return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}
export async function createFolder(path) {
try {
await fs.promises.access(path, fs.constants.F_OK);
// eslint-disable-next-line no-unused-vars
}
catch (err) {
await fs.promises.mkdir(path);
}
}
export async function fetchSVGURL(id) {
const url = `https://api.figma.com/v1/images/${FIGMA_FILE}/?ids=${id}&format=svg`;
const headers = { 'X-Figma-Token': FIGMA_TOKEN || '' };
const response = await fetch(url, { headers });
if (!response.ok) {
throw new Error(`Failed to fetch svg url: ${response.statusText}`);
}
const data = await response.json();
return data;
}
export async function writeToFile(filename, data) {
try {
await fs.promises.access(filename, fs.constants.F_OK);
console.log(`File ${filename} already exists. Skipping write.`);
// eslint-disable-next-line no-unused-vars
}
catch (error) {
return fs.writeFile(filename, data, (error) => {
if (error) {
console.error(`Error writing file ${filename}: ${error}`);
throw error;
}
});
}
}
export function findAllByValue(obj, valueToFind) {
return Object.entries(obj).reduce((acc, [key, value]) => value === valueToFind
? acc.concat({
id: Object.values(obj.id).join(''),
name: Object.values(obj.name).join(''),
})
: typeof value === 'object' && value !== null
? acc.concat(findAllByValue(value, valueToFind))
: acc, []);
}
// Helper functions for component generation
export function toPascalCase(str) {
return str
.split(/[^a-zA-Z0-9]/g)
.filter(Boolean)
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
.join('');
}
export const normalizeName = (name) => name.toLowerCase().replace(/[^a-z0-9]/g, '');
export function toCamelCase(str) {
const pascal = toPascalCase(str);
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
}
export async function fetchFigmaData() {
const response = await fetch(`https://api.figma.com/v1/files/${FIGMA_FILE}`, {
headers: {
'X-Figma-Token': FIGMA_TOKEN,
},
});
if (!response.ok) {
const errorText = await response.text();
return {
isError: true,
content: [
{
type: 'text',
text: `Failed to fetch Figma file: ${response.status} ${response.statusText} - ${errorText}`,
},
],
};
}
return await response.json();
}