You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.0 KiB
43 lines
1.0 KiB
/** |
|
* This script turns output from the figma plugin "style to JSON" into a usuable theme. |
|
* It expects a format of "themes/{NAME}/anythinghere" |
|
*/ |
|
|
|
import fs from "fs"; |
|
|
|
const fileLocation = "./figmaTokens.json"; |
|
const theme = "blue"; |
|
|
|
const fileContents = fs.readFileSync(fileLocation, { |
|
encoding: "utf-8" |
|
}); |
|
const tokens = JSON.parse(fileContents); |
|
|
|
const themeTokens = tokens.themes[theme]; |
|
const output = {}; |
|
|
|
function setKey(obj, key, defaultVal) { |
|
const realKey = key.match(/^\d+$/g) ? "c" + key : key; |
|
if (obj[key]) return obj[key]; |
|
obj[realKey] = defaultVal; |
|
return obj[realKey]; |
|
} |
|
|
|
function handleToken(token, path) { |
|
if (typeof token.name === "string" && typeof token.description === "string") { |
|
let ref = output; |
|
const lastKey = path.pop(); |
|
path.forEach((v) => { |
|
ref = setKey(ref, v, {}); |
|
}); |
|
setKey(ref, lastKey, token.hex); |
|
return; |
|
} |
|
|
|
for (let key in token) { |
|
handleToken(token[key], [...path, key]); |
|
} |
|
} |
|
|
|
handleToken(themeTokens, []); |
|
console.log(JSON.stringify(output, null, 2));
|
|
|