@tezx/localfs
Version:
Local file system helper for TezX framework. Easily upload, read, and delete files on local storage.
1,103 lines (1,099 loc) • 40.8 kB
JavaScript
import path from 'node:path';
import { Router } from 'tezx';
import { Environment, extensionExtract } from '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 = 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 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(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;
}
}
export { LocalFS, LocalFS as default };