diff --git a/deno.json b/deno.json index df9bcff..c919db2 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,7 @@ { "tasks": { - "install": "deno install -f -A --unstable --no-lock -n tsx server.tsx" + "install": "deno install -f -A --unstable --no-lock -n tsx server.tsx", + "run": "deno run -A --unstable --no-lock server.tsx" } } \ No newline at end of file diff --git a/deno.lock b/deno.lock deleted file mode 100644 index f896ca5..0000000 --- a/deno.lock +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": "2", - "remote": { - "https://deno.land/std@0.151.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", - "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", - "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", - "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", - "https://deno.land/x/esbuild@v0.14.45/mod.js": "ab18347f6a57e56f776a9997a5b726f7f6c8d1f008f08e41e7273be8c31e12f4" - } -} diff --git a/server.tsx b/server.tsx index 2664a9a..e86a661 100644 --- a/server.tsx +++ b/server.tsx @@ -1,108 +1,77 @@ import * as ESBuild from 'https://deno.land/x/esbuild@v0.14.45/mod.js'; +import * as MIME from "https://deno.land/std@0.180.0/media_types/mod.ts"; import { debounce } from "https://deno.land/std@0.151.0/async/debounce.ts"; + console.log(`Serving files from "${Deno.cwd()}"`); -const MIME:Record = { - ".aac": "audio/aac", - ".abw": "application/x-abiword", - ".arc": "application/x-freearc", - ".avif": "image/avif", - ".avi": "video/x-msvideo", - ".azw": "application/vnd.amazon.ebook", - ".bin": "application/octet-stream", - ".bmp": "image/bmp", - ".bz": "application/x-bzip", - ".bz2": "application/x-bzip2", - ".cda": "application/x-cdf", - ".csh": "application/x-csh", - ".css": "text/css", - ".csv": "text/csv", - ".doc": "application/msword", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".eot": "application/vnd.ms-fontobject", - ".epub": "application/epub+zip", - ".gz": "application/gzip", - ".gif": "image/gif", - ".htm": "text/html", - ".html": "text/html", - ".ico": "image/x-icon", - ".ics": "text/calendar", - ".jar": "application/java-archive", - ".jpeg": "image/jpeg", - ".jpg": "image/jpeg", - ".js": "application/javascript", - ".jsx": "application/javascript", - ".json": "application/json", - ".jsonld": "application/ld+json", - ".mid": "audio/midi", - ".midi": "audio/midi", - ".mjs": "text/javascript", - ".mp3": "audio/mpeg", - ".mp4": "video/mp4", - ".mpeg": "video/mpeg", - ".mpkg": "application/vnd.apple.installer+xml", - ".odp": "application/vnd.oasis.opendocument.presentation", - ".ods": "application/vnd.oasis.opendocument.spreadsheet", - ".odt": "application/vnd.oasis.opendocument.text", - ".oga": "audio/ogg", - ".ogv": "video/ogg", - ".ogx": "application/ogg", - ".opus": "audio/opus", - ".otf": "font/otf", - ".png": "image/png", - ".pdf": "application/pdf", - ".php": "application/x-httpd-php", - ".ppt": "application/vnd.ms-powerpoint", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".rar": "application/vnd.rar", - ".rtf": "application/rtf", - ".sh": "application/x-sh", - ".svg": "image/svg+xml", - ".swf": "application/x-shockwave-flash", - ".tar": "application/x-tar", - ".tif": "image/tiff", - ".tiff": "image/tiff", - ".ts": "application/javascript", - ".tsx": "application/javascript", - ".ttf": "font/ttf", - ".txt": "text/plain", - ".vsd": "application/vnd.visio", - ".wav": "audio/wav", - ".weba": "audio/webm", - ".webm": "video/webm", - ".webp": "image/webp", - ".woff": "font/woff", - ".woff2": "font/woff2", - ".xhtml": "application/xhtml+xml", - ".xls": "application/vnd.ms-excel", - ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xml": "application/xml", - ".xul": "application/vnd.mozilla.xul+xml", - ".zip": "application/zip", - ".3gp": "video/3gpp", - ".3g2": "video/3gpp2", - ".7z": "application/x-7z-compressed" -}; -const Type =(inPath:string):string|undefined=> -{ - const dot:number = inPath.lastIndexOf("."); - const ext = dot > -1 ? inPath.substring(dot) : ".html"; - return MIME[ext]; -}; - const Transpiled = new Map(); -const Transpile =async(inPath:string, inKey:string):Promise=> +/** + * checks for (.tsx | .jsx | .ts | .js) extensions + */ +export const Transpileable =(inFilePath:string):boolean=> +{ + let dotIndex = inFilePath.length-4; + if(inFilePath[dotIndex] !== ".") + { + if(inFilePath[++dotIndex] !== ".") + { + return false; + } + } + + if(inFilePath[dotIndex+2] == "s") + { + const first = inFilePath[dotIndex+1]; + return (first == "t" || first == "j"); + } + + return false; +}; +export const Transpile =async(inPath:string, inKey:string):Promise=> { const body = await Deno.readTextFile(inPath); - const transpile = await ESBuild.transform(body, { loader: "tsx", sourcemap: "inline" }); + const transpile = await ESBuild.transform(body, { loader: "tsx", sourcemap: "inline", minify:true }); Transpiled.set(inKey, transpile.code); return transpile.code; }; -const confDeno = await Deno.readTextFile(Deno.cwd()+"/deno.json"); -const pathImport = JSON.parse(confDeno).importMap; -const confImports = await Deno.readTextFile(pathImport); +let ImportString = ``; +let ImportObject = {}; +try +{ + const confDeno = await Deno.readTextFile(Deno.cwd()+"/deno.json"); + const confDenoParsed:{importMap?:string, imports?:string} = JSON.parse(confDeno); + if(confDenoParsed.importMap) + { + try + { + const confImports = await Deno.readTextFile(confDenoParsed.importMap); + try + { + ImportObject = JSON.parse(confImports); + ImportString = confImports; + } + catch(e) + { + console.log(`importMap "${confDenoParsed.importMap}" contains invalid JSON`); + } + } + catch(e) + { + console.log(`importMap "${confDenoParsed.importMap}" cannot be found`); + } + } + else if(confDenoParsed.imports) + { + ImportObject = {imports:confDenoParsed.imports}; + ImportString = JSON.stringify(ImportObject); + } +} +catch(e) +{ + console.log(`deno.json not found`); +} const Index = ` @@ -111,7 +80,7 @@ const Index = `
Loading
- +