|
@@ -0,0 +1,44 @@
|
|
|
+import fs from "fs-extra";
|
|
|
+import path from "path";
|
|
|
+
|
|
|
+const UPDATE_LOG = "UPDATELOG.md";
|
|
|
+
|
|
|
+// parse the UPDATELOG.md
|
|
|
+export async function resolveUpdateLog(tag) {
|
|
|
+ const cwd = process.cwd();
|
|
|
+
|
|
|
+ const reTitle = /^## v[\d\.]+/;
|
|
|
+ const reEnd = /^---/;
|
|
|
+
|
|
|
+ const file = path.join(cwd, UPDATE_LOG);
|
|
|
+
|
|
|
+ if (!(await fs.pathExists(file))) {
|
|
|
+ throw new Error("could not found UPDATELOG.md");
|
|
|
+ }
|
|
|
+
|
|
|
+ const data = await fs.readFile(file).then((d) => d.toString("utf8"));
|
|
|
+
|
|
|
+ const map = {};
|
|
|
+ let p = "";
|
|
|
+
|
|
|
+ data.split("\n").forEach((line) => {
|
|
|
+ if (reTitle.test(line)) {
|
|
|
+ p = line.slice(3).trim();
|
|
|
+ if (!map[p]) {
|
|
|
+ map[p] = [];
|
|
|
+ } else {
|
|
|
+ throw new Error(`Tag ${p} dup`);
|
|
|
+ }
|
|
|
+ } else if (reEnd.test(line)) {
|
|
|
+ p = "";
|
|
|
+ } else if (p) {
|
|
|
+ map[p].push(line);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!map[tag]) {
|
|
|
+ throw new Error(`could not found "${tag}" in UPDATELOG.md`);
|
|
|
+ }
|
|
|
+
|
|
|
+ return map[tag].join("\n").trim();
|
|
|
+}
|