diff options
Diffstat (limited to 'lib/generators/static.js')
| -rw-r--r-- | lib/generators/static.js | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/generators/static.js b/lib/generators/static.js new file mode 100644 index 0000000..eb3c631 --- /dev/null +++ b/lib/generators/static.js @@ -0,0 +1,50 @@ +'use strict'; + +const { access, rmdir } = require('fs/promises'); +const { ncp } = require('ncp'); +const { join } = require('path'); +const { debuglog, promisify } = require('util'); + +const internals = { + ncp: promisify(ncp), + debuglog: debuglog('blog'), + + kAssetsDirectoryName: 'assets' +}; + +/** + * Generates the static assets required for the blog + * + * @name StaticGenerator + * @param {string} source the source directory + * @param {string} target the target directory + * @param {Array.<Blog.tPost>} posts the list of posts + */ +module.exports = async function StaticGenerator(source, target, posts) { + + const assetsTarget = join(target, internals.kAssetsDirectoryName); + + internals.debuglog(`Removing ${assetsTarget}`); + await rmdir(assetsTarget, { recursive: true }); + + for (let i = 0; i < posts.length; ++i) { + const postSourcePath = join(source, `${i}`); + + try { + await access(postSourcePath); + + const assetsSource = join(postSourcePath, internals.kAssetsDirectoryName); + + internals.debuglog(`Copying ${assetsSource} to ${assetsTarget}`); + await internals.ncp(assetsSource, assetsTarget); + } + catch (error) { + if (error.code === internals.kFileNotFoundError) { + internals.debuglog(`Skipping ${i}`); + continue; + } + + throw error; + } + } +}; |