[HN Gopher] Pushup: a new compiler for making web apps in Go ___________________________________________________________________ Pushup: a new compiler for making web apps in Go Author : todsacerdoti Score : 152 points Date : 2023-01-04 15:49 UTC (7 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | shadowgovt wrote: | This looks neat. | | Always be wary of this on a new web framework: | | > Pushup is an experiment. In terms of the development life | cycle, it should be considered preview pre-release software | | The biggest risk with such software as a web framework is | security exploits. The nuances of the HTML escaping dance are | subtle and hard to get right. | | (Not to say this gets them wrong or can't get them right, only | that all such code should be assumed-risky for security until | proven otherwise). | jakelazaroff wrote: | This looks really promising -- at first blush, I like this a lot | more than normal Go templating! That said: maybe it's just my | bias as someone who primarily works with React, but I'm wondering | why not just mimic JSX, which has been incredibly successful and | has millions of people who already understand it. | | The big missing piece to me here is composability. How can I | encapsulate reusable bits of markup, styles and presentational | logic? In most JS frameworks, I'd extract them into a "component" | (in React, that just means a function that returns JSX). Pushup | has "partials," but it's not clear to me whether they're reusable | or if that word means something different in Pushup than it does | in other templating systems. I see that layouts can denote | sections to be filled in by pages, but IMO that's backwards -- a | page now needs to know details about its "call site". | | Using ^ as a delimiter seems odd, but I suppose that's just a | familiarity thing. I do wonder though how you handle your example | of <p>The time is now ^time.Now().String().</p> | | without having to backtrack, since that last period is ambiguous | in this grammar. | HALtheWise wrote: | I actually hacked together "JSX in go" over a few weeks a | couple years ago, targeting wasm/GopherJS so the code could | actually execute in the frontend. It was a really fun exercise | in reading/understanding the internals of the go compiler. | | https://github.com/8byt/gox | paulsmith wrote: | > why not just mimic JSX | | Definitely considered that. Might be worth revisiting. | | > The big missing piece to me here is composability | | You zeroed in on the right things ;^) I have a draft note to | myself about pages-as-components. I have some ideas (basically, | mimic ASP.net Razor components at the moment). Having a | compiler with full control of the page makes this easier to | figure out. | | > without having to backtrack, since that last period is | ambiguous in this grammar. | | It doesn't backtrack, it just looksahead at the next token: | https://github.com/adhocteam/pushup/blob/main/main.go#L3692 | euroderf wrote: | Looks cool! Two questions: | | What does a Treeview look like - in a ".up" file, can I walk a | tree (like io.fs.FS) ? | | Can I compile a Pushup app into a giant WASM hairball and run the | whole thing in the browser ? | eddwinpaz wrote: | Some PHP fan trying to bring their deception to go. | paulsmith wrote: | Pushup creator here. We're interested in feedback on the design. | Pushup introduces a new lightweight template syntax that mixes Go | code and HTML in the same page; pages are then compiled down to | pure Go, relying on the net/http package. Pushup uses file-based | routing, so adding a page adds a route to your app. The template | language has an "inline partials" feature to make it easier | support for modern hypermedia libraries like htmx in mind. Would | love to know what the Go web development community thinks. | | Here is a short demo of Pushup in action: | https://www.youtube.com/watch?v=nkyiATkZ4Js | iamgopal wrote: | Also try to give usable web app ( todo ? ) hostel somewhere if | possible. | paulsmith wrote: | Yes, we need to do that - I'll populate them here eventually | https://pushup.adhoc.dev/docs/guides | mholt wrote: | Hey cool! | | Caddy plugin? :D I might be quite interested in this. | paulsmith wrote: | We talked about exactly that! Yes, let's | jerf wrote: | "Pushup uses file-based routing, so adding a page adds a route | to your app." | | Make sure to have a clean way of escaping that and having some | richer concept of how to route. This was the original way | routing worked, back in the ASP (not ASP.net, the predecessor), | CGI, original PHP days. We moved away from it for good reasons. | It works well early but has scaling problems over time. | | I'm not saying don't have it as a default per se... just make | sure you have a "if you need to do something else here's how to | override it". | | I also strongly advise against trying to guess what the | overrides might be and building special cases for "the three | things I think people may need to do beyond thsi". I've got a | router in my system that looks at client-side TLS certificates | if it comes from certain IPs and uses LDAP authentication if it | comes from certain other IPs, and does different things if the | auth fails for each case. You'll never be able to guess all the | possible ways people want to route. You need to make sure you | don't lock the users into this so hard they can't escape except | by leaving your framework entirely. | | Edit: Also, I didn't look into this deeply, but if you throw | away the ability to have middleware on specific routes you've | really caused a big problem. The Go ecosystem is fairly | dependent on that. | paulsmith wrote: | > If you throw away the ability to have middleware on | specific routes you've really caused a big problem. The Go | ecosystem is fairly dependent on that. | | Agreed! Pushup pages compile down to structs that implement | http.ServeHTTP. And an entire Pushup app is just a | http.ServeMux too. So it should be trivial to insert | middleware (although there isn't Pushup syntax for that yet), | and/or embed a Pushup app in a larger Go app (this is quite | possible today). | robertlagrant wrote: | I have the same instinct (JSP / JSF had the same concept) but | I must say, making pages as files in next.js is really nice. | You can have all your dynamism within them, but having a | simple way to do overall routing is lovely. | jerf wrote: | It is nice. It is easy. There's a reason we started there. | | Then, suddenly after a certain amount of scaling, it isn't. | And it's not like that's an impossible situation either, | but you end up with all the consequences of building a | framework to do X and then having to build an inner | platform[1] to do some other Y inside of X instead. | | [1]: A technical term: https://en.wikipedia.org/wiki/Inner- | platform_effect | robertlagrant wrote: | Sure. It's a tradeoff either way - ergonomics for common | cases or not. I imagine in your case you're constructing | lots of custom logic anyway, whether it's in an API | gateway (or similar) component to put the auth logic | before the application, or put the logic in some | before_request handler in the web application. | leerob wrote: | Curious if you're explored the new `app` directory | (beta), which includes a new routing system in Next.js? | Open to feedback: | https://beta.nextjs.org/docs/routing/fundamentals | mijamo wrote: | Next.js routing limits have been for me the number one | reason not to use it unfortunately. | leerob wrote: | Can you share more? With Middleware, you can run any | arbitrary code to control routing: | https://twitter.com/nextjs/status/1610663442825854980. | And with the `app` directory (beta), we're reimagining | the Next.js routing system from the ground up: | https://beta.nextjs.org/docs/routing/fundamentals. | techpression wrote: | Not the author but for me it's insane that the router | doesn't do http routing on verbs but rather leave it to | be repeatedly reimplemented in every single page (and the | fact that you can't do simple things like what's been | available in rails for over a decade with resources). | TylerE wrote: | At the day gig (old school in house python framework) we used | file based routing. | | Works great. The few times we need to get fancy mod_rewrite | is pretty easy. | | The lack of ceremony is refreshing. | savolai wrote: | I'm Finnish. The caret is not always easy to type in my | experience on international keyboards. Not sure what the added | value is of creating yet another convention here, as there are | so many already with each new templating language. | paulsmith wrote: | That's good feedback, thank you. My US-centric eye didn't | consider that. | derkoe wrote: | Oh yes it's pretty hard to type on a German keyboard as well. | In most editors you will need two keystrokes. | fileeditview wrote: | For German devs it makes sense to use a no dead keys | keyboard layout IMHO. You rarely need the accents anyways | and it saves a lot of time when coding. I made the switch a | long time ago and don't regret it. For the occasional word | like "Expose", I just leave off the accent and that's that. | fulafel wrote: | But don't you need 4 keystrokes for the common alternative, | {} enclosed template expressions? Same as french, nordic, | and probably lots of other european intl layouts. | | (Or even better against the {{ }} ones requiring 6) | kej wrote: | I spent a lot of time in C# and ASP.Net, and I was struck by | how closely this resembled Razor syntax, but with ^ instead | of @. Switching to @ would make it slightly more familiar to | that cohort, and it might even be possible to build on some | Razor-parsing code for editor plugins or whatever. | paulsmith wrote: | I was inspired in part by Razor, although I'm not a | C#/ASP.net developer. I just liked the way it looked and | worked from examples I saw. | | I actually started with @ [1] but changed to ^ for 2 | reasons: having to escape for email addresses (although in | retrospect maybe it's not such a problem), and the | admittedly cheeky ^ being the "up" in "Pushup" :^) | | [1] https://github.com/adhocteam/pushup/commit/04aa00bb5401 | bc93b... | euroderf wrote: | OTOH I have an actual Finnish keyboard and caret is simply | Shift-umlaut (the key has a caret over a pair of dots). | tuetuopay wrote: | same in french. it's a dead key on our keyboard, so it's | basically two keystrokes instead of one to type it. | | to be fair most special characters are behind AltGr on | azerty, soooo... | kgeist wrote: | Interestingly, there's no such problem on Cyrillic | keyboards despite being a totally different alphabet. We | only need to switch the current layout to English which is | what we do all the time anyway. | Semaphor wrote: | Not despite, because. You need to switch to type in any | other alphabet, so you switch to English. German, French | keyboards work perfectly well for English, it's just that | the symbols are not as easy to reach. | | Personally, I use and love EurKEY [0] as I rarely type in | German anyway and rather optimize for coding. | | [0]: https://eurkey.steffen.bruentjen.eu/ | playingalong wrote: | Admittedly ^ on a US keyboard also involves two keys. | digitalsankhara wrote: | This looks really good. I like the compilation to a single | binary. I'm already using Htmx with Flask for | routing/templating. File based routing with a page as the unit | of functionality sit well with me. | | The use of caret to denote Go code is quite clean, but given | well formed HTML, could the parser detect anything not inside | HTML tags as Go code and thus remove the need for a caret | outside of HTML. | | I will be trying this out. Thanks for this project. | fprog wrote: | Love this idea. And I've been looking for something exactly | like Pushup. Really excited to try it out. | KRAKRISMOTT wrote: | Do you have any hosted demos? | paulsmith wrote: | The main project site is a Pushup app: | https://pushup.adhoc.dev (look in the `docs` directory in the | repo for the source code for the site) | | There is a small demo of the inline partials feature here | (click on the "view the Pushup source for this page" link at | the bottom): https://pushup-htmx-template- | fragments.fly.dev/demo | oppositelock wrote: | This is very neat, but you are delving into a very complex | world, as you are well aware. In your video, you have generated | static server side pages, without any JS, where your annotated | HTML uses the embedded go to generate static HTML. | | This is much nicer syntactically than using the Go | html/template engine, but it seems roughly equivalent in | expressive power. Are you converting your "up" syntax into go | templates with the Go expressions extracted into compiled Go | code, referenced be the templates, out of curiosity? If so, the | way you've transparently handled interleaving (such as html | elements in the for loop) is really cool. | | How would your go scripting interact with JS? For example, say | that I have a backend API that the fronted calls into. In your | design, would I call out into Go to perform the http request, | or would I do this in JS? I'm sure both would work - since the | Go request would be handled server side and simply slow down | static page generation, but it seems like calling into Go might | not be the right thing to do for a more responsive AJAX app. Do | you envision mixing Up/JS in the same pages? Can I do crazy | stuff like use JS to insert a variable (by value probably) into | your Go code, or vice versa? | | Over the years, I've learned that web front ends are positively | bonkers in the kinds of things they want to do, and when you | are the developer of any kind of frameworks, you end up | suffering greatly if you insert yourself into middle of that | ecosystem, since you will be asked to support features that you | never dreamed of. If you support them, the framework gets more | use, if you don't, the cool kids move onto other things. | | I've tried to tackle a much simpler problem with a project of | my own [1], which is a backend server code generator to make | implementing JSON models more easily from an OpenAPI spec, and | I've found that even in this relatively simple concept, the | limitations of a strictly, statically typed language like Go | end up running into incredible complexity due to the dynamic | nature of web frontends and JSON. Outside of trivial strings | and numbers, you start running into the limits of the Go typing | system. | | Anyhow, good luck, this is very cool and it seems like a fun | thing to play with. | | 1: https://github.com/deepmap/oapi-codegen | techn00 wrote: | Copying React's JSX would be sooo cool (like Rust's | https://dioxuslabs.com/ ), or something like phoenix liveview for | elixir. | | I don't like the "^" | Eun wrote: | Nice seeing going this forward. I built something similar in the | past, that can be used as a base for such framework utilizing | yaegi (from the creators of traefik): | https://github.com/Eun/yaegi-template | denysvitali wrote: | So basically PHP, but in Go? I love Go, but I honestly hope this | doesn't become as widespread as PHP. There is a reason why we | switched away from template-based frontends (a la PHP). | | On the other side, it's also true that some frontend frameworks | are partially moving back to SSR... | shadowgovt wrote: | One counterpoint is React is doing gangbusters right now and | uses the JSX syntax extension to embed HTML directly into | JavaScript or TypeScript. | | To my money, the main issues with PHP had little to do with | template embedding and everything to do with Perl being a messy | language for writing correct code (coupled with too many people | in the era underestimating the importance of "correctness" for | HTML rendering when the ability for a malicious operator to | mutate HTML on a page can result in all manner of security | exploits). Perl just has too many ways to write accepted | almost-correct code that breaks abstraction / fails to string- | escape in subtle and whole-farm-losing ways. | kennywinker wrote: | Are you equating PHP and Perl? If so, that's incorrect - the | relationship between the two is just one of influence, PHP | has some influences from Perl (but also tons from C, C++, and | Java). | shadowgovt wrote: | To be fair, you haven't exactly augmented the single- | element list [Perl] with a host of languages that I'd | consider _improvements_ on writing correct code. ;) | | Java, yes, mostly. | hiccuphippo wrote: | There's a difference though. JSX embeds html into strings | while the way Php intermingles html and code uses global | buffers. That makes composition more complicated since you | have to deal with nested buffers, flushing, cleaning, etc. I | really prefer the way JSX does it over Php's. | kevinfiol wrote: | > There is a reason why we switched away from template-based | frontends (a la PHP). | | Can you elaborate on that reason? Genuine question. As you | mentioned in your post, a lot of what newer web frameworks are | doing (SvelteKit, Astro, Enhance.dev, etc.) are reminding me a | lot of my early days with PHP. The benefits of SSR are widely | acknowledged amongst the proper JS frameworks. | denysvitali wrote: | Frontends became more interactive, and as such, you can't | really template that interactivity / reactivity away. Hardly | anyone uses Vanilla JS nowadays, and thus, hardly anyone can | create a template-based website for today's standards. This | is just my opinion though, happy to be proven wrong :) | paulsmith wrote: | > So basically PHP, but in Go? | | You say that like it's a bad thing ;^) | rad_gruchalski wrote: | Then why not <?go ... ?> instead of the random ^ soup? | paulsmith wrote: | Why is that better? | sunbum wrote: | Internationalization, not every keyboard has ^ easily | accessible. | nablaone wrote: | Looks like other SSRs. FEDs will thank you. | | In real word HTML template are 90% DIVs, 10% generated | content. | dakiol wrote: | > There is a reason why we switched away from template-based | frontends (a la PHP) | | Who is "we"? There are more websites out there written using | template-based frontends (mostly PHP) than the other way | around. | TobyTheDog123 wrote: | This looks great for simple projects, but I'm curious who is | working on projects small enough to not be worth a separate | dedicated and feature-filled frontend (ala JS/Flutter), but large | enough to warrant server-side logic. | | That's certainly not to say they don't exist, and Pushup is | certainly filling a niche, but my mind immediately goes to those | "forgotten" services like email unsubscription and confirmation | links. | paulsmith wrote: | Yep, or admins or settings apps, for example. Pushup is partly | designed to support the "mildly dynamic" site | https://www.devever.net/~hl/mildlydynamic | fredrikholm wrote: | Bravo! This makes me genuinely happy. | | A sane, compiled template language for Go, integrated with a | framework that pushes for HATEOAS via HTMX hits every row and | column in my dream-webs-tack-bingo-card. | | Looking forward to digging into this during the weekend. | synergy20 wrote: | I like this project to succeed but I can hardly like the ^ for | template, please make it similar to PHP|django etc if possible. | TobyTheDog123 wrote: | There's an interesting conversation to be had about developer | ergonomics. For me, on a Mac, it's far more easier to use | characters and symbols on the bottom of the keyboard. | | <script></script>. | | It's even easy to use a select few symbols from the number row. | | !, @, #, $ uses my left pinky on the left shift, left hand middle | (or index) finger on the number | | &, *, (, and ) use my left pinky on the left shift, right hand | finger on the number. | | ^ (and % + & to an extent) seem to be a no-mans land, similar to | smart phone screens only allowing limited easy reach. | | If you're going to be typing a symbol character to mark a | variable (or whatever else) it certainly needs to be easy to | reach, and for me at least, the ^ isn't. | | Maybe it's just my typing style or that I have small fingers :( | | Edit: Also, what about IDE plugins? I would hate to lose type | safety or smart suggestions for a line like this: | | <p>The time is now ^time.Now().String().</p> | kroltan wrote: | Also, some keyboard layouts use dead keys for inputting ^ as a | diacritic (for example, ABNT2 Portuguese, the standard in | Brazil). | | This means that to type "a" I press the ^ key, which is | actually Shift+~, then I press the letter to go under it, in | this case, "a". If I want to type a standalone ^, I have to | either press Shift+~ twice, or follow the Shift+~ with an | invalid letter, such as "q" or space. | | So typing a lot of code that uses ^ is _very_ annoying. For | example, to type "^section" you have to do: Shift+~, Space, | S... | | Additionally, and this is purely Apple's fault for being | entirely deranged, on Macs you have to watch out even further, | as it is possible to write both ^ and ^, depending on what you | press. Shift+~ then space prints the lone diacritic, while | Shift+~ then right arrow prints the ASCII ^ you've seen so far. | Obviously, having to reach for the arrow keys for a common | occurrence when typing is incredibly inconvenient, on top of | the inconvenience described previously. | andreygrehov wrote: | When it comes to traditional web frameworks, the most important | part is handling regular HTML forms. Reason being, a form is the | only native mechanism your customers have to use to interact with | your service. Forms are important. Specifically, validation and | error handling. I think Laravel does it really well. It's been a | while, but Laravel has a wrapper around HTML forms. This wrapper | does everything you need: server-side form validation, form | generation, flexible error handling that takes care of client | error messages, placeholders, input values, css classes for | invalid states, you name it. | | Does Pushup help engineers with HTML forms? | dakiol wrote: | As others have commented, just go for <?go ... ?> instead of the | caret. You'll get thousands of users in an instant. | Gys wrote: | Very interesting! Kind of react, but in Go. Fingers crossed for | 'Pushup Native' for mobile ;-) | teejays wrote: | It's a nice idea. I'm going to dig a little deeper in the design | and developer experience choices. | | That being said, I am a little curious -- what is the intended | use case here? The reason I am asking is because I've been doing | lots of web-development, with Go as a primary backend lang, for | the last 9 years but never have I seriously felt the need to do | serve the UI from Go. I guess there is some advantage reducing n | (number of tools/languages in a stack) - but is there any other | motivation behind it? | paulsmith wrote: | The imagined use-case for Pushup is the same niche that Rails, | Django, and Flask apps occupy, which is a wide range but | broadly I would describe as page-oriented, HTML-first, server- | side frontends. | | I started Pushup because I asked myself, I like programming in | Go and think (like you) it's great for web backends - but what | is holding it back from being a great full-stack web dev | language or environment? net/http is a great building block, | and html/template is solid, but I felt more was needed. Like | opinionated project directory structure, for one. But also the | world has changed since 2006 when Rails and Django debuted. | | Obviously, we live in a world in which React and the SPA is | seemingly dominant, but projects like htmx have recently shown | that you can achieve modern UI/UX in the browser on a server- | side app, which less JavaScript. BTW, more and more JavaScript | frameworks, like Remix, are (re-)discovering the value of SSR. | | I was also motivated to give an old-school mod_php feel of, | just add a file and you automatically get a URL route. That's a | nice developer experience but also good for long-term project | maintenance. | | Finally I was struck by this essay[1] about the demise of the | "mildly dynamic" site. There is a wide diversity of types of | sites and apps, from quick experiments and prototypes, small- | to-medium sites of many kinds. But also since it's Go, I think | it could scale up on performance to large-scale sites, and as a | static binary, be nicely suited to edge apps like fly.io. | | [1] https://www.devever.net/~hl/mildlydynamic | mxuribe wrote: | First off @paulsmith, thanks for creating Pushup! I've been | meaning to learn Go, and in particular in web context...and | I've always been a fan of the "mildly dynamic" approach to | web sites, web apps. So, I will certainly dive in. Secondly, | thank you for sharing that article that inspired you. I kept | nodding along so much while reading that article, it was like | i was a bobblehead! I don't code much over the last decade or | more, but when i do (for web anyway), i almost always employ | php in the "mildly dynamic" method...Because its easy and | solves needs that come up. Thanks again!! | warrentr wrote: | Really great explanation, thanks. I've definitely felt a bit | silly spinning up an entire react project for a "mildly | dynamic" site | kcartlidge wrote: | I have to be honest, I don't like the aesthetics. I know | that's a trivial point, but if you're working in something | for a living it matters. The suggestions elsewhere of using | "<?go ?>" or similar look better to my eyes. I'd also be | concerned that by the time there are enough features in it to | support more complex sites, the learning curve will be enough | that you may as well use Go directly. I could easily be wrong | about that, and I know others will see value, so YMMV as we | say. | | That isn't to say I have any negative comment about your | project on its own terms and merits, just that it isn't for | me. | | However I do thank you for the link to the "mildly dynamic" | page. In addition to Go I also do C#, Node, Python, and | others. Those others include PHP (on and off since PHP 3). | For serious stuff I'm usually managed (or persuaded) into | using anything other than PHP, but on the odd times I do use | it the feeling is quite different from the rest and hard to | explain. It feels like that linked page comes closest to | explaining it for me, so cheers! | whage wrote: | This really seems like php. I also think that mixing UI with | logic is a recipe for disaster and there is already php (and | several others?) for that. I suppose the creators of such a thing | have a decent knowledge of compilers and related domains, | knowledge which really seems wasted on a project like this. | [deleted] | IceWreck wrote: | These programmers were so preoccupied with whether or not they | could, they didn't stop to think if they should. That abomination | of a markup cum programming langauge is so ugly. | | Seriously tho, cool project but ugly syntax. | paulsmith wrote: | Do you think all template languages that combine logic and | markup are ugly? Or just Pushup's? | robertlagrant wrote: | I like that Flask has Jinja2, which has a simple template | language in it, but doesn't let you run arbitrary Python. | thefounder wrote: | I don't like it. It looks like early php. This doesnt mean it is | bad. | | I'm working on a web framework as well based on wasm in the | browser. It's perfect except it's not really usuable/production | ready due to high memory consumption of the go->wasm | implementation. My hope is that one day there will be support for | GC in wasm and somehow the issue will go away. | aatd86 wrote: | Interesting! Do you have a link? | paulsmith wrote: | Since Pushup is a compiler, one thought I've had is giving the | ability to demarcate server-side and client-side code in a | Pushup page, and compiling down to WASM for the client-side | code. Then the compiler would generate the network code to do | the hand-offs. | cube2222 wrote: | Have you looked into using TinyGo[0]? It's a Go-for-embedded | compiler and can compile Go to WASM as well. | | It's supposed to result in much smaller artifacts. | | [0]: https://tinygo.org/docs/guides/webassembly/ | thefounder wrote: | I'm using a lot of reflection and I believe tinygo has had | some issues with the reflect package. | | I'm not really ready to dig into Tinygo issues. I've spent a | lot of time dealing with Go's own reflect issue(i.e [0]) in | its default implementation. | | https://github.com/golang/go/issues/15924 | TachyonicBytes wrote: | TinyGo does indeed have problems with the reflect package, | as well as many others, one which I've managed to help with | [1]. The developers have been very helpful, but the reflect | package is still a big missing piece. | | Your framework sounds interesting. Do you develop it in the | open? | | [1] https://github.com/tinygo-org/tinygo/issues/3274 | TobyTheDog123 wrote: | In my experience, TinyGo is far from ready for prime time, | mainly because of its lack of support for JSON | marshaling/unmarshaling. | | I run Go code in Cloudflare Workers, and just use the | regular-ol' WASM targets (GOOS=js/GOARCH=wasm) | oefrha wrote: | Huh, CF Workers used to limit the payload to 1MB, and any | slightly nontrivial golang js/wasm artifact (not tinygo) | I've ever built was >2MB compressed, so the idea of running | those on CF Workers was dead on arrival. However, | apparently the limit was raised to 5MB for paid plans some | time last year. | nprateem wrote: | TBH all I want are Django's generic views implemented in Go to | make it easy to map routes to DB resources to speed up making | APIs. | | Ideally it would automagically expose a whitelisted list of DB | tables as API endpoints but allow the ability to override queries | for each table and perform logic as necessary (i.e. support | custom handlers as well as lightweight default ones). | | If anyone knows of anything like that please let me know. | Xeoncross wrote: | sqlc.dev plus gongular and you have a quick REST api | | sqlc.dev plus gql-gen and you have a quick GraphQL server | | sqlc.dev plus goa.design and you have a full-featured REST + | gRPC server with OpenAPI for easy client generation | | No need to write model code and validation for inputs/outputs. | Just define your SQL queries and your request objects (or | typedefs for GraphQL) and then let these tools generate | everything else. | lprd wrote: | You've piqued my interest. Do you know of any OSS repos that | implement any of these? ___________________________________________________________________ (page generated 2023-01-04 23:00 UTC)