UNPKG

@tezx/localfs

Version:

Local file system helper for TezX framework. Easily upload, read, and delete files on local storage.

1,108 lines (1,102 loc) 40.9 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var path = require('node:path'); var tezx = require('tezx'); var helper = require('tezx/helper'); const mimeMap = { "123": "application/vnd.lotus-1-2-3", "ez": "application/andrew-inset", "appinstaller": "application/appinstaller", "aw": "application/applixware", "appx": "application/appx", "appxbundle": "application/appxbundle", "atom": "application/atom+xml", "atomcat": "application/atomcat+xml", "atomdeleted": "application/atomdeleted+xml", "atomsvc": "application/atomsvc+xml", "dwd": "application/atsc-dwd+xml", "held": "application/atsc-held+xml", "rsat": "application/atsc-rsat+xml", "aml": "application/automationml-aml+xml", "amlx": "application/automationml-amlx+zip", "bdoc": "application/x-bdoc", "xcs": "application/calendar+xml", "ccxml": "application/ccxml+xml", "cdfx": "application/cdfx+xml", "cdmia": "application/cdmi-capability", "cdmic": "application/cdmi-container", "cdmid": "application/cdmi-domain", "cdmio": "application/cdmi-object", "cdmiq": "application/cdmi-queue", "cpl": "application/cpl+xml", "cu": "application/cu-seeme", "cwl": "application/cwl", "mpd": "application/dash+xml", "mpp": "application/dash-patch+xml", "davmount": "application/davmount+xml", "dcm": "application/dicom", "dbk": "application/docbook+xml", "dssc": "application/dssc+der", "xdssc": "application/dssc+xml", "ecma": "application/ecmascript", "emma": "application/emma+xml", "emotionml": "application/emotionml+xml", "epub": "application/epub+zip", "exi": "application/exi", "exp": "application/express", "fdf": "application/vnd.fdf", "fdt": "application/fdt+xml", "pfr": "application/font-tdpfr", "geojson": "application/geo+json", "gml": "application/gml+xml", "gpx": "application/gpx+xml", "gxf": "application/gxf", "gz": "application/gzip", "hjson": "application/hjson", "stk": "application/hyperstudio", "ipfix": "application/ipfix", "its": "application/its+xml", "ser": "application/java-serialized-object", "class": "application/java-vm", "js": "text/javascript", "json5": "application/json5", "jsonml": "application/jsonml+json", "jsonld": "application/ld+json", "lgr": "application/lgr+xml", "lostxml": "application/lost+xml", "hqx": "application/mac-binhex40", "cpt": "application/mac-compactpro", "mads": "application/mads+xml", "webmanifest": "application/manifest+json", "mrc": "application/marc", "mrcx": "application/marcxml+xml", "mathml": "application/mathml+xml", "mbox": "application/mbox", "mpf": "application/media-policy-dataset+xml", "mscml": "application/mediaservercontrol+xml", "metalink": "application/metalink+xml", "meta4": "application/metalink4+xml", "mets": "application/mets+xml", "maei": "application/mmt-aei+xml", "musd": "application/mmt-usd+xml", "mods": "application/mods+xml", "msix": "application/msix", "msixbundle": "application/msixbundle", "mxf": "application/mxf", "nq": "application/n-quads", "nt": "application/n-triples", "cjs": "application/node", "oda": "application/oda", "opf": "application/oebps-package+xml", "ogx": "application/ogg", "omdoc": "application/omdoc+xml", "oxps": "application/oxps", "relo": "application/p2p-overlay+xml", "xer": "application/patch-ops-error+xml", "pdf": "application/pdf", "pgp": "application/pgp-encrypted", "asc": "application/pgp-keys", "prf": "application/pics-rules", "p10": "application/pkcs10", "p7s": "application/pkcs7-signature", "p8": "application/pkcs8", "ac": "application/vnd.nokia.n-gage.ac+xml", "cer": "application/pkix-cert", "crl": "application/pkix-crl", "pkipath": "application/pkix-pkipath", "pki": "application/pkixcmp", "pls": "application/pls+xml", "provx": "application/provenance+xml", "cww": "application/prs.cww", "xsf": "application/prs.xsf+xml", "pskcxml": "application/pskc+xml", "raml": "application/raml+yaml", "rif": "application/reginfo+xml", "rnc": "application/relax-ng-compact-syntax", "rl": "application/resource-lists+xml", "rld": "application/resource-lists-diff+xml", "rs": "application/rls-services+xml", "rapd": "application/route-apd+xml", "sls": "application/route-s-tsid+xml", "rusd": "application/route-usd+xml", "gbr": "application/rpki-ghostbusters", "mft": "application/rpki-manifest", "roa": "application/rpki-roa", "rsd": "application/rsd+xml", "rss": "application/rss+xml", "rtf": "application/rtf", "sbml": "application/sbml+xml", "scq": "application/scvp-cv-request", "scs": "application/scvp-cv-response", "spq": "application/scvp-vp-request", "spp": "application/scvp-vp-response", "sdp": "application/sdp", "senmlx": "application/senml+xml", "sensmlx": "application/sensml+xml", "setpay": "application/set-payment-initiation", "setreg": "application/set-registration-initiation", "shf": "application/shf+xml", "rq": "application/sparql-query", "srx": "application/sparql-results+xml", "sql": "application/x-sql", "gram": "application/srgs", "grxml": "application/srgs+xml", "sru": "application/sru+xml", "ssdl": "application/ssdl+xml", "ssml": "application/ssml+xml", "swidtag": "application/swid+xml", "tfi": "application/thraud+xml", "tsd": "application/timestamped-data", "toml": "application/toml", "trig": "application/trig", "ttml": "application/ttml+xml", "ubj": "application/ubjson", "rsheet": "application/urc-ressheet+xml", "td": "application/urc-targetdesc+xml", "1km": "application/vnd.1000minds.decision-model+xml", "plb": "application/vnd.3gpp.pic-bw-large", "psb": "application/vnd.3gpp.pic-bw-small", "pvb": "application/vnd.3gpp.pic-bw-var", "tcap": "application/vnd.3gpp2.tcap", "pwn": "application/vnd.3m.post-it-notes", "aso": "application/vnd.accpac.simply.aso", "imp": "application/vnd.accpac.simply.imp", "acu": "application/vnd.acucobol", "air": "application/vnd.adobe.air-application-installer-package+zip", "fcdt": "application/vnd.adobe.formscentral.fcdt", "xdp": "application/vnd.adobe.xdp+xml", "xfdf": "application/xfdf", "age": "application/vnd.age", "ahead": "application/vnd.ahead.space", "azf": "application/vnd.airzip.filesecure.azf", "azs": "application/vnd.airzip.filesecure.azs", "azw": "application/vnd.amazon.ebook", "acc": "application/vnd.americandynamics.acc", "ami": "application/vnd.amiga.ami", "apk": "application/vnd.android.package-archive", "cii": "application/vnd.anser-web-certificate-issue-initiation", "fti": "application/vnd.anser-web-funds-transfer-initiation", "atx": "application/vnd.antix.game-component", "mpkg": "application/vnd.apple.installer+xml", "key": "application/x-pem-file", "m3u8": "application/vnd.apple.mpegurl", "numbers": "application/x-iwork-numbers-sffnumbers", "pages": "application/x-iwork-pages-sffpages", "pkpass": "application/vnd.apple.pkpass", "swi": "application/vnd.aristanetworks.swi", "iota": "application/vnd.astraea-software.iota", "aep": "application/vnd.audiograph", "fbx": "application/vnd.autodesk.fbx", "bmml": "application/vnd.balsamiq.bmml+xml", "mpm": "application/vnd.blueice.multipass", "bmi": "application/vnd.bmi", "rep": "application/vnd.businessobjects", "cdxml": "application/vnd.chemdraw+xml", "mmd": "application/vnd.chipnuts.karaoke-mmd", "cdy": "application/vnd.cinderella", "csl": "application/vnd.citationstyles.style+xml", "cla": "application/vnd.claymore", "rp9": "application/vnd.cloanto.rp9", "c11amc": "application/vnd.cluetrust.cartomobile-config", "c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", "csp": "application/vnd.commonspace", "cdbcmsg": "application/vnd.contact.cmsg", "cmc": "application/vnd.cosmocaller", "clkx": "application/vnd.crick.clicker", "clkk": "application/vnd.crick.clicker.keyboard", "clkp": "application/vnd.crick.clicker.palette", "clkt": "application/vnd.crick.clicker.template", "clkw": "application/vnd.crick.clicker.wordbank", "wbs": "application/vnd.criticaltools.wbs+xml", "pml": "application/vnd.ctc-posml", "ppd": "application/vnd.cups-ppd", "car": "application/vnd.curl.car", "pcurl": "application/vnd.curl.pcurl", "dart": "application/vnd.dart", "rdz": "application/vnd.data-vision.rdz", "dbf": "application/vnd.dbf", "dcmp": "application/vnd.dcmp+xml", "fe_launch": "application/vnd.denovo.fcselayout-link", "dna": "application/vnd.dna", "mlp": "application/vnd.dolby.mlp", "dpg": "application/vnd.dpgraph", "dfac": "application/vnd.dreamfactory", "kpxx": "application/vnd.ds-keypoint", "ait": "application/vnd.dvb.ait", "svc": "application/vnd.dvb.service", "geo": "application/vnd.dynageo", "mag": "application/vnd.ecowin.chart", "nml": "application/vnd.enliven", "esf": "application/vnd.epson.esf", "msf": "application/vnd.epson.msf", "qam": "application/vnd.epson.quickanime", "slt": "application/vnd.epson.salt", "ssf": "application/vnd.epson.ssf", "ez2": "application/vnd.ezpix-album", "ez3": "application/vnd.ezpix-package", "mseed": "application/vnd.fdsn.mseed", "gph": "application/vnd.flographit", "ftc": "application/vnd.fluxtime.clip", "fnc": "application/vnd.frogans.fnc", "ltf": "application/vnd.frogans.ltf", "fsc": "application/vnd.fsc.weblaunch", "oas": "application/vnd.fujitsu.oasys", "oa2": "application/vnd.fujitsu.oasys2", "oa3": "application/vnd.fujitsu.oasys3", "fg5": "application/vnd.fujitsu.oasysgp", "bh2": "application/vnd.fujitsu.oasysprs", "ddd": "application/vnd.fujixerox.ddd", "xdw": "application/vnd.fujixerox.docuworks", "xbd": "application/vnd.fujixerox.docuworks.binder", "fzs": "application/vnd.fuzzysheet", "txd": "application/vnd.genomatix.tuxedo", "ggb": "application/vnd.geogebra.file", "ggs": "application/vnd.geogebra.slides", "ggt": "application/vnd.geogebra.tool", "gxt": "application/vnd.geonext", "g2w": "application/vnd.geoplan", "g3w": "application/vnd.geospace", "gmx": "application/vnd.gmx", "gdoc": "application/vnd.google-apps.document", "gdraw": "application/vnd.google-apps.drawing", "gform": "application/vnd.google-apps.form", "gjam": "application/vnd.google-apps.jam", "gmap": "application/vnd.google-apps.map", "gslides": "application/vnd.google-apps.presentation", "gscript": "application/vnd.google-apps.script", "gsite": "application/vnd.google-apps.site", "gsheet": "application/vnd.google-apps.spreadsheet", "kml": "application/vnd.google-earth.kml+xml", "kmz": "application/vnd.google-earth.kmz", "xdcf": "application/vnd.gov.sk.xmldatacontainer+xml", "gac": "application/vnd.groove-account", "ghf": "application/vnd.groove-help", "gim": "application/vnd.groove-identity-message", "grv": "application/vnd.groove-injector", "gtm": "application/vnd.groove-tool-message", "tpl": "application/vnd.groove-tool-template", "vcg": "application/vnd.groove-vcard", "hal": "application/vnd.hal+xml", "zmm": "application/vnd.handheld-entertainment+xml", "hbci": "application/vnd.hbci", "les": "application/vnd.hhe.lesson-player", "hpgl": "application/vnd.hp-hpgl", "hpid": "application/vnd.hp-hpid", "hps": "application/vnd.hp-hps", "jlt": "application/vnd.hp-jlyt", "pcl": "application/vnd.hp-pcl", "pclxl": "application/vnd.hp-pclxl", "sfd-hdstx": "application/vnd.hydrostatix.sof-data", "mpy": "application/vnd.ibm.minipay", "irm": "application/vnd.ibm.rights-management", "sc": "application/vnd.ibm.secure-container", "igl": "application/vnd.igloader", "ivp": "application/vnd.immervision-ivp", "ivu": "application/vnd.immervision-ivu", "igm": "application/vnd.insors.igm", "i2g": "application/vnd.intergeo", "qbo": "application/vnd.intu.qbo", "qfx": "application/vnd.intu.qfx", "rcprofile": "application/vnd.ipunplugged.rcprofile", "irp": "application/vnd.irepository.package+xml", "xpr": "application/vnd.is-xpr", "fcs": "application/vnd.isac.fcs", "jam": "application/vnd.jam", "rms": "application/vnd.jcp.javame.midlet-rms", "jisp": "application/vnd.jisp", "joda": "application/vnd.joost.joda-archive", "karbon": "application/vnd.kde.karbon", "chrt": "application/vnd.kde.kchart", "kfo": "application/vnd.kde.kformula", "flw": "application/vnd.kde.kivio", "kon": "application/vnd.kde.kontour", "ksp": "application/vnd.kde.kspread", "htke": "application/vnd.kenameaapp", "kia": "application/vnd.kidspiration", "sse": "application/vnd.kodak-descriptor", "lasxml": "application/vnd.las.las+xml", "lbd": "application/vnd.llamagraphics.life-balance.desktop", "lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", "apr": "application/vnd.lotus-approach", "pre": "application/vnd.lotus-freelance", "nsf": "application/vnd.lotus-notes", "org": "text/x-org", "scm": "application/vnd.lotus-screencam", "lwp": "application/vnd.lotus-wordpro", "portpkg": "application/vnd.macports.portpkg", "mvt": "application/vnd.mapbox-vector-tile", "mcd": "application/vnd.mcd", "mc1": "application/vnd.medcalcdata", "cdkey": "application/vnd.mediastation.cdkey", "mwf": "application/vnd.mfer", "mfm": "application/vnd.mfmp", "flo": "application/vnd.micrografx.flo", "igx": "application/vnd.micrografx.igx", "mif": "application/vnd.mif", "daf": "application/vnd.mobius.daf", "dis": "application/vnd.mobius.dis", "mbk": "application/vnd.mobius.mbk", "mqy": "application/vnd.mobius.mqy", "msl": "application/vnd.mobius.msl", "plc": "application/vnd.mobius.plc", "txf": "application/vnd.mobius.txf", "mpn": "application/vnd.mophun.application", "mpc": "application/vnd.mophun.certificate", "xul": "application/vnd.mozilla.xul+xml", "cil": "application/vnd.ms-artgalry", "cab": "application/vnd.ms-cab-compressed", "xlam": "application/vnd.ms-excel.addin.macroenabled.12", "xlsb": "application/vnd.ms-excel.sheet.binary.macroenabled.12", "xlsm": "application/vnd.ms-excel.sheet.macroenabled.12", "xltm": "application/vnd.ms-excel.template.macroenabled.12", "eot": "application/vnd.ms-fontobject", "chm": "application/vnd.ms-htmlhelp", "ims": "application/vnd.ms-ims", "lrm": "application/vnd.ms-lrm", "thmx": "application/vnd.ms-officetheme", "msg": "application/vnd.ms-outlook", "cat": "application/vnd.ms-pki.seccat", "stl": "model/stl", "ppam": "application/vnd.ms-powerpoint.addin.macroenabled.12", "pptm": "application/vnd.ms-powerpoint.presentation.macroenabled.12", "sldm": "application/vnd.ms-powerpoint.slide.macroenabled.12", "ppsm": "application/vnd.ms-powerpoint.slideshow.macroenabled.12", "potm": "application/vnd.ms-powerpoint.template.macroenabled.12", "vdx": "application/vnd.ms-visio.viewer", "docm": "application/vnd.ms-word.document.macroenabled.12", "dotm": "application/vnd.ms-word.template.macroenabled.12", "wpl": "application/vnd.ms-wpl", "xps": "application/vnd.ms-xpsdocument", "mseq": "application/vnd.mseq", "mus": "application/vnd.musician", "msty": "application/vnd.muvee.style", "taglet": "application/vnd.mynfc", "bdo": "application/vnd.nato.bindingdataobject+xml", "nlu": "application/vnd.neurolanguage.nlu", "nnd": "application/vnd.noblenet-directory", "nns": "application/vnd.noblenet-sealer", "nnw": "application/vnd.noblenet-web", "ngdat": "application/vnd.nokia.n-gage.data", "n-gage": "application/vnd.nokia.n-gage.symbian.install", "rpst": "application/vnd.nokia.radio-preset", "rpss": "application/vnd.nokia.radio-presets", "edm": "application/vnd.novadigm.edm", "edx": "application/vnd.novadigm.edx", "ext": "application/vnd.novadigm.ext", "odc": "application/vnd.oasis.opendocument.chart", "otc": "application/vnd.oasis.opendocument.chart-template", "odb": "application/vnd.oasis.opendocument.database", "odf": "application/vnd.oasis.opendocument.formula", "odft": "application/vnd.oasis.opendocument.formula-template", "odg": "application/vnd.oasis.opendocument.graphics", "otg": "application/vnd.oasis.opendocument.graphics-template", "odi": "application/vnd.oasis.opendocument.image", "oti": "application/vnd.oasis.opendocument.image-template", "odp": "application/vnd.oasis.opendocument.presentation", "otp": "application/vnd.oasis.opendocument.presentation-template", "ods": "application/vnd.oasis.opendocument.spreadsheet", "ots": "application/vnd.oasis.opendocument.spreadsheet-template", "odt": "application/vnd.oasis.opendocument.text", "odm": "application/vnd.oasis.opendocument.text-master", "ott": "application/vnd.oasis.opendocument.text-template", "oth": "application/vnd.oasis.opendocument.text-web", "xo": "application/vnd.olpc-sugar", "dd2": "application/vnd.oma.dd2+xml", "obgx": "application/vnd.openblox.game+xml", "oxt": "application/vnd.openofficeorg.extension", "osm": "application/vnd.openstreetmap.data+xml", "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", "ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", "potx": "application/vnd.openxmlformats-officedocument.presentationml.template", "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", "mgp": "application/vnd.osgeo.mapguide.package", "dp": "application/vnd.osgi.dp", "esa": "application/vnd.osgi.subsystem", "paw": "application/vnd.pawaafile", "str": "application/vnd.pg.format", "ei6": "application/vnd.pg.osasli", "efif": "application/vnd.picsel", "wg": "application/vnd.pmi.widget", "plf": "application/vnd.pocketlearn", "pbd": "application/vnd.powerbuilder6", "box": "application/vnd.previewsystems.box", "brushset": "application/vnd.procrate.brushset", "brush": "application/vnd.procreate.brush", "drm": "application/vnd.procreate.dream", "mgz": "application/vnd.proteus.magazine", "qps": "application/vnd.publishare-delta-tree", "ptid": "application/vnd.pvi.ptid1", "xhtm": "application/vnd.pwg-xhtml-print+xml", "rar": "application/x-rar-compressed", "bed": "application/vnd.realvnc.bed", "mxl": "application/vnd.recordare.musicxml", "musicxml": "application/vnd.recordare.musicxml+xml", "cryptonote": "application/vnd.rig.cryptonote", "cod": "application/vnd.rim.cod", "rm": "application/vnd.rn-realmedia", "rmvb": "application/vnd.rn-realmedia-vbr", "link66": "application/vnd.route66.link66+xml", "st": "application/vnd.sailingtracker.track", "see": "application/vnd.seemail", "sema": "application/vnd.sema", "semd": "application/vnd.semd", "semf": "application/vnd.semf", "ifm": "application/vnd.shana.informed.formdata", "itp": "application/vnd.shana.informed.formtemplate", "iif": "application/vnd.shana.informed.interchange", "ipk": "application/vnd.shana.informed.package", "mmf": "application/vnd.smaf", "teacher": "application/vnd.smart.teacher", "fo": "application/vnd.software602.filler.form+xml", "dxp": "application/vnd.spotfire.dxp", "sfs": "application/vnd.spotfire.sfs", "sdc": "application/vnd.stardivision.calc", "sda": "application/vnd.stardivision.draw", "sdd": "application/vnd.stardivision.impress", "smf": "application/vnd.stardivision.math", "sgl": "application/vnd.stardivision.writer-global", "smzip": "application/vnd.stepmania.package", "sm": "application/vnd.stepmania.stepchart", "wadl": "application/vnd.sun.wadl+xml", "sxc": "application/vnd.sun.xml.calc", "stc": "application/vnd.sun.xml.calc.template", "sxd": "application/vnd.sun.xml.draw", "std": "application/vnd.sun.xml.draw.template", "sxi": "application/vnd.sun.xml.impress", "sti": "application/vnd.sun.xml.impress.template", "sxm": "application/vnd.sun.xml.math", "sxw": "application/vnd.sun.xml.writer", "sxg": "application/vnd.sun.xml.writer.global", "stw": "application/vnd.sun.xml.writer.template", "svd": "application/vnd.svd", "xsm": "application/vnd.syncml+xml", "bdm": "application/vnd.syncml.dm+wbxml", "xdm": "application/vnd.syncml.dm+xml", "ddf": "application/vnd.syncml.dmddf+xml", "tao": "application/vnd.tao.intent-module-archive", "tmo": "application/vnd.tmobile-livetv", "tpt": "application/vnd.trid.tpt", "mxs": "application/vnd.triscape.mxs", "tra": "application/vnd.trueapp", "utz": "application/vnd.uiq.theme", "umj": "application/vnd.umajin", "unityweb": "application/vnd.unity", "vcx": "application/vnd.vcx", "vis": "application/vnd.visionary", "vsf": "application/vnd.vsf", "wbxml": "application/vnd.wap.wbxml", "wmlc": "application/vnd.wap.wmlc", "wmlsc": "application/vnd.wap.wmlscriptc", "wtb": "application/vnd.webturbo", "nbp": "application/vnd.wolfram.player", "wpd": "application/vnd.wordperfect", "wqd": "application/vnd.wqd", "stf": "application/vnd.wt.stf", "xar": "application/vnd.xara", "xfdl": "application/vnd.xfdl", "hvd": "application/vnd.yamaha.hv-dic", "hvs": "application/vnd.yamaha.hv-script", "hvp": "application/vnd.yamaha.hv-voice", "osf": "application/vnd.yamaha.openscoreformat", "osfpvg": "application/vnd.yamaha.openscoreformat.osfpvg+xml", "saf": "application/vnd.yamaha.smaf-audio", "spf": "application/vnd.yamaha.smaf-phrase", "cmp": "application/vnd.yellowriver-custom-menu", "zaz": "application/vnd.zzazz.deck+xml", "vxml": "application/voicexml+xml", "wasm": "application/wasm", "wif": "application/watcherinfo+xml", "wgt": "application/widget", "hlp": "application/winhlp", "wsdl": "application/wsdl+xml", "wspolicy": "application/wspolicy+xml", "7z": "application/x-7z-compressed", "abw": "application/x-abiword", "ace": "application/x-ace-compressed", "dmg": "application/x-apple-diskimage", "arj": "application/x-arj", "aam": "application/x-authorware-map", "aas": "application/x-authorware-seg", "bcpio": "application/x-bcpio", "torrent": "application/x-bittorrent", "blend": "application/x-blender", "bz": "application/x-bzip", "vcd": "application/x-cdlink", "cfs": "application/x-cfs-compressed", "chat": "application/x-chat", "pgn": "application/x-chess-pgn", "crx": "application/x-chrome-extension", "cco": "application/x-cocoa", "nsc": "application/x-conference", "cpio": "application/x-cpio", "csh": "application/x-csh", "dgc": "application/x-dgc-compressed", "wad": "application/x-doom", "ncx": "application/x-dtbncx+xml", "dtb": "application/x-dtbook+xml", "res": "application/x-dtbresource+xml", "dvi": "application/x-dvi", "evy": "application/x-envoy", "eva": "application/x-eva", "bdf": "application/x-font-bdf", "gsf": "application/x-font-ghostscript", "psf": "application/x-font-linux-psf", "pcf": "application/x-font-pcf", "snf": "application/x-font-snf", "arc": "application/x-freearc", "spl": "application/x-futuresplash", "gca": "application/x-gca-compressed", "ulx": "application/x-glulx", "gnumeric": "application/x-gnumeric", "gramps": "application/x-gramps-xml", "gtar": "application/x-gtar", "hdf": "application/x-hdf", "php": "application/x-httpd-php", "install": "application/x-install-instructions", "ipynb": "application/x-ipynb+json", "iso": "application/x-iso9660-image", "jardiff": "application/x-java-archive-diff", "jnlp": "application/x-java-jnlp-file", "kdbx": "application/x-keepass2", "latex": "application/x-latex", "luac": "application/x-lua-bytecode", "run": "application/x-makeself", "mie": "application/x-mie", "application": "application/x-ms-application", "lnk": "application/x-ms-shortcut", "wmd": "application/x-ms-wmd", "wmz": "application/x-ms-wmz", "xbap": "application/x-ms-xbap", "mdb": "application/x-msaccess", "obd": "application/x-msbinder", "crd": "application/x-mscardfile", "clp": "application/x-msclip", "exe": "application/x-msdownload", "mny": "application/x-msmoney", "pub": "application/x-mspublisher", "scd": "application/x-msschedule", "trm": "application/x-msterminal", "wri": "application/x-mswrite", "pac": "application/x-ns-proxy-autoconfig", "nzb": "application/x-nzb", "p7r": "application/x-pkcs7-certreqresp", "rpm": "application/x-redhat-package-manager", "ris": "application/x-research-info-systems", "sea": "application/x-sea", "sh": "application/x-sh", "shar": "application/x-shar", "swf": "application/x-shockwave-flash", "xap": "application/x-silverlight-app", "sit": "application/x-stuffit", "sitx": "application/x-stuffitx", "srt": "application/x-subrip", "sv4cpio": "application/x-sv4cpio", "sv4crc": "application/x-sv4crc", "t3": "application/x-t3vm-image", "gam": "application/x-tads", "tar": "application/x-tar", "tex": "application/x-tex", "tfm": "application/x-tex-tfm", "obj": "model/obj", "ustar": "application/x-ustar", "hdd": "application/x-virtualbox-hdd", "ova": "application/x-virtualbox-ova", "ovf": "application/x-virtualbox-ovf", "vbox": "application/x-virtualbox-vbox", "vbox-extpack": "application/x-virtualbox-vbox-extpack", "vdi": "application/x-virtualbox-vdi", "vhd": "application/x-virtualbox-vhd", "vmdk": "application/x-virtualbox-vmdk", "src": "application/x-wais-source", "webapp": "application/x-web-app-manifest+json", "fig": "application/x-xfig", "xlf": "application/xliff+xml", "xpi": "application/x-xpinstall", "xz": "application/x-xz", "zip": "application/zip", "xaml": "application/xaml+xml", "xav": "application/xcap-att+xml", "xca": "application/xcap-caps+xml", "xdf": "application/xcap-diff+xml", "xel": "application/xcap-el+xml", "xns": "application/xcap-ns+xml", "xenc": "application/xenc+xml", "dtd": "application/xml-dtd", "xop": "application/xop+xml", "xpl": "application/xproc+xml", "xspf": "application/xspf+xml", "yang": "application/yang", "yin": "application/yin+xml", "lottie": "application/zip+dotlottie", "3gpp": "audio/3gpp", "adp": "audio/adpcm", "amr": "audio/amr", "mxmf": "audio/mobile-xmf", "mp3": "audio/mpeg", "s3m": "audio/s3m", "sil": "audio/silk", "eol": "audio/vnd.digital-winds", "dra": "audio/vnd.dra", "dts": "audio/vnd.dts", "dtshd": "audio/vnd.dts.hd", "lvp": "audio/vnd.lucent.voice", "pya": "audio/vnd.ms-playready.media.pya", "ecelp4800": "audio/vnd.nuera.ecelp4800", "ecelp7470": "audio/vnd.nuera.ecelp7470", "ecelp9600": "audio/vnd.nuera.ecelp9600", "rip": "audio/vnd.rip", "wav": "audio/wav", "weba": "audio/webm", "aac": "audio/aac", "caf": "audio/x-caf", "flac": "audio/flac", "m4a": "audio/mp4", "mka": "audio/x-matroska", "m3u": "audio/x-mpegurl", "wax": "audio/x-ms-wax", "wma": "audio/x-ms-wma", "rmp": "audio/x-pn-realaudio-plugin", "ra": "audio/x-realaudio", "xm": "audio/xm", "cdx": "chemical/x-cdx", "cif": "chemical/x-cif", "cmdf": "chemical/x-cmdf", "cml": "chemical/x-cml", "csml": "chemical/x-csml", "xyz": "chemical/x-xyz", "ttc": "font/collection", "otf": "font/otf", "ttf": "font/ttf", "woff": "font/woff", "woff2": "font/woff2", "exr": "image/aces", "apng": "image/apng", "avci": "image/avci", "avcs": "image/avcs", "avif": "image/avif", "cgm": "image/cgm", "drle": "image/dicom-rle", "dpx": "image/dpx", "emf": "image/emf", "fits": "image/fits", "g3": "image/g3fax", "gif": "image/gif", "heic": "image/heic", "heics": "image/heic-sequence", "heif": "image/heif", "heifs": "image/heif-sequence", "hej2": "image/hej2k", "ief": "image/ief", "jaii": "image/jaii", "jais": "image/jais", "jls": "image/jls", "jph": "image/jph", "jhc": "image/jphc", "jxl": "image/jxl", "jxr": "image/jxr", "jxra": "image/jxra", "jxrs": "image/jxrs", "jxs": "image/jxs", "jxsc": "image/jxsc", "jxsi": "image/jxsi", "jxss": "image/jxss", "ktx": "image/ktx", "ktx2": "image/ktx2", "jfif": "image/pjpeg", "png": "image/png", "pti": "image/prs.pti", "sgi": "image/sgi", "t38": "image/t38", "tfx": "image/tiff-fx", "psd": "image/vnd.adobe.photoshop", "azv": "image/vnd.airzip.accelerator.azv", "sub": "text/vnd.dvb.subtitle", "dwg": "image/vnd.dwg", "dxf": "image/vnd.dxf", "fbs": "image/vnd.fastbidsheet", "fpx": "image/vnd.fpx", "fst": "image/vnd.fst", "mmr": "image/vnd.fujixerox.edmics-mmr", "rlc": "image/vnd.fujixerox.edmics-rlc", "ico": "image/x-icon", "dds": "image/vnd.ms-dds", "mdi": "image/vnd.ms-modi", "wdp": "image/vnd.ms-photo", "npx": "image/vnd.net-fpx", "b16": "image/vnd.pco.b16", "tap": "image/vnd.tencent.tap", "vtf": "image/vnd.valve.source.texture", "wbmp": "image/vnd.wap.wbmp", "xif": "image/vnd.xiff", "pcx": "image/x-pcx", "webp": "image/webp", "wmf": "image/wmf", "3ds": "image/x-3ds", "dng": "image/x-adobe-dng", "ras": "image/x-cmu-raster", "cmx": "image/x-cmx", "jng": "image/x-jng", "sid": "image/x-mrsid-image", "bmp": "image/bmp", "pnm": "image/x-portable-anymap", "pbm": "image/x-portable-bitmap", "pgm": "image/x-portable-graymap", "ppm": "image/x-portable-pixmap", "rgb": "image/x-rgb", "tga": "image/x-tga", "xbm": "image/x-xbitmap", "xpm": "image/x-xpixmap", "xwd": "image/x-xwindowdump", "disposition-notification": "message/disposition-notification", "u8msg": "message/global", "u8dsn": "message/global-delivery-status", "u8mdn": "message/global-disposition-notification", "u8hdr": "message/global-headers", "wsc": "message/vnd.wfa.wsc", "3mf": "model/3mf", "gltf": "model/gltf+json", "glb": "model/gltf-binary", "jt": "model/jt", "mtl": "model/mtl", "prc": "model/prc", "stpx": "model/step+xml", "stpz": "model/step+zip", "stpxz": "model/step-xml+zip", "u3d": "model/u3d", "bary": "model/vnd.bary", "cld": "model/vnd.cld", "dae": "model/vnd.collada+xml", "dwf": "model/vnd.dwf", "gdl": "model/vnd.gdl", "gtw": "model/vnd.gtw", "mts": "model/vnd.mts", "ogex": "model/vnd.opengex", "x_b": "model/vnd.parasolid.transmit.binary", "x_t": "model/vnd.parasolid.transmit.text", "vds": "model/vnd.sap.vds", "usda": "model/vnd.usda", "usdz": "model/vnd.usdz+zip", "bsp": "model/vnd.valve.source.compiled-map", "vtu": "model/vnd.vtu", "x3db": "model/x3d+fastinfoset", "x3dv": "model/x3d-vrml", "css": "text/css", "csv": "text/csv", "jade": "text/jade", "jsx": "text/jsx", "less": "text/less", "mml": "text/mathml", "mdx": "text/mdx", "n3": "text/n3", "dsc": "text/prs.lines.tag", "rtx": "text/richtext", "shex": "text/shex", "spdx": "text/spdx", "tsv": "text/tab-separated-values", "ttl": "text/turtle", "vcard": "text/vcard", "curl": "text/vnd.curl", "dcurl": "text/vnd.curl.dcurl", "mcurl": "text/vnd.curl.mcurl", "scurl": "text/vnd.curl.scurl", "ged": "text/vnd.familysearch.gedcom", "fly": "text/vnd.fly", "flx": "text/vnd.fmi.flexstor", "gv": "text/vnd.graphviz", "3dml": "text/vnd.in3d.3dml", "spot": "text/vnd.in3d.spot", "jad": "text/vnd.sun.j2me.app-descriptor", "wml": "text/vnd.wap.wml", "wmls": "text/vnd.wap.wmlscript", "vtt": "text/vtt", "wgsl": "text/wgsl", "htc": "text/x-component", "hbs": "text/x-handlebars-template", "java": "text/x-java-source", "lua": "text/x-lua", "mkd": "text/x-markdown", "nfo": "text/x-nfo", "opml": "text/x-opml", "pde": "text/x-processing", "sass": "text/x-sass", "scss": "text/x-scss", "etx": "text/x-setext", "sfv": "text/x-sfv", "ymp": "text/x-suse-ymp", "uu": "text/x-uuencode", "vcs": "text/x-vcalendar", "vcf": "text/vcard", "xml": "application/xml", "3g2": "video/3gpp2", "h261": "video/h261", "h263": "video/h263", "h264": "video/h264", "m4s": "video/iso.segment", "jpgv": "video/jpeg", "ogv": "video/ogg", "dvb": "video/vnd.dvb.file", "fvt": "video/vnd.fvt", "pyv": "video/vnd.ms-playready.media.pyv", "viv": "video/vnd.vivo", "webm": "video/webm", "f4v": "video/x-f4v", "fli": "video/x-fli", "flv": "video/x-flv", "m4v": "video/x-m4v", "mng": "video/x-mng", "vob": "video/x-ms-vob", "wm": "video/x-ms-wm", "wmv": "video/x-ms-wmv", "wmx": "video/x-ms-wmx", "wvx": "video/x-ms-wvx", "avi": "video/x-msvideo", "movie": "video/x-sgi-movie", "smv": "video/x-smv", "ice": "x-conference/x-cooltalk", "html": "text/html", "htm": "text/html", "mjs": "text/javascript", "json": "application/json", "txt": "text/plain", "md": "text/markdown", "markdown": "text/markdown", "jpg": "image/jpeg", "jpeg": "image/jpeg", "svg": "image/svg+xml", "tiff": "image/tiff", "mp4": "video/mp4", "ogg": "video/ogg", "mov": "video/quicktime", "3gp": "video/3gpp", "mid": "audio/midi", "midi": "audio/midi", "_7z": "application/x-7z-compressed", "bz2": "application/x-bzip2", "doc": "application/msword", "xls": "application/vnd.ms-excel", "ppt": "application/vnd.ms-powerpoint", "map": "application/json", "yaml": "application/yaml", "yml": "application/yaml", "proto": "text/plain", "graphql": "application/graphql", "pem": "application/x-pem-file", "crt": "application/x-x509-ca-cert", "pfx": "application/x-pkcs12", "deb": "application/x-debian-package", "ics": "text/calendar", "warc": "application/warc", "dll": "application/x-msdownload", "py": "text/x-python", "rb": "text/x-ruby", "pl": "text/x-perl", "ipa": "application/vnd.iphone", "eps": "application/postscript", "ps": "application/postscript", "ai": "application/postscript", "jar": "application/java-archive", "gcode": "text/x.gcode" }; function getMimeTypeFromExtension(ext) { return mimeMap[ext] || null; } class LocalFS { basePath; publicUrl; allowPublicAccess; autoRenameOnConflict; maxFileSize; allowedTypes; runtime = helper.Environment.getEnvironment; /** * Creates a new LocalFS instance. * @param options - Storage configuration options */ constructor(options = {}) { this.basePath = options.basePath || "uploads"; this.publicUrl = options.publicUrl || "/uploads"; this.allowPublicAccess = options.allowPublicAccess ?? true; this.autoRenameOnConflict = options.autoRenameOnConflict ?? true; this.maxFileSize = options.maxFileSize || 5 * 1024 * 1024; this.allowedTypes = options.allowedTypes || ["image/*"]; } /** * Saves a file to disk after validating its MIME type and size. * @param fileName - The desired file name * @param buffer - The file buffer * @param mimeType - Optional MIME type override * @returns File save info: path, name, and public URL */ async saveFile(fileName, buffer, mimeType) { if (buffer.length > this.maxFileSize) { throw new Error(`File exceeds max size of ${this.maxFileSize} bytes`); } const type = mimeType || this.#getMimeType(fileName) || "application/octet-stream"; if (!this.#isTypeAllowed(type)) { throw new Error(`File type ${type} is not allowed`); } const { finalPath, fileName: finalFileName } = await this.#resolveFileName(path.join(this.basePath, fileName)); await this.#ensureDir(path.dirname(finalPath)); if (this.runtime === "deno") { await Deno.writeFile(finalPath, buffer); } else { const { writeFile } = await import('node:fs/promises'); await writeFile(finalPath, buffer); } const body = { savedPath: finalPath, fileName: finalFileName, publicUrl: this.allowPublicAccess ? this.getPublicUrl(path.relative(this.basePath, finalPath)) : void 0 }; return body; } /** * Deletes a file from disk. * @param fileName - Relative file path */ async deleteFile(fileName) { const fullPath = path.join(this.basePath, fileName); if (await this.#exists(fullPath)) { if (this.runtime === "deno") { await Deno.remove(fullPath, { recursive: true }); } else { const { unlink } = await import('node:fs/promises'); await unlink(fullPath); } } } /** * Reads a file and returns its buffer. * @param fileName - File name * @returns File contents as a Buffer */ async readFile(fileName) { const fullPath = path.join(this.basePath, fileName); if (this.runtime === "deno") { return await Deno.readFile(fullPath); } else { const { readFile } = await import('node:fs/promises'); return await readFile(fullPath); } } /** * Lists all files in a directory. * @param folder - Optional sub-folder * @param recursive - List files recursively. `default: false` * @returns Array of file paths relative to the base path */ async listFiles(folder = "", recursive = false) { const fullPath = path.join(this.basePath, folder); await this.#ensureDir(fullPath); if (this.runtime === "deno") { return await this.#listFilesDeno(fullPath, recursive); } else { const { readdir } = await import('node:fs/promises'); if (!recursive) { return await readdir(fullPath); } const result = []; async function walk(dir) { const { readdir: readdir2 } = await import('node:fs/promises'); const entries = await readdir2(dir, { withFileTypes: true }); for (const entry of entries) { const entryPath = path.join(dir, entry.name); if (entry.isDirectory()) { await walk(entryPath); } else { result.push(path.relative(fullPath, entryPath)); } } } await walk(fullPath); return result; } } /** * Adds a route to serve files publicly from the storage. * @param config - Optional error handler * @returns {Router} A TezX Router */ serveFileResponse(config) { const onError = config?.onError || ((error, ctx) => ctx.json({ success: false, message: error })); if (!this.allowPublicAccess) throw new Error("Public access is disabled"); const router = new tezx.Router(); router.get(path.join(this.publicUrl, "/*filename"), async (ctx) => { return ctx.sendFile(path.join(this.basePath, ctx?.req?.params?.filename)).catch((error) => { return onError(error?.message, ctx); }); }); return router; } /** * Generates the public URL for a file. * @param fileName - File name (relative to basePath) * @returns The public URL */ getPublicUrl(fileName) { if (!this.allowPublicAccess) throw new Error("Public access is disabled"); return path.join(this.publicUrl, fileName).replace(/\\/g, "/"); } // ---------- Private Helper Methods ---------- async #ensureDir(dir) { if (this.runtime === "deno") { await Deno.mkdir(dir, { recursive: true }); } else { const { mkdir } = await import('node:fs/promises'); await mkdir(dir, { recursive: true }); } } #getMimeType(fileName) { return getMimeTypeFromExtension(helper.extensionExtract(fileName).toLowerCase()) || "application/octet-stream"; } async #resolveFileName(filePath) { let counter = 1; const ext = path.extname(filePath); const base = path.basename(filePath, ext); const dir = path.dirname(filePath); let finalFileName = `${base}${ext}`; let finalPath = path.join(dir, finalFileName); if (!this.autoRenameOnConflict) return { fileName: finalFileName, finalPath }; while (await this.#exists(finalPath)) { finalFileName = `${base}_${counter++}${ext}`; finalPath = path.join(dir, finalFileName); } return { fileName: finalFileName, finalPath }; } async #exists(filePath) { try { if (this.runtime === "deno") { Deno.statSync(filePath); return true; } else { const { access } = await import('node:fs/promises'); await access(filePath); return true; } } catch { return false; } } #isTypeAllowed(mimeType) { return this.allowedTypes.some( (allowed) => allowed === "*" || (allowed.endsWith("/*") ? mimeType.startsWith(allowed.slice(0, -1)) : allowed === mimeType) ); } async #listFilesDeno(dir, recursive = false, basePath = dir, result = []) { for await (const entry of Deno.readDir(dir)) { const entryPath = path.join(dir, entry.name); if (entry.isDirectory && recursive) { await this.#listFilesDeno(entryPath, recursive, basePath, result); } else { result.push(path.relative(basePath, entryPath)); } } return result; } } exports.LocalFS = LocalFS; exports.default = LocalFS;