Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Minima

Minima

Minima 🦄 is a reliable and lightweight framework for Go to carve the web 💻. Developed with core net/http🔌and other native packages, and with 0 dependencies

⚙️ Setup

Please make sure you have Go version 1.15 or higher

mkdir<project-name>&&cd<project-name>gomodinitgithub.com/<user-name>/<repo-name>gogetgithub.com/gominima/minimagorunmain.go

🦄 Quickstart

package main
import"github.com/gominima/minima"funcmain() {
app:=minima.New()
app.Get("/", func(res*minima.Response, req*minima.Request) {
res.OK().Send("Hello World")
})
app.Listen(":3000")
}

🔮 Features

  • Reliable - great modular API for building great server side applications
  • Compatible with net/http - use your plain old middlewares written in plain old net/http
  • Lightweight - clocked in ~1000 loc
  • No Dependency - just your plain old go standard libraries
  • Great Documentation - best in class precise documentation
  • Auto Docs - docgen for generating all of your routing docs from jsdoc like comments to json or markdown files

❓ Why Minima

Minima's name is inspired by the word minimal and is the motivation for building this framework. As a Golang developer, I was struggling to learn it in my early days due to the steeper learning curve while using net/http.

Also while checking out some other alternate frameworks, I found out that something like fiber wasn't compatible with net/http modules like gqlgen and other middlewares.

Minima solves this problem as it has a very narrow learning curve as well as a robust structure that supports all net/http modules and other middlewares without compromising performance.

🍵 Examples

Here are some basic examples related to routing and params:

📑 Routing & Router

funcUserGetRouter() *minima.Router {
// router instance which would be used by the main routerrouter:=minima.NewRouter()
returnrouter.Get("/user/:id", func(res*minima.Response, req*minima.Request) {
// getting the id parameter from routeid:=req.Param("id")
// instead of adding a param in route, you just need to fetch itusername:=req.Query("name")
// get user from databaseuserdata, err:=db.FindUser(id, username)
iferr!=nil {
// check for errorsres.NotFound().Send("No user found with particular id")
}
// send user datares.OK().Json(userdata)
})
}
funcmain() {
// main minima instanceapp:=minima.New()
// UseRouter method takes minima.router as a param// it appends all the routes used in that specific router to the main instanceapp.UseRouter(UserGetRouter())
// running the app at port 3000app.Listen(":3000")
}

📑 Params

funcmain() {
app:=minima.New()
app.Get("/getuser/:id", func(res*minima.Response, req*minima.Request) {
userid:=req.Param("id")
// check if user id is availableifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
//Will print 20048 from router /getuser/200048
})
}

📑 Query Params

funcmain() {
app:=minima.New()
app.Get("/getuser", func(response*minima.Response, request*minima.Request) {
// query params work a bit differently// instead of adding a param in route, you just need to fetch ituserid:=req.Query("id")
ifuserid=="" {
res.Error(404, "No user found")
panic("No user id found in request")
}
fmt.Print(userid)
// the above will print 20048 from router /getuser?id=20048
})
}

📒 Minima Interface

Minima is based on a custom implementation of radix tree which makes it extremely performant. The router itself is fully compatible with net/http

🔖 Minima's Interface

typeMinimainterface {
// Minima interface is built over net/http so every middleware is compatible with it// initializes net/http server with addressListen(addressstring) error//static file serve methodsFile(pthstring, dirstring) //serves a single static file to routeStatic(pthstring, dirstring) //serves whole directory with specified pth ex /static/main.html// main handler interfaceServeHTTP(w http.ResponseWriter, q*http.Request)
// main router methodsGet(pathstring, handler...Handler) *minimaPatch(pathstring, handler...Handler) *minimaPost(pathstring, handler...Handler) *minimaPut(pathstring, handler...Handler) *minimaOptions(pathstring, handler...Handler) *minimaHead(pathstring, handler...Handler) *minimaDelete(pathstring, handler...Handler) *minima// takes middlewares as a param and adds them to routes// middlewares initializes before route handler is mountedUse(handlerHandler) *minima//Takes http.Handler and appends it to middleware chainUseRaw(handlerfunc(http.Handler) http.Handler) *minima// an custom handler when route is not matchedNotFound(handlerHandler)*minima// mounts routes to specific base pathMount(basePathstring, router*Router) *minima// takes minima.Router as param and adds the routes from router to main instanceUseRouter(router*Router) *minima// works as a config for minima, you can add multiple middlewares and routers at onceUseConfig(config*Config) *minima// shutdowns the net/http serverShutdown(ctx context.Context) error// prop methodsSetProp(keystring, valueinterface{}) *minimaGetProp(keystring) interface{}
}

