zypA13510/ui5-fontawesome

View on GitHub
tasks/generate-metadata.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict'

const Promise = require('bluebird')
const fs = require('fs-extra')
const {dest} = require('gulp')
const yaml = require('js-yaml')
const _ = {
    pickBy: require('lodash.pickby')
}
const semver = require('semver')
const {Readable: ReadableStream} = require('stream')
const Vinyl = require('vinyl')

const METADATA_FILE = 'node_modules/@fortawesome/fontawesome-free/metadata/icons.yml'

async function read() {
    return yaml.safeLoad(await fs.readFile(METADATA_FILE, 'utf8'))
}

/**
 * Pick icons with at least one "changes" version lesser than or equal to the installed version.
 */
function filter(metadata) {
    let {version: installedVersion} = require('@fortawesome/fontawesome-free/package.json')
    return _.pickBy(metadata, icon => {
        let changeVersions = Array.from(icon.changes)
        return changeVersions.some(version => semver.lte(semver.coerce(version), installedVersion))
    })
}

/**
 * Categorize icons by styles supported.
 */
function process(metadata) {
    let result = {regular: {}, solid: {}, brands: {}}
    Object.keys(metadata).forEach(icon => {
        let styles = metadata[icon].styles
        let codePoint = metadata[icon].unicode
        Object.keys(result).forEach(style => {
            if (styles.includes(style)) {
                result[style][icon] = codePoint
            }
        })
    })
    return result
}

async function output(metadata) {
    let stream = new ReadableStream({objectMode: true})
    for (let style in metadata) {
        stream.push(new Vinyl({
            path: `${style}.json`,
            contents: Buffer.from(JSON.stringify(metadata[style])),
        }))
    }
    stream.push(null)
    return new Promise((resolve, reject) =>
        stream.pipe(dest('metadata/'))
            .on('end', () => resolve())
            .on('error', reject)
    )
}

async function generateMetadata() {
    const metadata = process(filter(await read()))
    return output(metadata)
}

module.exports = generateMetadata