UNPKG

memdisk

Version:

A library and a CLI to create RAM disk on macOS and Linux.

2 lines (1 loc) 7.25 kB
let e;import{mkdirSync as t,rmSync as r,existsSync as o}from"node:fs";import{mkdir as n,rm as i}from"node:fs/promises";import s from"node:path";import{x as l,xSync as a}from"tinyexec";import{platform as c}from"node:process";import{tmpdir as u}from"node:os";import p from"gensync";import f from"fs";import d from"fs/promises";import y from"path";import{extractErrorMessage as m}from"foxts/extract-error-message";import h from"picocolors";import{noop as w}from"foxts/noop";var g,E,$,b,v,x,_={},O={},A={},M={},k=function(){if(x)return v;x=1;let{isexe:e,sync:t}=(b||(b=1,!function(e){var t=_&&_.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),r=_&&_.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=_&&_.__importStar||function(e){if(e&&e.__esModule)return e;var o={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(o,e,n);return r(o,e),o},n=_&&_.__exportStar||function(e,r){for(var o in e)"default"===o||Object.prototype.hasOwnProperty.call(r,o)||t(r,e,o)};Object.defineProperty(e,"__esModule",{value:!0}),e.sync=e.isexe=e.posix=e.win32=void 0;let i=o(function(){if(g)return O;g=1,Object.defineProperty(O,"__esModule",{value:!0}),O.sync=O.isexe=void 0,O.isexe=async(t,r={})=>{let{ignoreErrors:o=!1}=r;try{return e(await (0,d.stat)(t),r)}catch(e){if(o||"EACCES"===e.code)return!1;throw e}},O.sync=(t,r={})=>{let{ignoreErrors:o=!1}=r;try{return e((0,f.statSync)(t),r)}catch(e){if(o||"EACCES"===e.code)return!1;throw e}};let e=(e,r)=>e.isFile()&&t(e,r),t=(e,t)=>{let r=t.uid??process.getuid?.(),o=t.groups??process.getgroups?.()??[],n=t.gid??process.getgid?.()??o[0];if(void 0===r||void 0===n)throw Error("cannot get uid or gid");let i=new Set([n,...o]),s=e.mode,l=e.uid,a=e.gid,c=parseInt("100",8),u=parseInt("010",8);return!!(s&parseInt("001",8)||s&u&&i.has(a)||s&c&&l===r||s&(c|u)&&0===r)};return O}());e.posix=i;let s=o(function(){if(E)return A;E=1,Object.defineProperty(A,"__esModule",{value:!0}),A.sync=A.isexe=void 0,A.isexe=async(t,r={})=>{let{ignoreErrors:o=!1}=r;try{return e(await (0,d.stat)(t),t,r)}catch(e){if(o||"EACCES"===e.code)return!1;throw e}},A.sync=(t,r={})=>{let{ignoreErrors:o=!1}=r;try{return e((0,f.statSync)(t),t,r)}catch(e){if(o||"EACCES"===e.code)return!1;throw e}};let e=(e,t,r)=>e.isFile()&&((e,t)=>{let{pathExt:r=process.env.PATHEXT||""}=t,o=r.split(";");if(-1!==o.indexOf(""))return!0;for(let t=0;t<o.length;t++){let r=o[t].toLowerCase(),n=e.substring(e.length-r.length).toLowerCase();if(r&&n===r)return!0}return!1})(t,r);return A}());e.win32=s,n(($||($=1,Object.defineProperty(M,"__esModule",{value:!0})),M),e);let l="win32"===(process.env._ISEXE_TEST_PLATFORM_||process.platform)?s:i;e.isexe=l.isexe,e.sync=l.sync}(_)),_),{join:r,delimiter:o,sep:n,posix:i}=y,s="win32"===process.platform,l=new RegExp(`[${i.sep}${n===i.sep?"":n}]`.replace(/(\\)/g,"\\$1")),a=RegExp(`^\\.${l.source}`),c=e=>Object.assign(Error(`not found: ${e}`),{code:"ENOENT"}),u=(e,{path:t=process.env.PATH,pathExt:r=process.env.PATHEXT,delimiter:n=o})=>{let i=e.match(l)?[""]:[...s?[process.cwd()]:[],...(t||"").split(n)];if(s){let t=r||[".EXE",".CMD",".BAT",".COM"].join(n),o=t.split(n).flatMap(e=>[e,e.toLowerCase()]);return e.includes(".")&&""!==o[0]&&o.unshift(""),{pathEnv:i,pathExt:o,pathExtExe:t}}return{pathEnv:i,pathExt:[""]}},p=(e,t)=>{let o=/^".*"$/.test(e)?e.slice(1,-1):e;return(!o&&a.test(t)?t.slice(0,2):"")+r(o,t)},m=async(t,r={})=>{let{pathEnv:o,pathExt:n,pathExtExe:i}=u(t,r),s=[];for(let l of o){let o=p(l,t);for(let t of n){let n=o+t;if(await e(n,{pathExt:i,ignoreErrors:!0})){if(!r.all)return n;s.push(n)}}}if(r.all&&s.length)return s;if(r.nothrow)return null;throw c(t)};return v=m,m.sync=(e,r={})=>{let{pathEnv:o,pathExt:n,pathExtExe:i}=u(e,r),s=[];for(let l of o){let o=p(l,e);for(let e of n){let n=o+e;if(t(n,{pathExt:i,ignoreErrors:!0})){if(!r.all)return n;s.push(n)}}}if(r.all&&s.length)return s;if(r.nothrow)return null;throw c(e)},v}(),S=k&&k.__esModule&&Object.prototype.hasOwnProperty.call(k,"default")?k.default:k;let P=p({sync:k.sync,async:S}),j=p(function*(t){return(void 0===e&&(e=yield*P("sudo",{nothrow:!0})),null===e)?t:e+" "+t}),{yellow:R,red:C,blue:T}=h;function F(e=!1){return{warn:e?w:(...e)=>console.warn(R("WARN")+" ",...e),error:e?w:(...e)=>console.error(C("ERROR")+" ",...e),info:e?w:(...e)=>console.info(T("INFO")+" ",...e)}}let I=p({sync:a,async:l}),H=p({sync:t,async:n}),L=p({sync:r,async:i}),N="Initializing RAM disk. You may be prompted for credentials",X="Mouting RAM disk. You may be prompted for credentials",D=e=>`Unmouting RAM disk at ${e}. You may be prompted for credentials`,Y=e=>"darwin"===e||"linux"===e,z=Symbol("not supported");function B(e){return{darwin:{create:p(function*(t,r,o,n){e.info(N);let i=(yield*I(`hdiutil attach -nomount ram://${o/512}`)).stdout.trim();e.info(X),yield*I(`diskutil eraseVolume ${n?"HFS+":"APFS"} ${t} ${i}`)}),destroy:p(function*(t,r){e.info(D(t));let o=`hdiutil detach ${t}`;r&&(o+=" -force"),yield*I(o)})},linux:{create:p(function*(t,r,o,n){e.info(N),yield*I((yield*j(`mkdir -p ${r}`))),e.info(X),yield*I((yield*j(`mount -t tmpfs -o size=${o} tmpfs ${r}`)))}),destroy:p(function*(t,r){e.info(D(t));let o=r?`umount --force ${t}`:`umount ${t}`;yield*I((yield*j(o)))})},[z]:{create:p(function*(t,r,o,n){e.warn(`The current platform "${c}" does not support RAM disks. A temporary directory (which may or may not exists in the RAM) is created at "${r}".`),yield*H(r,{recursive:!0})}),destroy:p(function*(t,r){let o=`Current platform "${c}" does not support RAM disks, attempted to remove the directory "${t}"`;try{yield*L(t,{recursive:!0,force:!0}),e.warn(`${o} and successed.`)}catch(t){e.warn(`${o} but failed`+m(t))}})}}}function U(e){if(e)throw Error(`Unsupported platform "${c}"`)}let V=p(function*(e,{quiet:t=!0,throwOnNotSupportedPlatform:r=!1,force:o=!0}={}){let n=F(t);if(Y(c))return void(yield*B(n)[c].destroy(e,o));U(r),yield*B(n)[z].destroy(e,o)}),W=p(function*(e,t,{quiet:r=!0,throwOnNotSupportedPlatform:n=!1,darwinUseHFSPlus:i=!1}={}){let l=F(r),a="darwin"===c?`/Volumes/${e}`:`/mnt/${e}`;try{if(Y(c)){if(o(a))return l.warn(`The path "${a}" already exists, skipping creation`),a;return yield*B(l)[c].create(e,a,t,i),l.info(`RAM disk is avaliable at ${a}`),a}return U(n),a=s.join(u(),".mocked-memdisk",e),yield*B(l)[z].create(e,a,t,i),a}catch{let e=`Failed to create RAM disk at ${a}`;throw o(a)&&(l.error(`${e}, clean it up`),yield*V(a,{quiet:r,throwOnNotSupportedPlatform:n})),Error(e)}}),q={sync:(...e)=>W.sync.apply(null,e),async:(...e)=>W.async.apply(null,e),errback:(...e)=>W.errback.apply(null,e)},G=(...e)=>W.sync.apply(null,e),J=(...e)=>W.async.apply(null,e),K={sync:(...e)=>V.sync.apply(null,e),async:(...e)=>V.async.apply(null,e),errback:(...e)=>V.errback.apply(null,e)},Q=(...e)=>V.sync.apply(null,e),Z=(...e)=>V.async.apply(null,e);export{q as create,J as createAsync,G as createSync,K as destroy,Z as destroyAsync,Q as destroySync,Y as isSupportedPlatform};