-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) {
try {
internals.debuglog('Removing index');
- await rm(internals.kArchiveName, { recursive: true });
+ await rmIfExists(internals.kArchiveName);
}
finally {
internals.debuglog('Creating index');
await writeFile(indexFile, index);
internals.debuglog('Copying posts to archive');
- await internals.ncp(archiveDirectory, internals.kArchiveName);
+ await cp(archiveDirectory, internals.kArchiveName, { recursive: true });
}
};
'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
// constants
- kFileNotFoundError: 'ENOENT',
kGeminiRe: /\.gmi$/i,
kMetadataFilename: 'metadata.json',
*/
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);
}
async _update(postLocation) {
const metadata = await this._getMetadata();
- await this._ensurePostsDirectoryExists();
+ await ensureDirectoryExists(this.postsDirectory);
await this._copyPost(postLocation);
await this._writeMetadata(metadata);
posts.push(await this._readPost(i));
}
catch (error) {
- if (error.code === internals.kFileNotFoundError) {
+ if (error.code === kFileNotFoundError) {
internals.debuglog(`Skipping ${i}`);
continue;
}
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;
}
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}`);
}
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) {
--- /dev/null
+module.exports = {
+ kFileNotFoundError: 'ENOENT',
+};
'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'
};
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}`);
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;
}
-const { readFile, rm, writeFile } = require('fs/promises');
+const { readFile, writeFile } = require('fs/promises');
+const { rmIfExists } = require('./utils');
const internals = {
strings: {
async remove(remoteConfig) {
- await rm(remoteConfig, { force: true })
+ await rmIfExists(remoteConfig);
},
async syncUp(remoteConfig, blogDirectory) {
--- /dev/null
+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;
+ }
+ }
+};
"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"
}
"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",
},
"repository": {
"type": "git",
- "url": "git+https://gitlab.com/rbdr/blog.git"
+ "url": "git+https://git.sr.ht/~rbdr/blog"
},
- "author": "Ben Beltran <ben@nsovocal.com>",
+ "author": "Ruben Beltran del Rio <ruben@unlimited.pizza>",
"license": "Apache-2.0",
"bugs": {
"url": "https://gitlab.com/rbdr/blog/issues"
"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",
"jsdoc-to-markdown": "^7.1.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18.0.0"
}
}