summary refs log tree commit diff
path: root/lib/generateApi.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/generateApi.ts')
-rw-r--r--lib/generateApi.ts99
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/generateApi.ts b/lib/generateApi.ts
new file mode 100644
index 0000000..0024d9f
--- /dev/null
+++ b/lib/generateApi.ts
@@ -0,0 +1,99 @@
+import fs from 'fs';
+import path from 'path';
+import Post from './Post';
+import { dateToPath } from './utils';
+import { Object as PlainObject } from './interfaces';
+
+function mkDirByPathSync(targetDir: string) {
+  const sep = path.sep;
+  const initDir = path.isAbsolute(targetDir) ? sep : '';
+  const baseDir = '.';
+
+  return targetDir.split(sep).reduce((parentDir, childDir) => {
+    const curDir = path.resolve(baseDir, parentDir, childDir);
+    try {
+      fs.mkdirSync(curDir);
+    } catch (err) {
+      if (err.code === 'EEXIST') {
+        // curDir already exists!
+        return curDir;
+      }
+
+      // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
+      if (err.code === 'ENOENT') {
+        // Throw the original parentDir error on curDir `ENOENT` failure.
+        throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
+      }
+
+      const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
+      if (!caughtErr || (caughtErr && targetDir === curDir)) {
+        throw err; // Throw if it's just the last created dir.
+      }
+    }
+
+    return curDir;
+  }, initDir);
+}
+
+export function saveApiEntry(post: Post, path: string) {
+  const dir = `${path}/api/posts/${dateToPath(post.date)}`;
+
+  mkDirByPathSync(dir);
+
+  const apiEntry = post.toApi();
+
+  fs.writeFile(
+    `${dir}/${post.fileTitle}.json`,
+    JSON.stringify(apiEntry),
+    (err) => (err ? console.log(err) : null)
+  );
+}
+
+/*
+ * This function generates paged api index on path `/api/posts`
+ */
+function generateApiIndex(posts: Array<Post>, path: string) {
+  const parsedPosts = posts.map((post) => {
+    const apiEntry = post.toApi();
+    delete apiEntry.content;
+    return apiEntry;
+  });
+  const filePath = `${path}/api/posts.json`;
+  fs.writeFile(filePath, JSON.stringify(parsedPosts), (err) =>
+    err ? console.log(err) : null
+  );
+}
+
+function generateCategories(posts: Array<Post>, path: string) {
+  const categories: PlainObject = {};
+  posts.forEach((post) => {
+    const apiEntry = post.toApi();
+    delete apiEntry.content;
+    if (apiEntry.meta['category']) {
+      apiEntry.meta['category'].forEach((category: string) =>
+        categories[category]
+          ? categories[category].push(apiEntry)
+          : (categories[category] = [apiEntry])
+      );
+    }
+  });
+
+  const dir = `${path}/api/category`;
+  mkDirByPathSync(dir);
+  Object.keys(categories).forEach((category) => {
+    const filePath = `${dir}/${category}.json`;
+    fs.writeFile(filePath, JSON.stringify(categories[category]), (err) =>
+      err ? console.log(err) : null
+    );
+  });
+}
+
+export function generateApi(posts: Array<Post>, path: string) {
+  try {
+    generateApiIndex(posts, path);
+    generateCategories(posts, path);
+    posts.forEach((post) => saveApiEntry(post, path));
+  } catch (err) {
+    console.log(err);
+  }
+}