UNPKG

@front-utils/mock-json-api

Version:

Bun mock server with Elysia and Lowdb

2 lines (1 loc) 4.86 kB
import{JSONFilePreset as A}from"lowdb/node";var M="./public/database/database.json",E=(e)=>{return{get:(t)=>{return e.data[t]},getAll:()=>{return e.data},set:async(t,r)=>{await e.update((a)=>a[t]=r)},delete:async(t)=>{await e.update((r)=>delete r[t])},push:async(t,r)=>{await e.update((a)=>{if(Array.isArray(a[t]))a[t].push(r)})},replace:async(t)=>{e.data=t,await e.write()}}},m=async({pathToDb:e=M})=>{let r=await A(e,{config:{}});return E(r)};var g=()=>{let e=new Map;return{get:(t)=>e.get(t),register:(t,r)=>e.set(t,r),remove:(t)=>e.delete(t)}};var c=()=>{let{format:e}=new Intl.DateTimeFormat("ru-RU",{timeStyle:"medium",dateStyle:"short"});return`${e(new Date)}`},l={info:(...e)=>console.log("\x1B[7m",`[info: ${c()}] `,...e),error:(...e)=>{console.log("\x1B[31m","------!!!!!!------"),console.log("\x1B[31m",`[error: ${c()}] `,...e),console.log("\x1B[31m","------!!!!!!------")},warn:(...e)=>console.log("\x1B[33m",`[warn: ${c()}] `,...e),system:(...e)=>console.log("\x1B[36m",`[system: ${c()}] `,...e)};import{Elysia as P}from"elysia";import{Elysia as R}from"elysia";import{bearer as F}from"@elysiajs/bearer";import{cors as T}from"@elysiajs/cors";import{compression as L}from"@chneau/elysia-compression";var x=new R().use(F()).use(T()).use(L());import{Elysia as f,t as i}from"elysia";import{html as $}from"@elysiajs/html";import{existsSync as N}from"fs";import{Html as o}from"@elysiajs/html";import{Html as s}from"@elysiajs/html";var p=(e)=>{return s.createElement(s.Fragment,null,"<!doctype html>",s.createElement("html",{lang:"ru"},s.createElement("head",null,s.createElement("meta",{charset:"UTF-8"}),s.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),s.createElement("title",null,e.title||"Mock server!"),s.createElement("link",{rel:"stylesheet",href:"/static/ui/layout/styles.css"}),e.head),s.createElement("body",{id:"app"},s.createElement("header",null,s.createElement("nav",null,s.createElement("a",{href:"/ui/editor"},"DB Editor"))),e.children)))};var h=()=>{return o.createElement(p,{title:"Database Editor",head:o.createElement(o.Fragment,null,o.createElement("link",{rel:"stylesheet",href:"/static/ui/db_viewer/styles.css"}),o.createElement("link",{href:"https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.10.4/jsoneditor.min.css",rel:"stylesheet",type:"text/css"}),o.createElement("script",{defer:!0,src:"https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.10.4/jsoneditor.min.js"}),o.createElement("script",{defer:!0,src:"https://bgrins.github.io/filereader.js/filereader.js"}),o.createElement("script",{defer:!0,src:"https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2014-11-29/FileSaver.min.js"}),o.createElement("script",{defer:!0,src:"/static/ui/db_viewer/DbViewerWC.js"}))},o.createElement(o.Fragment,null,o.createElement("main",{class:"content"},o.createElement("h1",null,"Database Editor"),o.createElement("db-editor",null))))};import{Html as u}from"@elysiajs/html";var v=()=>{return u.createElement(p,{title:"404"},u.createElement("main",{style:{justifyContent:"center"}},u.createElement("h1",null,"404"),u.createElement("p",null,"Page Not Found \uD83D\uDE31")))};var y=i.Object({key:i.String(),value:i.Any()}),C=i.Pick(y,["key"]),S=(e,t)=>{if(!N(e))return t(404,"File not found");return Bun.file(e)},O=(e)=>{return new f({prefix:"db"}).get("/",({query:t,error:r})=>{if(!t.key)return r(204);return e.get("db")?.get(t.key)??r(204)},{query:C}).put("/",({body:t})=>{e.get("db")?.set(t.key,t.value)},{body:y}).delete("/",({query:t})=>{e.get("db")?.delete(t.key)},{query:C}).put("/push",({body:t})=>{e.get("db")?.push(t.key,t.value)},{body:y}).put("/replace",({body:t,error:r})=>{try{let a=JSON.parse(t);e.get("db")?.replace(a)}catch(a){return r(500)}},{body:i.String()}).get("/get",()=>{return e.get("db").getAll()})},_=(e)=>{return new f({prefix:"static"}).get("/*",({params:t,error:r})=>S(`public/${t["*"]}`,r)).get("/ui/*",({params:t,error:r})=>S(`src/ui/${t["*"]}`,r))},U=(e)=>{return new f({prefix:"ui"}).use($()).get("/editor",({html:t})=>{return t(h())}).all("/*",({html:t})=>{return t(v())})},j=(e)=>{return new f({name:"routes"}).use(O(e)).use(_(e)).use(U(e))};var d=({port:e=8000,...t}={},r)=>{let a={di:r},D=new P(t).decorate(a).use(x).use(j(r)).onError(({code:n,request:b,error:w})=>{if(n==="NOT_FOUND")return r.get("logger").error("[NOT FOUND] \uD83D\uDE14",n,b.url),{code:404,message:"Route not found :("};return r.get("logger").error("[ERROR] \uD83D\uDE31",n,b.url),new Response(w.toString())}).onRequest(({request:n})=>{r.get("logger").info(`[REQUEST]: ${n.method} ${n.url}`)}).listen(e);return r.get("logger").system(`\uD83E\uDD8A Mock server is running at http://${D.server?.hostname}:${D.server?.port}`),D};var k=async({pathToDb:e,...t}={})=>{let r=g(),a=await m({pathToDb:e});return r.register("db",a),r.register("logger",l),d(t,r)};export{k as startApp,d as createServer};