🔖 Response and Request Interfaces

Both response and request interfaces of minima are written in net/http so you can use any of your old route middlewares in minima out of the box without any hassle.

typeResinterface {
// response interface is built over http.ResponseWriter for easy and better utility// Header methodsGetHeader(keystring) string// gets a header from response bodySetHeader(keystring, valuestring) *Response// sets a new header to response bodyDelHeader(keystring) *Response// Deletes a header from response bodyCloneHeaders() http.Header// clones all headers of the response bodySetlenght(lenstring) *Response// sets content length of the response bodySetBaseHeaders() *Response// sets a good stack of base headers for response bodyFlushHeaders() // flushes headers// utility functions for easier usageSend(contentstring) *Response//send contentWriteBytes(bytes []byte) error//writes bytes to the pageJSON(contentinterface{}) *Response//sends data in json formatXML(contentinterface{}, indentstring) //sends data in xml formatStream(contentType string readio.Reader) // streams content to the routeNoContent(codeint)
Error(statusint, strstring) *Response// this functions returns http.ResponseWriter instance which means you could use any of your alrady written middlewares in minima!Raw() http.ResponseWriter// renders an html file with data to the pageRender(pathstring, datainterface{}) *Response// custom method when there's an errorError(contentinterface{}) *Response// closes io.Writer connection from the routeCloseConn() *Response// redirects to given urlRedirect(urlstring) *Response// sets header statusStatus(codeint) *Response//cookie methodsSetCookie(cookie*http.Cookie) *Response// sets a new cookie to the responseSetCookie(cookie*http.Cookie) *Response// clears a cookie to the response
}
typeReqinterface {
// minima request interface is built on http.Request// returns param from route Param(namestring) string// sets a new param to the request instanceSetParam(keystring, value) string//returns query param from route urlQuery(keystring) string//returns query params to a stringQueryString() string//returns raw url.ValuesQueryParams() url.Values//returns the ip of the request originIP() string//returns whether the request is tls or notIsTLS() bool//returns whether the request is a socket or notIsSocket() bool//returns scheme type of request bodySchemeType() string//Gets form value from request body FormValue(keystring) string//Gets all the form param valuesFormParams() (url.Values, error)
//Gets file from request FormFile(keystring) (*multipart.FileHeader, error)
//Gets request Multipart formMultipartForm() (*multipart.Form, error)
// returns path url from the routePath() string// returns raw request bodyBody() map[string][]string// finds given key value from body and returns itBodyValue(keystring) []string// returns instance of minima.IncomingHeader for incoming header requestsHeader() *IncomingHeader// returns route method ex.get,postMethod() string// Header methodsSetHeader(keystring, valuestring) *Response//sets a new header to request body//Get a header from request bodyGetHeader(keystring) string//Cookie methodsCookies() []*http.Cookie// gets all cookies from request bodyGetCookie(keystring) *http.Cookie// gets a specific cookie from request body
}

🔌 Middlewares

Minima's middlewares are written in its own custom res and req interfaces in accordance with the standard libraries maintained by Go. You can use res.Raw() to get the http.ResponseWriter instance and req.Raw() to getthe http.Request instance, meaning all community written middlewares are compatible with Minima.

Minima also takes http.Handler while using .UseRaw function and runs it in a chain.

Here is an example of standard net/http middleware being used with minima:

funcMyMiddleWare(res*minima.Response, req*minima.Request) {
w:=res.Raw() // raw http.ResponseWriter instancer:=req.Raw() // raw http.Request instance// your normal net/http middlewarew.Write([]byte(r.URL.Path))
}
app.UseRaw(HttpHandler())

💫 Contributing

If you wanna help grow this project or say a thank you!

  1. Give minima a GitHub star
  2. Fork Minima and Contribute
  3. Write a review or blog on Minima
  4. Join our Discord community

Contributors

Lead Maintainers

Core Team

Community Contributors

Thanks to all the contributors, without whom this project would not have been possible:


Be a part of this contribution list by contributing today!

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

🧾 License

Copyright (c) 2021-present Apoorv and Contributors. Minima is a Free and Open Source Software licensed under MIT License



About

A simple and minimal backend framework for go made to scale

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages