summary refs log tree commit diff
path: root/lib/generateApi.ts
blob: 836fa2a507afda757283e314d129ec08f9ea74e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import fs from "fs";
import path from "path";
import { Post } 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 { year, month, day } = post.date;
  const dir = `${path}/api/posts/${year}/${month}/${day}`;

  mkDirByPathSync(dir);

  const apiEntry = {
    title: post.title,
    date: `${year}-${month}-${day}`,
    content: post.content.html,
    meta: post.content.meta
  };

  fs.writeFile(`${dir}/${post.title}.json`, JSON.stringify(apiEntry), err =>
    err ? console.log(err) : null
  );
}

export function generateApi(posts: Array<Post>, path: string) {
  try {
    posts.forEach(post => saveApiEntry(post, path));
  } catch (err) {
    console.log(err);
  }
}