10
0

index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import process from 'node:process';
  2. import path from 'node:path';
  3. import fs from 'node:fs';
  4. import commonPathPrefix from 'common-path-prefix';
  5. import {packageDirectorySync} from 'pkg-dir';
  6. const {env, cwd} = process;
  7. const isWritable = path => {
  8. try {
  9. fs.accessSync(path, fs.constants.W_OK);
  10. return true;
  11. } catch {
  12. return false;
  13. }
  14. };
  15. function useDirectory(directory, options) {
  16. if (options.create) {
  17. fs.mkdirSync(directory, {recursive: true});
  18. }
  19. if (options.thunk) {
  20. return (...arguments_) => path.join(directory, ...arguments_);
  21. }
  22. return directory;
  23. }
  24. function getNodeModuleDirectory(directory) {
  25. const nodeModules = path.join(directory, 'node_modules');
  26. if (
  27. !isWritable(nodeModules)
  28. && (fs.existsSync(nodeModules) || !isWritable(path.join(directory)))
  29. ) {
  30. return;
  31. }
  32. return nodeModules;
  33. }
  34. export default function findCacheDirectory(options = {}) {
  35. if (env.CACHE_DIR && !['true', 'false', '1', '0'].includes(env.CACHE_DIR)) {
  36. return useDirectory(path.join(env.CACHE_DIR, options.name), options);
  37. }
  38. let {cwd: directory = cwd()} = options;
  39. if (options.files) {
  40. directory = commonPathPrefix(options.files.map(file => path.resolve(directory, file)));
  41. }
  42. directory = packageDirectorySync({cwd: directory});
  43. if (!directory) {
  44. return;
  45. }
  46. const nodeModules = getNodeModuleDirectory(directory);
  47. if (!nodeModules) {
  48. return;
  49. }
  50. return useDirectory(path.join(directory, 'node_modules', '.cache', options.name), options);
  51. }