-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfile.js
57 lines (46 loc) · 1.61 KB
/
file.js
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
import { assertEquals } from "std/testing/asserts.ts";
const { readDir, mkdir, readTextFile, writeTextFile } = Deno;
const writeJSONFile = (path, object) =>
writeTextFile(path, JSON.stringify(object) + "\n");
export const root = "dois";
export async function* files(dir) {
for await (const { name, isFile, ...meta } of readDir(dir)) {
if (isFile) {
yield { name, ...meta };
}
}
}
export const dirFilename = (id) => {
const [prefix, ...suf] = id.toLowerCase().split("/");
const dir = `${root}/${encodeURIComponent(prefix)}`;
const filename = encodeURIComponent(suf.join("_") + ".json");
return [dir, filename];
};
export const path = (id) => dirFilename(id).join("/");
export const read = async (doi) => {
// const mod = await import("./" + path(id), { assert: { type: "json" } });
// return mod.default;
return JSON.parse(await readTextFile(path(doi)));
};
export const slurp = async ({ ids }) => {
const dois = [];
for await (const doi of ids) {
dois.push(await read(doi));
}
return dois;
};
export const save = async (datacite) => {
const { id } = datacite;
assertEquals(id, datacite.attributes.doi);
assertEquals(id.toLowerCase(), id);
const [dir, filename] = dirFilename(id);
await mkdir(dir, { recursive: true });
await writeJSONFile(`${dir}/${filename}`, datacite);
};
export const saveMetafile = async ({ data, query, meta, links }) => {
const ids = [...new Set(data.map(({ id }) => id))];
const updated = [
...new Set(data.map(({ attributes: { updated } }) => updated)),
].sort().at(-1);
await writeJSONFile("meta.json", { updated, query, ids, meta, links });
};