From: Ruben Beltran del Rio Date: Fri, 9 Dec 2022 21:18:26 +0000 (+0100) Subject: Remove force rms and dependency on ncp X-Git-Tag: 5.0.0~12 X-Git-Url: https://git.r.bdr.sh/rbdr/blog/commitdiff_plain/d3f282a164e44f54678cdb45aad7a09c8a92b89e Remove force rms and dependency on ncp --- diff --git a/lib/archivers/gemlog.js b/lib/archivers/gemlog.js index 50bb334..3e08be4 100644 --- a/lib/archivers/gemlog.js +++ b/lib/archivers/gemlog.js @@ -1,14 +1,13 @@ -const { mkdir, readdir, rm, writeFile } = require('fs/promises'); -const { debuglog, promisify } = require('util'); -const { ncp } = require('ncp'); +const { cp, mkdir, readdir, writeFile } = require('fs/promises'); +const { debuglog } = require('util'); const { resolve, join } = require('path'); +const { rmIfExists } = require('../utils'); const internals = { kArchiveName: resolve(join(__dirname, '../..', '.gemlog')), kIndexName: 'index.gmi', kGeminiRe: /\.gmi$/i, - ncp: promisify(ncp), debuglog: debuglog('blog'), buildUrl(id, slug) { @@ -53,7 +52,7 @@ module.exports = async function(archiveDirectory) { try { internals.debuglog('Removing index'); - await rm(internals.kArchiveName, { recursive: true }); + await rmIfExists(internals.kArchiveName); } finally { internals.debuglog('Creating index'); @@ -62,6 +61,6 @@ module.exports = async function(archiveDirectory) { await writeFile(indexFile, index); internals.debuglog('Copying posts to archive'); - await internals.ncp(archiveDirectory, internals.kArchiveName); + await cp(archiveDirectory, internals.kArchiveName, { recursive: true }); } }; diff --git a/lib/blog.js b/lib/blog.js index 0b291df..d2acbb4 100644 --- a/lib/blog.js +++ b/lib/blog.js @@ -1,11 +1,13 @@ 'use strict'; -const { access, cp, mkdir, readdir, readFile, rm, writeFile } = require('fs/promises'); +const { access, cp, mkdir, readdir, readFile, writeFile } = require('fs/promises'); const { exec } = require('child_process'); const { basename, resolve, join } = require('path'); const ParseGemini = require('gemini-to-html/parse'); const RenderGemini = require('gemini-to-html/render'); const { debuglog, promisify } = require('util'); +const { ensureDirectoryExists, rmIfExists } = require('./utils'); +const { kFileNotFoundError } = require('./constants'); // Generators for the Blog @@ -31,7 +33,6 @@ const internals = { // constants - kFileNotFoundError: 'ENOENT', kGeminiRe: /\.gmi$/i, kMetadataFilename: 'metadata.json', @@ -70,15 +71,15 @@ module.exports = class Blog { */ async add(postLocation) { - await this._ensurePostsDirectoryExists(); + await ensureDirectoryExists(this.postsDirectory); try { await this.syncDown(); } catch {}; await this._shift(); const firstDirectory = join(this.postsDirectory, '0'); - await rm(firstDirectory, { recursive: true, force: true }); - await this._ensurePostsDirectoryExists(firstDirectory); + await rmIfExists(firstDirectory); + await ensureDirectoryExists(firstDirectory); await this._update(postLocation); } @@ -221,7 +222,7 @@ module.exports = class Blog { async _update(postLocation) { const metadata = await this._getMetadata(); - await this._ensurePostsDirectoryExists(); + await ensureDirectoryExists(this.postsDirectory); await this._copyPost(postLocation); await this._writeMetadata(metadata); @@ -263,7 +264,7 @@ module.exports = class Blog { posts.push(await this._readPost(i)); } catch (error) { - if (error.code === internals.kFileNotFoundError) { + if (error.code === kFileNotFoundError) { internals.debuglog(`Skipping ${i}`); continue; } @@ -311,14 +312,14 @@ module.exports = class Blog { try { internals.debuglog(`Archiving ${targetPath}`); - await rm(targetPath, { recursive: true, force: true }); + await rmIfExists(targetPath); await access(sourcePath); // check the source path internals.debuglog(`Shifting blog post ${sourcePath} to ${targetPath}`); await cp(sourcePath, targetPath, { recursive: true }); } catch (error) { - if (error.code === internals.kFileNotFoundError) { + if (error.code === kFileNotFoundError) { internals.debuglog(`Skipping ${sourcePath}: Does not exist.`); continue; } @@ -333,14 +334,14 @@ module.exports = class Blog { async _archive() { internals.debuglog('Archiving post'); const post = await this._readPost(0); - await this._ensureDirectoryExists(this.archiveDirectory); + await ensureDirectoryExists(this.archiveDirectory); const targetPath = join(this.archiveDirectory, post.id); internals.debuglog(`Removing ${targetPath}`); - await rm(targetPath, { recursive: true, force: true }); + await rmIfExists(targetPath); internals.debuglog(`Adding ${post.location} to ${targetPath}`); - await this._ensureDirectoryExists(targetPath); + await ensureDirectoryExists(targetPath); await cp(post.location, targetPath, { recursive: true }); internals.debuglog(`Added ${post.location} to ${targetPath}`); } @@ -386,39 +387,13 @@ module.exports = class Blog { const targetPost = join(targetPath, postName); internals.debuglog(`Removing ${targetPath}`); - await rm(targetPath, { recursive: true, force: true }); - await this._ensureDirectoryExists(targetPath); + await rmIfExists(targetPath); + await ensureDirectoryExists(targetPath); internals.debuglog(`Adding ${postLocation} to ${targetPost}`); await cp(postLocation, targetPost, { recursive: true }); internals.debuglog(`Added ${postLocation} to ${targetPath}`); } - // Ensures a directory exists. - - async _ensureDirectoryExists(directory) { - - internals.debuglog(`Checking if ${directory} exists.`); - try { - await access(directory); - } - catch (error) { - if (error.code === internals.kFileNotFoundError) { - internals.debuglog(`Creating ${directory}`); - await mkdir(directory, { recursive: true }); - return; - } - - throw error; - } - } - - // Ensures posts directory exists - - async _ensurePostsDirectoryExists() { - - return this._ensureDirectoryExists(this.postsDirectory); - } - // Looks for a `.gmi` file in the blog directory, and returns the path async _findBlogContent(directory) { diff --git a/lib/constants.js b/lib/constants.js new file mode 100644 index 0000000..9b4ce31 --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,3 @@ +module.exports = { + kFileNotFoundError: 'ENOENT', +}; diff --git a/lib/generators/static.js b/lib/generators/static.js index 4713ea7..416076c 100644 --- a/lib/generators/static.js +++ b/lib/generators/static.js @@ -1,14 +1,13 @@ 'use strict'; -const { access, rm } = require('fs/promises'); -const { ncp } = require('ncp'); +const { access, cp } = require('fs/promises'); const { join } = require('path'); -const { debuglog, promisify } = require('util'); +const { debuglog } = require('util'); +const { rmIfExists } = require('../utils'); +const { kFileNotFoundError } = require('../constants'); const internals = { - ncp: promisify(ncp), debuglog: debuglog('blog'), - kAssetsDirectoryName: 'assets' }; @@ -25,7 +24,7 @@ module.exports = async function StaticGenerator(source, target, posts) { const assetsTarget = join(target, internals.kAssetsDirectoryName); internals.debuglog(`Removing ${assetsTarget}`); - await rm(assetsTarget, { recursive: true, force: true }); + await rmIfExists(assetsTarget); for (let i = 0; i < posts.length; ++i) { const postSourcePath = join(source, `${i}`); @@ -36,10 +35,10 @@ module.exports = async function StaticGenerator(source, target, posts) { const assetsSource = join(postSourcePath, internals.kAssetsDirectoryName); internals.debuglog(`Copying ${assetsSource} to ${assetsTarget}`); - await internals.ncp(assetsSource, assetsTarget); + await cp(assetsSource, assetsTarget, { recursive: true }); } catch (error) { - if (error.code === internals.kFileNotFoundError) { + if (error.code === kFileNotFoundError) { internals.debuglog(`Skipping ${i}`); continue; } diff --git a/lib/remote.js b/lib/remote.js index 8b29c4e..373958f 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -1,4 +1,5 @@ -const { readFile, rm, writeFile } = require('fs/promises'); +const { readFile, writeFile } = require('fs/promises'); +const { rmIfExists } = require('./utils'); const internals = { strings: { @@ -17,7 +18,7 @@ module.exports = { async remove(remoteConfig) { - await rm(remoteConfig, { force: true }) + await rmIfExists(remoteConfig); }, async syncUp(remoteConfig, blogDirectory) { diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..24b9407 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,36 @@ +const { access, constants, mkdir, rm } = require('fs/promises'); +const { kFileNotFoundError } = require('./constants'); + +// File system utilities + +module.exports = { + async rmIfExists(location) { + + try { + await access(location, constants.F_OK); + await rm(location, { recursive: true }); + } + catch (error) { + if (error.code === kFileNotFoundError) { + return; + } + + throw error; + } + }, + + async ensureDirectoryExists(directory) { + + try { + await access(directory); + } + catch (error) { + if (error.code === kFileNotFoundError) { + await mkdir(directory, { recursive: true }); + return; + } + + throw error; + } + } +}; diff --git a/package-lock.json b/package-lock.json index 4dfb228..ac0d1bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1375,7 +1375,7 @@ "node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "bin": { "ncp": "bin/ncp" } @@ -3019,7 +3019,7 @@ "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==" }, "neo-async": { "version": "2.6.2", diff --git a/package.json b/package.json index 1df9fb3..81d26a8 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ }, "repository": { "type": "git", - "url": "git+https://gitlab.com/rbdr/blog.git" + "url": "git+https://git.sr.ht/~rbdr/blog" }, - "author": "Ben Beltran ", + "author": "Ruben Beltran del Rio ", "license": "Apache-2.0", "bugs": { "url": "https://gitlab.com/rbdr/blog/issues" @@ -26,8 +26,7 @@ "entities": "^3.0.1", "gemini-to-html": "^2.1.0", "getenv": "^1.0.0", - "minimist": "^1.2.5", - "ncp": "^2.0.0" + "minimist": "^1.2.5" }, "devDependencies": { "@hapi/eslint-plugin": "^5.1.0", @@ -35,6 +34,6 @@ "jsdoc-to-markdown": "^7.1.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }