index.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. const uniqueString = require('unique-string');
  5. const tempDir = require('temp-dir');
  6. const isStream = require('is-stream');
  7. const del = require('del');
  8. const stream = require('stream');
  9. const {promisify} = require('util');
  10. const pipeline = promisify(stream.pipeline);
  11. const {writeFile} = fs.promises;
  12. const getPath = (prefix = '') => path.join(tempDir, prefix + uniqueString());
  13. const writeStream = async (filePath, data) => pipeline(data, fs.createWriteStream(filePath));
  14. const createTask = (tempyFunction, {extraArguments = 0} = {}) => async (...arguments_) => {
  15. const [callback, options] = arguments_.slice(extraArguments);
  16. const result = await tempyFunction(...arguments_.slice(0, extraArguments), options);
  17. try {
  18. return await callback(result);
  19. } finally {
  20. await del(result, {force: true});
  21. }
  22. };
  23. module.exports.file = options => {
  24. options = {
  25. ...options
  26. };
  27. if (options.name) {
  28. if (options.extension !== undefined && options.extension !== null) {
  29. throw new Error('The `name` and `extension` options are mutually exclusive');
  30. }
  31. return path.join(module.exports.directory(), options.name);
  32. }
  33. return getPath() + (options.extension === undefined || options.extension === null ? '' : '.' + options.extension.replace(/^\./, ''));
  34. };
  35. module.exports.file.task = createTask(module.exports.file);
  36. module.exports.directory = ({prefix = ''} = {}) => {
  37. const directory = getPath(prefix);
  38. fs.mkdirSync(directory);
  39. return directory;
  40. };
  41. module.exports.directory.task = createTask(module.exports.directory);
  42. module.exports.write = async (data, options) => {
  43. const filename = module.exports.file(options);
  44. const write = isStream(data) ? writeStream : writeFile;
  45. await write(filename, data);
  46. return filename;
  47. };
  48. module.exports.write.task = createTask(module.exports.write, {extraArguments: 1});
  49. module.exports.writeSync = (data, options) => {
  50. const filename = module.exports.file(options);
  51. fs.writeFileSync(filename, data);
  52. return filename;
  53. };
  54. Object.defineProperty(module.exports, 'root', {
  55. get() {
  56. return tempDir;
  57. }
  58. });