-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
124 lines (102 loc) · 2.74 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
const fetch = require('node-fetch')
const qs = require('qs')
const { DEBUG } = process.env
const types = {
FILL: 1,
TEXT: 1,
EFFECT: 1,
GRID: 1
}
const request = async (apiKey, path, query) => {
const opts = {
headers: { 'X-FIGMA-TOKEN': apiKey }
}
const params = query ? qs.stringify(query) : ''
const url = `https://api.figma.com/${path}?${params}`
console.log('GET', url)
const res = await fetch(url, opts)
const obj = await res.json()
return obj
}
const downloadDoc = async (apiKey, id, query = {}) => {
console.log('Downloading figma doc', id)
return request(apiKey, `v1/files/${id}`, { ...query, geometry: 'paths' })
}
const getMe = async (apiKey) => {
return request(apiKey, 'v1/me')
}
const getTeamStyles = async (apiKey, teamId, query) => {
return (await request(apiKey, `v1/teams/${teamId}/styles`, query)).meta.styles
}
const pluralize = str =>
str.charAt(str.length - 1) === 's'
? str
: str + 's'
const getPropType = type =>
type === 'text'
? 'style'
: type === 'grid'
? 'layoutGrids'
: pluralize(type)
const getSafeProp = (prop) =>
prop instanceof Array
? prop[0]
: prop
const iterateDoc = (item, map, pageName) => {
if (!item) return
const styles = item.styles || {}
if (item.type === 'CANVAS') {
pageName = item.name
}
Object.keys(styles).map(type => {
const pluralType = pluralize(type)
const propType = getPropType(type)
const styleId = styles[type]
DEBUG && console.log('styles types', type, styles[type], propType, item[propType])
map[pluralType][styleId] = getSafeProp(item[propType])
if (pageName) {
map[pluralType][styleId].page = pageName
}
})
return (item.children || []).map(item => iterateDoc(item, map, pageName))
}
const getDocStyles = async (doc, teamStyles) => {
const { styles, document } = doc
DEBUG && console.log('styles', styles, 'teamStyles', teamStyles)
const { name, lastModified, version } = doc
const styleMap = {
name,
lastModified,
version,
fills: {},
strokes: {},
effects: {},
texts: {},
grids: {}
}
iterateDoc(document, styleMap)
Object.keys(styles)
.map(key => {
const style = styles[key]
const type = pluralize(style.styleType.toLowerCase())
DEBUG && console.log('style', type, key)
if (teamStyles) {
const meta = teamStyles.filter(s => s.key === style.key).pop()
if (meta) {
style.meta = meta
}
}
if (styleMap[type][key]) {
styleMap[type][key] = Object.assign(styleMap[type][key], style)
} else {
DEBUG && console.log('missing style', type, style)
}
})
return styleMap
}
module.exports = {
downloadDoc,
getMe,
getTeamStyles,
getDocStyles
}