#!/usr/bin/env node
const octicons = require('../../build/data.json')
const fse = require('fs-extra')
const {join, resolve} = require('path')
const srcDir = resolve(__dirname, '../src/__generated__')
const iconsFile = join(srcDir, 'icons.js')
const typesFile = join(srcDir, 'icons.d.ts')
const GENERATED_HEADER = '/* THIS FILE IS GENERATED. DO NOT EDIT IT. */'
function pascalCase(str) {
return str.replace(/(^|-)([a-z])/g, (_, __, c) => c.toUpperCase())
}
const icons = Object.entries(octicons)
.map(([key, octicon]) => {
const name = `${pascalCase(key)}Icon`
const code = `function ${name}(props) {
const svgDataByHeight = ${JSON.stringify(octicon.heights)}
return
}
${name}.defaultProps = {
className: 'octicon octicon-${key}',
size: 16,
verticalAlign: 'text-bottom'
}
`
return {
key,
name,
octicon,
code
}
})
.sort((a, b) => a.key.localeCompare(b.key))
function writeIcons(file) {
const count = icons.length
const code = `${GENERATED_HEADER}
import React from 'react'
import getSvgProps from '../get-svg-props'
${icons.map(({code}) => code).join('\n')}
export {
${icons.map(({name}) => name).join(',\n ')}
}`
return fse.writeFile(file, code, 'utf8').then(() => {
console.warn('wrote %s with %d exports', file, count)
return icons
})
}
function writeTypes(file) {
const count = icons.length
const code = `${GENERATED_HEADER}
import * as React from 'react'
type Size = 'small' | 'medium' | 'large'
interface IconProps {
'aria-label'?: string
className?: string
fill?: string
size?: number | Size
verticalAlign?: 'middle' | 'text-bottom' | 'text-top' | 'top' | 'unset'
}
type Icon = React.FC
${icons.map(({name}) => `declare const ${name}: Icon`).join('\n')}
export {
Icon,
IconProps,
${icons.map(({name}) => name).join(',\n ')}
}`
return fse.writeFile(file, code, 'utf8').then(() => {
console.warn('wrote %s with %d exports', file, count)
return icons
})
}
fse
.mkdirs(srcDir)
.then(() => writeIcons(iconsFile))
.then(() => writeTypes(typesFile))
.catch(error => {
console.error(error)
process.exit(1)
})