forked from sindresorhus/tempy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
76 lines (59 loc) · 2.1 KB
/
index.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"use strict";
const fs = require("fs");
const path = require("path");
const uniqueString = require("unique-string");
const tempDir = require("temp-dir");
const isStream = require("is-stream");
const rmfr = require("rmfr");
const stream = require("stream");
const { promisify } = require("util");
const pipeline = promisify(stream.pipeline);
const { writeFile } = fs.promises;
const getPath = (prefix = "") => path.join(tempDir, prefix + uniqueString());
const writeStream = async (filePath, data) => pipeline(data, fs.createWriteStream(filePath));
const createTask = (tempyFunction, { extraArguments = 0 } = {}) => async (...arguments_) => {
const [callback, options] = arguments_.slice(extraArguments);
const result = await tempyFunction(...arguments_.slice(0, extraArguments), options);
const returnValue = await callback(result);
await rmfr(result);
return returnValue;
};
module.exports.file = options => {
options = {
...options
};
if (options.name) {
if (options.extension !== undefined && options.extension !== null) {
throw new Error("The `name` and `extension` options are mutually exclusive");
}
return path.join(module.exports.directory(), options.name);
}
return (
getPath() +
(options.extension === undefined || options.extension === null ? "" : "." + options.extension.replace(/^\./, ""))
);
};
module.exports.file.task = createTask(module.exports.file);
module.exports.directory = ({ prefix = "" } = {}) => {
const directory = getPath(prefix);
fs.mkdirSync(directory);
return directory;
};
module.exports.directory.task = createTask(module.exports.directory);
module.exports.write = async (data, options) => {
const filename = module.exports.file(options);
const write = isStream(data) ? writeStream : writeFile;
await write(filename, data);
return filename;
};
module.exports.write.task = createTask(module.exports.write, { extraArguments: 1 });
module.exports.writeSync = (data, options) => {
const filename = module.exports.file(options);
fs.writeFileSync(filename, data);
return filename;
};
Object.defineProperty(module.exports, "root", {
get() {
return tempDir;
}
});