create-fomantic-icons
Version:
A simple CLI to generate the icon.variables and icon.html.eco files for FUI
119 lines (107 loc) • 3.95 kB
text/typescript
// node
import { resolve as resolvePath } from 'path';
// npm
import { Liquid } from 'liquidjs';
import * as fse from 'fs-extra';
// tasks
import { PromptResults } from './InitialPrompt';
import { ParseResults } from '../parsers/FontAwesome';
// utils
import Logger, { spinner } from '../util/Logger';
export default function run(results: PromptResults, parseResults: ParseResults): Promise<void> {
return new Promise((resolve) => {
Logger.log();
const distSpinner = spinner()
.start('building dist');
const engine = new Liquid({
root: resolvePath(__dirname, '../../src/templates'),
extname: '.liquid',
ownPropertyOnly: false,
});
const ctx: { [key: string]: any } = parseResults;
ctx.version = results.asset.version;
const distFiles: { [key: string]: string } = {
'icon.html.eco': 'docs/server/documents/elements/',
'icon.overrides': 'ui/src/themes/default/elements/',
'icon.variables': 'ui/src/themes/default/elements/',
};
const templateFileRenderFuncs = Object.keys(distFiles)
.map((filename) => new Promise<void>((resolveRender, rejectRender) => {
engine.renderFile(`${filename}.liquid`, ctx)
.then((renderResult) => {
const fileOutputDirectory = resolvePath(results.distPath, distFiles[filename]);
fse.mkdirp(fileOutputDirectory)
.then(() => {
fse.writeFile(
resolvePath(fileOutputDirectory, filename),
renderResult,
)
.then(() => resolveRender())
.catch(rejectRender);
})
.catch(rejectRender);
})
.catch(rejectRender);
}));
const copyAssetsFunc = new Promise<void>((resolveAssetCopy, rejectAssetCopy) => {
fse.readdir(parseResults.fontAssetsDirectory)
.then((files) => {
let copiedFiles = 0;
const copied = () => {
copiedFiles += 1;
if (copiedFiles >= files.length) {
resolveAssetCopy();
}
};
const distPath = resolvePath(results.distPath, 'ui/src/themes/default/assets/fonts');
fse.mkdirp(distPath)
.then(() => {
files.forEach((file) => {
const [fileName, fileExtension] = file.split('.');
let newFileName = parseResults.fontFileNames[fileName];
if (newFileName && fileExtension && fileExtension.toLowerCase().startsWith('woff')) {
newFileName += `.${fileExtension}`;
const assetFilePath = resolvePath(
parseResults.fontAssetsDirectory,
file,
);
const assetDistPath = resolvePath(distPath, newFileName);
fse.copyFile(assetFilePath, assetDistPath)
.then(() => {
copied();
})
.catch(rejectAssetCopy);
} else {
copied();
}
});
})
.catch(rejectAssetCopy);
})
.catch(rejectAssetCopy);
});
fse.mkdirp(results.distPath)
.then(() => {
Promise
.all([
...templateFileRenderFuncs,
copyAssetsFunc,
])
.then(() => {
distSpinner.succeed('build all dist files');
Logger.log(` Files saved to ${results.distPath}`);
resolve();
})
.catch((err) => {
distSpinner.stop();
Logger.error(err);
process.exit(1);
});
})
.catch((err) => {
distSpinner.stop();
Logger.error(err);
process.exit(1);
});
});
}